Hibernate JPA级联类型

时间:2017-04-18 15:37:53

标签: java hibernate jpa

我已多次阅读级联类型定义,但我无法理解我正在尝试实施的特定情况下使用哪一种。

我在@OneToMany班级和Worker班级之间有Task个关系,因此worker可以有多个任务,但每个Task只有一个Worker 1}}

private List <Task> tasks保存Worker课程中的任务 private Worker worker;Worker

中的Task对象

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

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

两个对象应该彼此存在,但我希望对Task对象的更改反映在Worker对象上,反之亦然

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

2 个答案:

答案 0 :(得分:2)

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

  • 如果您从未分离过您的实体,那么您就不需要CascadeType.DETACH。如果你这样做,那么你应该包括这个CascadeTyp。
  • 当您将分离的工作程序合并回持久性上下文时,是否还要将其任务合并?这不是一个简单的决定,但是根据您的说法,您可能不会在同一过程中修改工作人员和任务,因此您可能不想要这样做。
  • CascadeType.PERSIST通常是一个不错的选择,因为你可能真的出错了。但就像上面一样:听起来你并没有在同一个过程中创造一个工人和一个新任务。但是如果你这样做,那么选择这个CascadeType。
  • 根据我的理解,你绝对不想要CascadeType.REMOVE。

答案 1 :(得分:2)

在您的特定情况下,您希望将一个实体中的更改还原到另一方,并且如果删除了映射实体,则您不想删除它,以满足您的要求:

  

两个对象应该彼此存在

在这种情况下,您不应使用CascadeType.REMOVE类型,因为当拥有实体被删除时,会删除与此设置相关的所有相关实体。

  

但我希望Task对象的更改能够反映在Worker

在这种情况下,使用CascadeType.PERSISTCascadeType.MERGE类型就足以反映双方之间的变化,因为CascadeType.PERSIST涵盖了save()persist()两种操作CascadeType.MERGE将处理merge()操作。

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