Hibernate双向@ManyToMany删除" targetEntity"在级联删除

时间:2014-04-24 07:45:12

标签: hibernate jpa many-to-many cascade jointable

在2个实体之间的双向ManyToMany映射

@Entity
@Table(name = "TB_REGION")
public class RegionEntity implements Region {
    @Id
    @Column(name = "REGION_TOKEN", length=20)
    private String token = null;

    @ManyToMany(fetch = FetchType.LAZY, mappedBy = "regions", cascade = CascadeType.REMOVE, targetEntity=MutationEntity.class)
    private List<Mutation> mutations;
}

@Entity
@Table(name = "TB_MUTATION")
public class MutationEntity implements Mutation {
    @Id
    @Column(name = "MUTATION_ID", length=22, nullable = false)
    private Integer id;

    @ManyToMany(targetEntity=RegionEntity.class, fetch=FetchType.LAZY, cascade=CascadeType.REMOVE)
    @JoinTable(
            name="TB_MUTATION_REGION",
            joinColumns={@JoinColumn(name="MR_MUTATION", referencedColumnName="MUTATION_ID")},
            inverseJoinColumns={@JoinColumn(name="MR_REGION", referencedColumnName="REGION_TOKEN")})
    private List<Region> regions;
}

当我尝试

entityManager.remove(region);

区域休眠1)删除引用该区域的所有TB_MUTATION_REGION行,然后2)尝试从JoinTable TB_MUTATION_REGION中删除已删除行中引用的所有TB_MUTATION

这反过来导致约束违规异常,因为那些TB_MUTATION条目仍在其他地方使用

是什么原因导致hibernate尝试删除那些TB_MUTATION,删除 TB_MUTATION_REGION(joinTable)的东西似乎是一种合理的默认行为,并且是我预期的

我怀疑我可能(已经)/错过了

@JoinTable(name="TB_MUTATION_REGION")

所以hibernate尝试1)级联删除TB_MUTATIONs 2)在删除突变之前尝试删除TB_MUTATION_REGIONs 3)然后删除了尝试删除TB_MUTATIONs的连接东西4)最后这导致了约束违规

所以我现在的假设是,我甚至不需要cascade = CascadeType.REMOVE,只需在区域一侧拥有@JoinTable,hibernate会自动从连接表中删除,这是正确的吗?

PS。 我试过谷歌搜索这个,但我找不到一个明确的答案,因为有很多其他问题关于ManyToMany堵塞了结果

PPS。 我可以稍后自己尝试,但现在我正在忙于其他的事情

1 个答案:

答案 0 :(得分:0)

对于您期望的行为(删除区域不应删除变异),您应该删除cascade类上的RegionEntity属性。