Hibernate @多个单向关系不需要删除
如果我删除Overlay.java对象删除和插入应该只发生在Overlay和Overlay\u帐户中。但覆盖删除也会导致在帐户和帐户位置中插入和删除 Overlay.javaHibernate @多个单向关系不需要删除,hibernate,many-to-many,Hibernate,Many To Many,如果我删除Overlay.java对象删除和插入应该只发生在Overlay和Overlay\u帐户中。但覆盖删除也会导致在帐户和帐户位置中插入和删除 Overlay.java @ManyToMany(cascade = CascadeType.ALL, fetch=FetchType.EAGER) @JoinTable(name = "OVERLAY_ACCOUNTS", joinColumns = { @JoinColumn(name = "overlay_id", refer
@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的AccountPosition上执行insert
下面也是针对AccountPositioninsert-in执行的查询
账户头寸和插入账户
与上面的Delete Overlay相同,导致执行Delete语句
论账户及其子表AccountPosition
这里的解决方案应该非常简单,只是不要对
@ManyToMany
映射使用cascade
设置。或者至少不要使用级联类型。全部
在这种情况下,级联设置与一对多
和多对一
有所不同。原因在“隐藏”配对表中。此配对表表示多对多,必须始终由Hibernate管理。。。即:级联设置与该配对表不相关
注:事实上,它与一对多
和多对一
没有区别。。。在所有情况下,cascade都以可见端为目标。仅在多对多
的情况下,它跳过配对表
可能令人惊讶的是,
级联
此处不属于配对表,而是属于此关系的第二端。只需使用cascade(至少不用于删除),所有行为都将如预期的那样。删除cascade解决了我的所有问题,但我发现了另一个问题,hibernate使用OVERLAY_ACCOUNT和ACCOUNT执行内部连接,而我希望它保持连接。我的建议是使用fetch=FetchType.LAZY
,如果需要,在查询中显式使用它。因此,所有多对多都将作为separted SELECT处理(同时检查批大小设置),默认情况下我们不需要左连接。但这只是一个建议。总之,解决级联问题很好;)
@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();
}
}