这是我的实体:
@Entity
@Table(name="workflows")
public class WorkflowDB {
...
@OneToMany(cascade = CascadeType.ALL, mappedBy="workflow", fetch = FetchType.EAGER)
private Set<ActivityDB> activities;
...
}
@Entity
@Table(name="activities")
public class ActivityDB {
...
@ManyToOne
@JoinColumn(name="id_workflow")
@Fetch(FetchMode.JOIN)
private WorkflowDB workflow;
@OneToMany(cascade = CascadeType.ALL)
@LazyCollection(LazyCollectionOption.FALSE)
@JoinTable(name = "dependency", joinColumns = {
@JoinColumn(name = "id_activity")}, inverseJoinColumns = {
@JoinColumn(name = "id_dependent")})
private Set<ActivityDB> dependencyActivities;
...
}
PS:不要问我为什么这么奇怪(对我来说)@OneToMany。见here
好吧,我有一个工作流程。 此工作流具有节点(活动),它们是一个图形(节点可以有节点来构建路径)
假设我有一个工作流程&#34; W&#34;。 所以,&#34; W&#34; .activities = {Ac1,Ac2} 但是,&#34; Ac1&#34; .dependencyActivities = {Ac2}
当我第一次保存工作流程时,在&#34;活动&#34;设置或更新工作流程时,所有活动都在数据库中重复,并接收新ID。
&#34;活动&#34;表格将显示:
-----------
! 1 ! Ac1 !
-----------
! 2 ! Ac2 !
-----------
! 3 ! Ac2 !
-----------
我认为Ac2是重复的,因为它在&#34; W&#34; .activities设置AND&#34; Ac1&#34; .dependencyActivities设置。我是对的吗?
我可以做些什么来避免这种行为? 如何一次性更新工作流程及其子女(以及递归儿童的孩子)?
**** **** EDIT 我认为关键是我如何看待活动的依赖链。 所有依赖解决方案都很好。
答案 0 :(得分:0)
在WorkflowDB @OneToMany映射中使用updatable = false,因此,在更新workflowDB时,不会更新活动。
@Entity
@Table(name="workflows")
public class WorkflowDB {
...
@OneToMany(cascade = CascadeType.ALL, mappedBy="workflow", fetch = FetchType.EAGER, **updatable=false**)
private Set<ActivityDB> activities;
...
}