休眠删除实体问题



有两个域对象(我们称它们为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);

相关内容

  • 没有找到相关文章