Java CascadeType.ALL对于@ManyToOne JPA协会的意义是什么
我想我误解了级联在Java CascadeType.ALL对于@ManyToOne JPA协会的意义是什么,java,jpa,one-to-many,cascade,many-to-one,Java,Jpa,One To Many,Cascade,Many To One,我想我误解了级联在@manytone关系中的含义 本案: public class User { @OneToMany(fetch = FetchType.EAGER) protected Set<Address> userAddresses; } public class Address { @ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL) protected User add
@manytone
关系中的含义
本案:
public class User {
@OneToMany(fetch = FetchType.EAGER)
protected Set<Address> userAddresses;
}
public class Address {
@ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
protected User addressOwner;
}
公共类用户{
@OneToMany(fetch=FetchType.EAGER)
受保护的用户地址集;
}
公共课堂演讲{
@manytone(fetch=FetchType.LAZY,cascade=CascadeType.ALL)
受保护的用户地址所有者;
}
cascade=CascadeType.ALL的含义是什么?例如,如果我从数据库中删除了某个地址,那么我添加的cascade=CascadeType.ALL
对我的数据(我想是用户
)有何影响?例如OpenJPA文档中的一个例子<代码>级联类型。全部
表示它将执行所有操作
引述:
CascadeType.PERSIST:在持久化实体时,还持久化其字段中保存的实体。我们建议自由应用此级联规则,因为如果EntityManager在刷新期间找到引用新实体的字段,而该字段未使用CascadeType.PERSIST,则是错误的
CascadeType.REMOVE:删除实体时,也会删除此字段中的实体
CascadeType.REFRESH:刷新实体时,也刷新此字段中保存的实体
CascadeType.MERGE:合并实体状态时,也合并此字段中的实体
塞巴斯蒂安:
可以使用级联注释元素来传播
操作对关联实体的影响。瀑布
功能最常用于父子关系
如果X是托管实体,则删除操作会使其成为
远离的。移除操作级联到X引用的实体,
如果从X到这些其他实体的关系用
cascade=REMOVE或cascade=ALL注释元素值
因此,简而言之,使用CascadeType.All定义的实体关系将确保在父级上发生的所有持久化事件(如persist、refresh、merge和remove)都将传递给子级。定义其他CascadeType
选项为开发人员提供了对实体关联如何处理持久性的更精细的控制
例如,如果我有一本包含页面列表的对象书,我在这个列表中添加了一个页面对象。如果定义书籍和页面之间关联的@OneToMany
注释标记为CascadeType.All
,则持久化书籍将导致页面也持久化到数据库。CascadeType.All的含义是持久化将传播(cascade)所有EntityManager
操作(保留、删除、刷新、合并、分离
)到相关实体
在您的情况下,这似乎是一个坏主意,因为删除地址将导致删除相关的用户
。由于用户可以有多个地址,其他地址将成为孤立地址。然而,相反的情况(注释用户
)是有意义的——如果一个地址只属于一个用户,那么在删除该用户时,传播删除属于该用户的所有地址是安全的
顺便说一句:您可能需要向您的用户添加mappedBy=“addressOwner”
属性,以向持久性提供程序发出信号,表明连接列应该位于地址表中。在JPA 2.0中,如果要删除从用户实体中删除的地址,则可以添加删除=true
(而不是级联类型。删除)到您的@OneToMany
关于orphanRemoving=true
和CascadeType.REMOVE
之间的更多解释是。您不应该使用CascadeType.ALL
在@ManyToOne
上,因为实体状态转换应该从父实体传播到子实体,而不是相反
@ManyToOne
端始终是子关联,因为它映射基础外键列
因此,您应该将CascadeType.ALL
从@ManyToOne
关联移动到@OneToMany
端,这也应该使用mappedBy
属性,因为它是最有效的一对多表关系映射。<对用户实体类的影响您应该尝试以下操作:
@Entity
public class User {
@OneToMany(mappedBy = "addressOwner", cascade = CascadeType.ALL)
protected Set<Address> userAddresses = new HashSet<>();
}
@Entity
public class Addresses {
@ManyToOne(cascade = CascadeType.REFRESH) @JoinColumn(name = "user_id")
protected User addressOwner;
}
@实体
公共类用户{
@OneToMany(mappedBy=“addressOwner”,cascade=CascadeType.ALL)
受保护的Set userAddresses=new HashSet();
}
@实体
公共类地址{
@manytone(cascade=CascadeType.REFRESH)@JoinColumn(name=“user\u id”)
受保护的用户地址所有者;
}
通过这种方式,您不必担心如何使用回迁注释。但请记住,删除用户时,您也将删除连接到用户对象的地址。在JPA中,此信息是有用的,但这里的分离又如何?在CascadeType.Detach中,分离实体时,em也会分离父实体持有的实体。最好拥有CascadeType。不过都在@OneToMany一边。谢谢弗拉德,我不知道为什么这不是最好的答案。