Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/389.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java CascadeType.ALL对于@ManyToOne JPA协会的意义是什么_Java_Jpa_One To Many_Cascade_Many To One - Fatal编程技术网

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一边。谢谢弗拉德,我不知道为什么这不是最好的答案。