[英]Hibernate many-to-one delete only child
哪里有很多類似的話題,但是我自己還是無法解決。
因此,我有對象“銀行” ,這是“辦公室”的父母。
我正在嘗試刪除單個辦公室,但是后來我做到了,母銀行的所有辦公室都被刪除了。
這是代碼:
銀行
@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;
辦公室
@Entity
@Table(name = "OFFICES")
public class Office {
public Office() {
}
public Office(String city, String address, String workingHours, Bank bank) {
this.city = city;
this.address = address;
this.workingHours = workingHours;
this.bank = bank;
}
@Id
@Column(name = "ID")
@GeneratedValue
private int id;
@ManyToOne(fetch = FetchType.EAGER, cascade = CascadeType.REMOVE)
@JoinColumn(name = "BANK_ID")
private Bank bank;
@Column(name = "CITY")
private String city;
@Column(name = "ADDRESS")
private String address;
@Column(name = "WORKING_HOURS")
private String workingHours;
和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);
}
}
休眠查詢跟蹤,然后僅刪除辦公室:
Hibernate: delete from offices where id=?
Hibernate: delete from offices where id=?
Hibernate: delete from offices where id=?
Hibernate: delete from offices where id=?
Hibernate: delete from offices where id=?
Hibernate: delete from offices where id=?
Hibernate: delete from offices where id=?
Hibernate: delete from offices where id=?
Hibernate: delete from offices where id=?
Hibernate: delete from offices where id=?
Hibernate: delete from offices where id=?
Hibernate: delete from offices where id=?
Hibernate: delete from offices where id=?
Hibernate: delete from offices where id=?
Hibernate: delete from offices where id=?
Hibernate: delete from offices where id=?
Hibernate: delete from offices where id=?
Hibernate: delete from offices where id=?
Hibernate: delete from banks where id=?
我究竟做錯了什么? 任何建議將不勝感激。
更新
如果我從辦公室刪除cascade = CascadeType.REMOVE ,休眠將不會發送任何刪除請求。
我發現了問題。 休眠狀態似乎無法刪除它在父級列表中的子實體,因此只需在office中將其添加到delete方法即可:
s.getBank().getOfficeList().remove(s);
是的, Cascade。在辦公室刪除不應該存在。
解釋為什么我們有這種行為。
Bank
是officeList
的父officeList
,因此,如果我們刪除Bank
,則刪除officeList
是有意義的。
@ManyToOne(fetch = FetchType.EAGER, cascade = CascadeType.REMOVE)
@JoinColumn(name = "BANK_ID")
private Bank bank;
此注釋意味着Office
也是Bank
的父級
因此,如果刪除Office
->我們應該刪除Bank
->我們應該刪除Bank
所有辦公室以及Bank
本身。
我們在日志中看到它
Hibernate: delete from offices where id=?
Hibernate: delete from offices where id=?
Hibernate: delete from banks where id=?
另外,如果我們已經@JoinColumn
了(與Hibernate 5一起使用),我們就不能在這里使用mappedBy
。
@OneToMany(mappedBy = "bank", cascade = CascadeType.ALL, fetch = FetchType.EAGER, orphanRemoval = true)
@JoinColumn(name = "BANK_ID")
private List<Office> officeList;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.