如果我删除Overlay.java对象删除和插入应该只在OVERLAY和OVERLAY_ACCOUNTS中发生。但覆盖删除导致在ACCOUNT和ACCOUNT_POSITONS中插入和删除 的 Overlay.java
@ManyToMany(cascade = CascadeType.ALL, fetch=FetchType.EAGER)
@JoinTable(name = "OVERLAY_ACCOUNTS", joinColumns = { @JoinColumn(name = "overlay_id", referencedColumnName = "overlay_id", nullable = false, updatable = false) }, inverseJoinColumns = { @JoinColumn(referencedColumnName = "account_id", name = "account_id", nullable = false, updatable = false) })
private Set<Account> overlayAccounts;
Account.java
此类与Overlay.java具有单向映射,因此在此类中未定义Overlay.java的映射
@Entity
@Table(name = "ACCOUNT")
public class Account implements Serializable {
// Other mappings
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER, orphanRemoval = true)
@Fetch(FetchMode.SELECT)
@JoinColumn(name = "account_id", referencedColumnName = "account_id", nullable = false, updatable = false)
private List<AccountPosition> positions = new ArrayList<AccountPosition>();
}
创建叠加
public void createOverlay() {
try {
overlayDao = new OverlayDao();
overlayDao.beginTransaction();
overlayDao.save(overlay);
overlayDao.commit();
}
catch (HibernateException e) {
Assert.fail("Overlay save failed: " + e.getMessage());
overlayDao.rollback();
}
finally {
overlayDao.closeSession();
}
}
以上代码导致在Account.java的AccountPosition上执行insert 以下是对AccountPosition 插入执行的查询 ACCOUNT_POSITIONS 和插入帐户
与上面相同Delete Overlay执行execute delete语句的原因 在帐户及其子表AccountPosition
答案 0 :(得分:1)
此处的解决方案将/应该非常简单,只是不要对cascade
映射使用@ManyToMany
设置。或者至少不要使用CascadeType.ALL
在这种情况下,级联设置与one-to-many
和many-to-one
略有不同。原因在于&#34;隐藏&#34;配对表。这个配对表代表many-to-many
并且必须始终由Hibernate管理... I.e。:与该配对表相关的级联设置不
注意:实际上它与one-to-many
和many-to-one
没有区别......在所有情况下,级联都是针对可见端。只是在many-to-many
的情况下,它会跳过配对表
也许令人惊讶的是,这里的cascade
不属于配对表,而是属于这种关系的第二端。只需不使用cascade (至少不是删除),所有行为都将按预期进行。