2017-04-18 132 views
1

我已经多次读取级联类型定义,但我无法得到我的头围绕哪个用于我试图实现的特定情况。休眠JPA级联类型

我有workerWorker类和Task类之间@OneToMany关系,因此可以具有多个任务,但每一Task是仅对于一个Worker

private List <Task> tasks保持任务在Worker类和 private Worker worker;Worker对象在Task

我被困在下面的?,不知道我应该使用哪个级联类型。

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

应该不存在彼此两个对象,但我想改变Task对象,以反映Worker对象上,反之亦然

最终(如果我能得到这个工作:))我我想写一个算法来匹配最好的工作人员,当一个新的任务进入系统我想知道我是否在正确的轨道上。由于

+0

“两个对象应该彼此不存在,但我希望对Task对象的更改反映在Worker对象上,反之亦然”< - 您能指定那个意思吗?你的意思是,如果你修改了“Task-A”,那么Worker对象链接到的“Task-A”不应该链接到旧版本的“Task-A”?如果这就是你所关注的一切,那么你完全不需要CascadeType(NONE)。 –

+0

我建议你'cascade = CascadeType.ALL'并添加'deleteOrphan = true'。但是如果你使用JPA 2/2.1 + Hibernate 5时要小心,级联删除管理不好,我建议你手动进行级联删除。 – Zorglube

+1

@Zorglube它是'orphanRemoval'而不是'deleteOrphan',如果他使用它,它会删除那些与另一端没有关系的元素,这不是他正在寻找的元素。 –

回答

1

井您的特定情况下,要恢复于一体的实体向对方改变,你不希望删除它,如果映射实体被删除,回答你的两个要求:

没有彼此

在这种情况下,应该存在

两个对象,你不应该使用CascadeType.REMOVE类型,因为它emoves与此设置的所有相关实体的关联时,拥有实体删除。

,但我想改变Task对象使用CascadeType.PERSISTCascadeType.MERGE类型将足以体现双方之间的变化CascadeType.PERSIST涵盖了Worker

在这种情况下,既反映save()persist()操作,而CascadeType.MERGE将处理merge()操作。

有关此主题的更多详细信息,我建议您阅读HowToDoInJava Hibernate JPA Cascade Types article,因为它简要介绍了所有这些情况。

+1

谢谢你,这对我来说很有意义。 –

+1

@UlugToprak欢迎您。 –

-1

这取决于你如何使用您的实体。

  • 如果你从不分离你的实体,那么你不需要CascadeType.DETACH。如果你这样做,那么你应该包括这个CascadeTyp。
  • 当合并的分离工人回到你的持久化上下文,你还希望它的任务合并?这不是一个简单的决定,但是从你所说的话你可能不会在同一个过程中修改一个工作者和一个任务,所以你可能不需要这个。
  • CascadeType.PERSIST通常是一个很好的选择,因为,你真的不能出错,这一个。但是像上面那样:听起来你不是在同一个过程中创建一个工作人员和一个新任务。但如果你这样做,然后选择这个CascadeType。
  • 你绝对不希望CascadeType.REMOVE从我的理解。