有两个域对象(我们称它们为A和B(使用Hibernate相同地删除/删除。
我只能删除 A 对象,而不能删除 B 对象,并且没有异常,也没有报告任何错误的日志记录。两种对象类型使用相同的服务方法进行删除。
public void delete(T instance) {
getEntityManager().remove(instance);
}
我已经钻取到B停止的地方,A能够进一步成功删除。B停在EntityDeleteAction
班;这意味着该方法@Override public void execute() throws HibernateException
永远不会在 EntityDeleteAction
中为 B 调用。
我找不到执行方法的用法,并且我比较了各个阶段的状态,并且找不到任何异常(可能有(。
任何人都有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
来工作。但是在此应用程序中,我们不会使休眠/jpa 会话保持打开状态,因此,如果在会话关闭后尝试延迟恢复加载,则延迟加载将无法在应用程序的其他部分工作。所以我们找到了原因,但没有解决方案,因为我们想保持急切的加载。
这是在删除之前将 B 与 A 分离的一种方法吗?正是从 A 到 B 的活动引用导致了问题。
在删除调用后尝试刷新并启用休眠SQL日志记录。
解决方案只是在从数据库中删除之前从 A 中的集合中删除 B,从而从 A 中删除对 B 的引用,这是问题所在。
collectionOfBObjects.remove(b);