如何避免hibernate上的重复寄存器一对多?

时间:2014-07-10 15:30:32

标签: hibernate

这是我的实体:

@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 我认为关键是我如何看待活动的依赖链。 所有依赖解决方案都很好。

1 个答案:

答案 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; 
...
}