2013-08-06 61 views
0
@OneToMany(cascade = {CascadeType.ALL}, fetch = FetchType.EAGER, orphanRemoval = true) 
@JoinColumn(name = "FacilityId", referencedColumnName = "Id") 
@ForeignKey(name = "FK_Schedule_Facility") 
@Cascade(value = {org.hibernate.annotations.CascadeType.ALL}) 
@OrderBy("fromDay asc") 
private Set<Schedule> schedules = new HashSet<Schedule>(); 

我在實體Location中設置了此集。休眠3.6.7 orphanRemoval級聯單向

在我的應用程序中,我使用AJAX構建了一個新集。這並沒有給我任何問題。我可以更改計劃中的值,甚至可以添加更多。但我不能刪除一個。它停留在數據庫和集合中。

我在我的DAO中使用這個方法: private SessionFactory sessionFactory;

public Facility saveOrUpdate(Facility facility){ 
    sessionFactory.getCurrentSession().saveOrUpdate(facility); 
    return facility; 
} 

所以我在日誌中得到這樣的:

2013-08-06 17:44:43,444 [[email protected]] DEBUG com.firstbankpr.os.common.data.dao.hibernate.FacilityHibernateDAO - Obtaining Session 
2013-08-06 17:44:43,450 [[email protected]] WARN org.hibernate.util.JDBCExceptionReporter - SQL Error: 515, SQLState: 23000 
2013-08-06 17:44:43,450 [[email protected]] ERROR org.hibernate.util.JDBCExceptionReporter - Cannot insert the value NULL into column 'FacilityId', table 'OLS.dbo.Schedule'; column does not allow nulls. UPDATE fails. 

joinColumn註釋進入nullable = false後,錯誤消失。但它仍然不能正確刪除我想要刪除的計劃。

那麼我做錯了什麼?我做了大量的搜索。 Found bugs in Hibernate 3.5哪些因爲我使用3.6.7而不適用於我。 Found that hashcode and equals have to be implemented correctly and found that JPA and Hibernate annotations often clash with each other。我還發現雙向關係在級聯方面存在問題,但它又不適用於我。但除了所有這些搜索之外,我還沒有找到一個解決方案。或者我可能忽視了一些東西。

請幫助我,謝謝!

+0

它不,它是單向的,因爲它在標題中說 – Nimchip

+1

似乎有一些建議你需要調用'merge()'而不是'saveOrUpdate()'。這對我來說沒有意義,但它值得一試。另外,你可以嘗試刪除'@ Cascade'註釋,當你在'@ OneToMany'中使用cascade元素時沒有意義。最後,你確定你在事務提交後檢查刪除嗎? – Pace

+0

試試這個:刪除'@ OneToMany'註釋中的「cascade」屬性,並保留'@ Cascade'一個。此外,OrphanRemoval是關於刪除父母時刪除孩子,這不是你想要做的。 – MaVVamaldo

回答

1

由於某種原因saveOrUpdate()未正確處理刪除孤兒。您必須改爲撥打merge()