Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.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
Java 休眠多对一删除独生子女_Java_Hibernate - Fatal编程技术网

Java 休眠多对一删除独生子女

Java 休眠多对一删除独生子女,java,hibernate,Java,Hibernate,那里有很多类似的话题,但我还是不能自己处理,对不起 因此,我有一个对象“Bank”,它是“Office”的父对象 我试图删除单个办公室,但我这样做了,所有母公司银行的办公室都将被删除。 代码如下: 银行 @Entity @Table(name = "BANKS") public class Bank { public Bank() { } public Bank(String name) { this.name = name; } @I

那里有很多类似的话题,但我还是不能自己处理,对不起

因此,我有一个对象“Bank”,它是“Office”的父对象
我试图删除单个办公室,但我这样做了,所有母公司银行办公室都将被删除。
代码如下:
银行

@Entity
@Table(name = "BANKS")
public class Bank {
    public Bank() {
    }

    public Bank(String name) {
        this.name = name;
    }

    @Id
    @Column(name = "ID")
    @GeneratedValue
    private int id;

    @Column(name = "name")
    private String name;

    @OneToMany(mappedBy = "bank", cascade = CascadeType.ALL, fetch = FetchType.EAGER, orphanRemoval = true)
    @JoinColumn(name = "BANK_ID")
    private List<Office> officeList;
OfficeDAO

@Repository
@Transactional
public class OfficeDAOImpl implements OfficeDAO {

    @Autowired
    private SessionFactory sessionFactory;

    @Override
    public Office getByOffice_ID(int Office_ID) {
        return (Office) sessionFactory.getCurrentSession().get(Office.class, Office_ID);
    }

    @Override
    public List<Office> getAllOffice() {
        Criteria criteria = sessionFactory.getCurrentSession().createCriteria(Office.class);
        return criteria.list();
    }

    @Override
    public int save(Office Office) {
        return (Integer) sessionFactory.getCurrentSession().save(Office);
    }

    @Override
    public void update(Office Office) {
        sessionFactory.getCurrentSession().merge(Office);
    }

    @Override
    public void view(Office Office) {
        sessionFactory.getCurrentSession().merge(Office);
    }

    @Override
    public void delete(int Office_ID) {
        Office s = getByOffice_ID(Office_ID);
        System.out.println("trying to delete" + Office_ID);
        sessionFactory.getCurrentSession().delete(s);
    }

}
我做错了什么?任何建议都将不胜感激

更新


如果我删除cascade=CascadeType。从office中删除,hibernate将不会发送任何删除请求。

您应该以wright方式配置
CascadeType

All
-不是您的最佳选择。尝试
分离
删除
。这应该有帮助:)


更多信息。

我发现了这个问题。看起来hibernate无法删除位于父列表中的子实体,所以只需将此添加到office中的delete方法:

s.getBank().getOfficeList().remove(s);

是的,级联。办公室中不应该存在删除。

我们为什么会有这种行为的解释

Bank
officeList
的父级,因此,如果我们删除
Bank
,则删除
officeList
是有意义的

@ManyToOne(fetch = FetchType.EAGER, cascade = CascadeType.REMOVE)
@JoinColumn(name = "BANK_ID")
private Bank bank;
此注释表示
Office
也是
Bank
的父级

因此,如果我们删除
办公室
->,我们应该删除
银行
->,我们应该删除
银行
银行
本身的所有办公室

我们在日志中看到了它

Hibernate: delete from offices where id=?
Hibernate: delete from offices where id=?
Hibernate: delete from banks where id=?  
此外,如果我们有
mappedBy
(使用Hibernate 5),我们也不能在这里使用
@JoinColumn

@OneToMany(mappedBy=“bank”,cascade=CascadeType.ALL,fetch=FetchType.EAGER,orphandremovation=true)
@JoinColumn(name=“银行ID”)
私人公务员名单;

也许在一对一的关系中,你所拥有的一切都是幸福吗?我不确定100%,这就是为什么我给你留下评论。你的映射看起来不错。除了
@JoinColumn(name=“BANK_ID”)私人名单。这里不需要
@JoinColumn
。请添加更多
删除
相关代码。@v.ladynev,谢谢您的建议。如果我删除joinColumn注释,hibernate将创建表bank_office,这是不合适的。此删除代码段只有一个,我没有其他删除代码。@您需要将
mappedBy
添加到
@OneToMany(mappedBy=“bank”,cascade=CascadeType.ALL,fetch=FetchType.EAGER,orphanRemoving=true)私人列表中
@JoinColumn
在所有者端不常用,它仅适用于单向关联(在“Office”端没有属性)。@v.ladynev,谢谢,现在映射工作正常,但没有级联。在Office中,它仍然不删除任何内容,但如果我添加cascade.all,它将删除所有者银行和银行本身的所有办公室……可能是因为
渴望
@manytone(fetch=FetchType.EAGER)私人银行中。由于
银行
在列表中有一个已删除的办公室。@v.ladynev我知道这已经晚了,但我有一个类似的问题,并将渴望从子实体变为懒惰解决了这个问题。但我不明白背后的逻辑。你能解释一下或者提供一个参考吗?@psaw.mora我添加了解释
@ManyToOne(fetch=FetchType.EAGER)
默认值是
EAGER
,那么为什么要让EAGER懒散地解决这个问题呢?我不明白part@psaw.mora我试图用Hibernate 5删除
EAGER
。这没用。您使用什么版本的Hibernate?
@ManyToOne(fetch = FetchType.EAGER, cascade = CascadeType.REMOVE)
@JoinColumn(name = "BANK_ID")
private Bank bank;
Hibernate: delete from offices where id=?
Hibernate: delete from offices where id=?
Hibernate: delete from banks where id=?  
@OneToMany(mappedBy = "bank", cascade = CascadeType.ALL, fetch = FetchType.EAGER, orphanRemoval = true)
@JoinColumn(name = "BANK_ID")
private List<Office> officeList;