有两个域对象(让我们称之为A和B),它们使用Hibernate进行删除/删除。
我只能删除A但不能删除B对象,并且没有例外,也没有记录任何错误的日志记录。 两种对象类型都使用相同的服务方法进行删除。
public void delete(T instance) {
getEntityManager().remove(instance);
}
我已经钻到B停止的地方,A能够进一步成功删除。
并且B在课程EntityDeleteAction
中停止;意味着@Override public void execute() throws HibernateException
中的方法EntityDeleteAction
永远不会被调用。
我无法找到执行方法的用法,并且我已经比较了各个阶段的状态,并且无法找到任何异常(可能存在)。
任何人都有Hibernate / EntityDeleteAction的经验,可以让我知道问题是什么吗?
更新
我找到了为什么B不会被删除的原因。这是因为A引用了B的集合。 而这个集合急切地加载而不是懒惰。这段代码说明了这一点:
@OneToMany(fetch = FetchType.EAGER, mappedBy = "a", targetEntity = B.class, cascade = CascadeType.ALL)
private Set<B> bCollection = new HashSet<B>();
删除可以更改为FetchType.LAZY
。但是在这个应用程序中,我们不打开hibernate / jpa会话,所以如果在会话关闭后尝试继续懒惰地继续加载,延迟加载将无法在应用程序的其他部分中运行。
所以我们找到原因但不是解决方案,因为我们希望保持急切的加载。
是否可以在删除之前将B与A分离?它是导致问题的从A到B的有效参考。
答案 0 :(得分:0)
在删除调用后尝试刷新并启用Hibernate SQL日志记录。
答案 1 :(得分:0)
解决方案只是从A中的集合中删除B,然后从数据库中删除,从而从A中删除对B的引用,这就是问题。
collectionOfBObjects.remove(b);