EntityManager.merge(x)导致对DB的“选择”查询

时间:2013-11-13 10:35:02

标签: hibernate jpa optimistic-locking detach

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

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

更新

我不使用@Version字段。

更新*

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

1 个答案:

答案 0 :(得分:2)

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