【发布时间】:2014-04-24 07:45:11
【问题描述】:
在 2 个实体之间的双向多对多映射中
@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")
因此休眠尝试 1) 级联删除 TB_MUTATIONs 2) 在删除突变之前它尝试删除 TB_MUTATION_REGIONs 3) 然后删除了它尝试删除 TB_MUTATIONs 4) 最终导致约束违规
所以我现在的假设是我什至不需要 cascade=CascadeType.REMOVE,并且只需在区域侧休眠时使用 @JoinTable 就会自动从可连接中删除,对吗?
ps。 我试着用谷歌搜索,但我找不到明确的答案,因为还有一百万个关于 ManyToMany 的其他问题阻塞了结果
pps。 我以后可能会自己尝试一下,但现在我正忙于其他事情
【问题讨论】:
标签: hibernate jpa many-to-many cascade jointable