@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
中设置了这个集合。
在我的应用程序中,我使用AJAX构造了一个新的集合。这没有给我任何问题。我可以更改计划中的值,甚至可以添加更多值。但我不能删除一个。它保留在数据库和集合中。
我在DAO中使用此方法: private SessionFactory sessionFactory;
public Facility saveOrUpdate(Facility facility){
sessionFactory.getCurrentSession().saveOrUpdate(facility);
return facility;
}
所以我在日志中得到了这个:
2013-08-06 17:44:43,444 [1219450701@qtp-169872652-2] DEBUG com.firstbankpr.os.common.data.dao.hibernate.FacilityHibernateDAO - Obtaining Session
2013-08-06 17:44:43,450 [1219450701@qtp-169872652-2] WARN org.hibernate.util.JDBCExceptionReporter - SQL Error: 515, SQLState: 23000
2013-08-06 17:44:43,450 [1219450701@qtp-169872652-2] ERROR org.hibernate.util.JDBCExceptionReporter - Cannot insert the value NULL into column 'FacilityId', table 'OLS.dbo.Schedule'; column does not allow nulls. UPDATE fails.
在nullable = false
注释中输入joinColumn
后,错误就会消失。但它仍然无法正确删除我要删除的计划。
那么我做错了什么?我做了很多谷歌搜索。 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 :(得分:1)
由于某种原因,saveOrUpdate()
无法正确处理delete-orphans。您必须改为呼叫merge()
。