Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ionic-framework/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hibernate @多个单向关系不需要删除_Hibernate_Many To Many - Fatal编程技术网

Hibernate @多个单向关系不需要删除

Hibernate @多个单向关系不需要删除,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

如果我删除Overlay.java对象删除和插入应该只发生在Overlay和Overlay\u帐户中。但覆盖删除也会导致在帐户和帐户位置中插入和删除 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的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();
}

}