@ManyToOne JPA关联和级联...不确定如果我删除一个对象会发生什么

got*_*ch4 7 java hibernate jpa associations

我还不太清楚cascade在删除操作中的工作方式.我想知道如果我有这个会发生什么:

class myBean{

    @ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
        public Cliente getClienteDiAppartenenza() {
            return clienteDiAppartenenza;
        }

}


class Cliente{
@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.LAZY)
    public List<myBean> getMyBeans() {
        return myBeans;
    }
}
Run Code Online (Sandbox Code Playgroud)

如果我用这个属性删除myBean,我不确定链接的Cliente是否也会被删除(很多人都很奇怪)或Cliente中的集合将被更新,myBean的实例被删除,然后保存.

会发生什么??Hibernato的文档对此并不十分清楚......

Edw*_*rzo 19

这不是Hibernate的东西,这是JPA 2.0标准的一部分.注释中有两个方面,一个是使用orphanRemoval.

当父实体控制子实体的创建和销毁时,可以使用orphanRemoval.在UML中,这将是一个组合的案例,它是一个强大的所有权和整体的部分的一致寿命.第2.9节:实体关系中的JPA 2.0规范说:

指定为OneToOne或OneToMany的关联支持使用orphanRemoval选项.当orphanRemoval生效时,以下行为适用:

  1. 如果从关系中删除作为关系目标的实体(通过将关系设置为null或从关系集合中删除实体),则删除操作将应用于要孤立的实体.在刷新操作时应用移除操作.orphanRemoval功能适用于由其父实体私有"拥有"的实体.否则,便携式应用程序必须不依赖于特定的删除顺序,并且不得将已经孤立的实体重新分配给另一个关系或以其他方式尝试保留它.如果孤立的实体是分离的,新的或已删除的实体,则orphanRemoval的语义不适用.

  2. 如果将删除操作应用于托管源实体,则删除操作将根据第3.2.3节的规则级联到关系目标(因此没有必要为关系指定cascade = REMOVE)[ 20.

第二个方面是当没有隐含orphanRemoval时使用cascase = REMOVE.

3.2.3:删除部分包含有关删除过程的详细信息:

应用于实体X的remove操作的语义如下:

•如果X是新实体,则remove操作会忽略它.但是,如果从X到这些其他实体的关系使用cascade = REMOVE或cascade = ALL annotation元素值进行注释,则删除操作会级联到X引用的实体.

•如果X是托管实体,则删除操作会导致其被删除.如果从X到这些其他实体的关系使用cascade = REMOVE或cascade = ALL注释元素值进行注释,则删除操作将级联到由X引用的实体.

•如果X是分离的实体,则remove操作将抛出IllegalArgumentException(或者事务提交将失败).

•如果X是已删除的实体,则删除操作将忽略它.

删除的实体X将在事务提交时或之前或作为刷新操作的结果从数据库中删除.删除实体后,其状态(生成状态除外)将是调用remove操作的实体的状态.