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;