Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.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 Hibernate JPA级联类型_Java_Hibernate_Jpa - Fatal编程技术网

Java Hibernate JPA级联类型

Java Hibernate JPA级联类型,java,hibernate,jpa,Java,Hibernate,Jpa,我已经多次阅读了级联类型的定义,但我只是不知道在我试图实现的特定情况下使用哪一个 我在工作者类和任务类之间有@OneToMany关系,因此工作者可以有多个任务,但每个任务只针对一个工作者 private List tasks保存Worker类中的任务,并 私人工人是任务类中的工作者对象 我被下面的?卡住了,不知道应该使用哪种级联类型 @OneToMany(targetEntity=Task.class,mappedBy=“worker”,cascade=CascadeType.?,fetch=F

我已经多次阅读了级联类型的定义,但我只是不知道在我试图实现的特定情况下使用哪一个

我在
工作者
类和
任务
类之间有
@OneToMany
关系,因此
工作者
可以有多个任务,但每个
任务
只针对一个
工作者

private List tasks
保存
Worker
类中的任务,并
私人工人
任务
类中的
工作者
对象

我被下面的
卡住了,不知道应该使用哪种级联类型

@OneToMany(targetEntity=Task.class,mappedBy=“worker”,cascade=CascadeType.?,fetch=FetchType.LAZY)


这两个对象应该彼此独立存在,但我希望对
任务
对象的更改反映在
工作者
对象上,反之亦然


最终(如果我能让它工作:),我想写一个算法,当一个新任务进入系统时,匹配最好的工人,我想知道我是否在正确的轨道上。谢谢

这取决于您使用实体的方式

  • 如果从未分离实体,则不需要
    CascadeType.detach
    。如果您这样做了,那么您可能应该包括这个
    CascadeType
  • 当您将分离的worker重新合并到持久性上下文中时,是否还希望合并其任务?这不是一个容易的决定,但根据您所说的,您可能不会在同一流程中修改工作人员和任务,因此您可能不希望这样做
  • CascadeType.PERSIST
    通常是一个不错的选择,您不会真的错了。但如上所述:听起来您并不是在同一个过程中创建工人和新任务。但如果您这样做,则选择此
    CascadeType
  • 您肯定不想使用
    CascadeType。请从我理解的内容中删除

在您的特定情况下,您希望将一个实体中的更改还原到另一个实体,如果映射实体被删除,您不希望删除它,以满足您的两个需求:


这两个对象应该彼此独立存在

在这种情况下,您不应使用
CascadeType.REMOVE
type,因为删除所属实体时,它会删除与此设置关联的所有相关实体

但是我希望对
任务
对象的更改反映在
工作者

在这种情况下,使用
CascadeType.PERSIST
CascadeType.MERGE
类型将足以反映双方之间的更改,因为
CascadeType.PERSIST
包含
save()
PERSIST()
操作,而
CascadeType.MERGE
将处理
MERGE()
操作


有关此主题的更多详细信息,我建议阅读,因为它简要地说明了所有这些情况。

“两个对象应该彼此独立存在,但我希望任务对象的更改反映在工作者对象上,反之亦然。”我建议您
cascade=CascadeType.all
和add
deleteOrphan=true
。但是如果您使用JPA 2/2.1+Hibernate 5,请小心,级联删除没有得到很好的管理,我建议您手动执行级联删除。@Zorglube它是
孤立删除
而不是
删除孤立
,如果他使用它,它将删除与另一方无关的元素,这不是他想要的。谢谢@chsdk纠正我的错误。谢谢你,这对我来说很有意义。注意,上面的链接文章将
关系所有者
父母
的概念混为一谈,我看不出这有多混乱,它仅使用
所有者
关系
术语来说明这一点。