hibernate 3.6.7 orphanRemoval级联单向

时间:2013-08-06 21:43:16

标签: java hibernate

@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。我还发现双向关系存在级联问题,但同样不适用于我。但除了所有这些搜索之外,我还没有找到解决方案。或许我忽视了一些事情。

请帮帮我,谢谢你!

1 个答案:

答案 0 :(得分:1)

由于某种原因,saveOrUpdate()无法正确处理delete-orphans。您必须改为呼叫merge()