2

我使用 Hibernate 作为 JPA 实现。在我的 vaadin 应用程序EntityManager中是请求范围的(以避免不受控制地提交累积的更改)。我将分离的实体存储在会话中,并在每次请求中需要它时重新附加它(每个请求一次,我使用 进行检查em.contains())。实体引用另一个实体,一个引用另一个实体,所以最后我有三层级联所有树图,其中所述会话范围的实体作为根。

这工作正常,直到我有全新的大树和全新的节点(总共超过 5000 个项目) - Hibernate 尝试在合并时找到每个新节点(我可以在我的日志中看到它的尝试 - 许多select不存在的 id)。这是一个错误还是只是我滥用了 JPA?

更新

我不使用@Version字段。

更新*

在我的应用程序中,我使用相同的方法来存储所有实体子树,而不管级联关系的结构如何,因此我无法区分不同的用例,因此我使用了合并。

4

1 回答 1

2

我认为你应该使用entityManager.persist()全新的树而不是entityManager.merge()为了避免新的选择。merge()可用于新实体和持久化实体,hibernate 必须决定做什么(SQL 插入或更新),为此它需要这些选择。

于 2013-11-13T11:59:36.807 回答