簡體   English   中英

休眠多對一刪除獨生子

[英]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 ,休眠將不會發送任何刪除請求。

您應該以正確的方式配置CascadeType ...

All -在您的情況下不是最佳選擇。 嘗試DETACHREMOVE 它應該幫助:)

有關CascadeType的更多信息可以在這里找到

我發現了問題。 休眠狀態似乎無法刪除它在父級列表中的子實體,因此只需在office中將其添加到delete方法即可:

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

是的, Cascade。在辦公室刪除不應該存在。

解釋為什么我們有這種行為。

BankofficeList的父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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM