@ManyToMany Uni定向关系不必要的删除

时间:2014-06-17 06:41:02

标签: hibernate many-to-many

如果我删除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

1 个答案:

答案 0 :(得分:1)

此处的解决方案将/应该非常简单,只是不要对cascade映射使用@ManyToMany设置。或者至少不要使用CascadeType.ALL

在这种情况下,级联设置与one-to-manymany-to-one略有不同。原因在于&#34;隐藏&#34;配对表。这个配对表代表many-to-many并且必须始终由Hibernate管理... I.e。:与该配对表相关的级联设置

注意:实际上它与one-to-manymany-to-one没有区别......在所有情况下,级联都是针对可见端。只是在many-to-many的情况下,它会跳过配对表

也许令人惊讶的是,这里的cascade不属于配对表,而是属于这种关系的第二端。只需使用cascade (至少不是删除),所有行为都将按预期进行。