什么是CascadeType.ALL的一个@ManyToOne JPA的关联意义(What is t

2019-06-18 14:56发布

我觉得我在误解的情况下级联的含义@ManyToOne关系。

案子:

public class User {

   @OneToMany(fetch = FetchType.EAGER)
   protected Set<Address> userAddresses;

}

public class Address {

   @ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
   protected User addressOwner;

}

是什么意思cascade = CascadeType.ALL ? 例如,如果我从数据库中删除某个地址,那怎么我加入了这个事实cascade = CascadeType.ALL影响我的数据( User ,我猜的)?

Answer 1:

的含义CascadeType.ALL是持久性将传播(级联)所有EntityManager操作( PERSIST, REMOVE, REFRESH, MERGE, DETACH ),为相关实体。

看来你的情况是一个坏主意,因为移除Address会导致删除相关的User 。 作为一个用户可以有多个地址,其它地址将成为孤儿。 然而逆案(注释的User )才有意义-如果一个地址只能属于一个用户,它是安全的,如果该用户被删除传播去除属于用户的所有地址。

BTW:你可能希望将添加mappedBy="addressOwner"属性,你的User信号的持久性提供连接列应在地址表中。



Answer 2:

看到这里从OpenJPA的文档的例子。 CascadeType.ALL意味着它会做的一切行动。

引用:

CascadeType.PERSIST:当持续的实体,也坚持在这一领域举行的实体。 我们建议该级联规则的自由主义应用,因为如果EntityManager的发现冲水时引用了新的实体领域,该领域不使用CascadeType.PERSIST,这是一个错误。

CascadeType.REMOVE:当删除一个实体,也删除在这一领域举行的实体。

CascadeType.REFRESH:当刷新一个实体,也刷新在这一领域举行的实体。

CascadeType.MERGE:当合并实体状态,也融合在这一领域举行的实体。

塞巴斯蒂安



Answer 3:

从EJB3.0规范 :

级联注释元素的使用可以被用于传播的操作的相关联的实体的影响。 级联功能在亲子关系最常用。

如果X是一个管理实体,remove操作使之成为去除。 删除操作被级联到由X引用的实体,如果从X到这些其他实体的关系与所述级联注释= REMOVE或级联= ALL注释元素值。

因此,概括地说,与定义的实体关系CascadeType.All将确保所有的持久性事件,如坚持,刷新,合并,删除发生在母公司,将被传递给孩子。 定义其他CascadeType选项提供了控制权的实体协会如何处理持久性,更精细的开发商。

例如,如果我有这样的包含的网页列表的对象簿和我这个列表中添加页面对象。 如果@OneToMany定义书和页面之间的关联注释标记为CascadeType.All ,坚持图书会导致页面也正在保存到数据库。



Answer 4:

正如我在解释这篇文章 ,并在我的书中, 高性能Java持久性 ,你不应该使用CascadeType.ALL@ManyToOne因为实体状态转变应该从父实体传播给孩子的。

@ManyToOne方始终是儿童协会,因为它应该映射底层FK。

因此,移动CascadeType.ALL@ManyToOne联想到@OneToMany应该使用mappedBy属性,因为它是最有效的一个一对多的映射 。 `



Answer 5:

在JPA 2.0,如果你想删除的地址,如果您从您可以添加一个用户实体删除它orphanRemoval=true (而不是CascadeType.REMOVE )到您的@OneToMany

之间更多的解释orphanRemoval=trueCascadeType.REMOVE是在这里 。



Answer 6:

如果你只是想删除分配给用户,而不是ADRESS对用户的实体类的影响,你应该尝试类似的东西:

@Entity
public class User {
   @OneToMany(mappedBy = "adressOwner", cascade = CascadeType.ALL)
   protected Set<Address> userAddresses = new HashSet<>();
}

@Entity 
public class Adresses {
   @ManyToOne(cascade = CascadeType.REFRESH) @JoinColumn(name = "user_id")
   protected User adressOwner;
}

你不要这样,不需要担心使用取在注释中。 但要记住删除用户的时候,你也将删除连接ADRESS用户对象。



文章来源: What is the meaning of the CascadeType.ALL for a @ManyToOne JPA association