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

时间:2011-05-31 15:29:40

标签: 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;
    }
}

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

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

2 个答案:

答案 0 :(得分:15)

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

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

  

指定为的关联   OneToOne或OneToMany支持使用   orphanRemoval选项。该   以下行为适用于   orphanRemoval生效:

     
      
  1. 如果从中删除了作为关系目标的实体   关系(通过设置   关系为null或删除   来自关系的实体   集合),删除操作将   适用于实体   而成为孤儿。删除操作是   在冲洗时应用   操作。孤儿撤消   功能适用于实体   他们私下“拥有”的   父实体。便携式应用   否则必须不依赖于   具体的删除顺序,必须   不重新分配已经存在的实体   孤儿或另一种关系孤儿   否则试图坚持下去。如果   孤儿的实体是一个   分离的,新的或删除的实体,   orphanRemoval的语义没有   应用

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

  4.   

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

第3.2.3节:删除包含有关删除过程的详细信息:

  

删除操作的语义,   应用于实体X如下:

     

•如果X是新实体,则忽略它   通过删除操作。然而   删除操作级联到   X引用的实体,如果是   从X到这些其他人的关系   实体用。注释   cascade = REMOVE或cascade = ALL   注释元素值。

     

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

     

•如果X是一个分离的实体,那么   IllegalArgumentException将是   由删除操作抛出(或者   事务提交将失败)。

     

•如果X是已移除的实体,则为   被删除操作忽略。

     

将删除已删除的实体X.   来自数据库之前或之前   事务提交或由于   冲洗操作。经过一个实体   已被删除,其状态(除了   对于生成的状态)将是   在该点的实体   调用删除操作。

答案 1 :(得分:0)

您的JPA提供程序不会为您管理内存中的Java集合。如果您在两侧都映射了关系,那么应该使用非拥有方的映射中的mappedBy属性将一侧定义为拥有方。由你来决定哪一方是拥有方。一旦做出决定,JPA提供商将使用您在映射中定义的任何级联/孤立管理在数据库中保持最新状态,但您只能在非拥有方管理您的集合。

管理此方法的一种方法是使用一个用于进行更改的服务方法,并且该服务方法负责更新1-n和n-1方面的集合或引用,以便您的java对象在记忆中是正确的。