在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。 我可以稍后自己尝试,但现在我正在忙于其他的事情
答案 0 :(得分:0)
对于您期望的行为(删除区域不应删除变异),您应该删除cascade
类上的RegionEntity
属性。