调用entityManager.find()是否需要EntityTransaction?

时间:2016-07-06 14:39:33

标签: java hibernate jpa transactions

我想搜索当前的持久性上下文,并在必要时搜索实体存在的支持数据库。这是一个独立的java-se应用程序。 (它不会在java-ee应用程序容器中运行。)我不需要担心线程安全。我是否需要在EntityTransaction的上下文中查询数据库?

这种或那种方式存在潜在的差异吗?

entityManager.getTransaction.begin();
MyEntity me = entityManager.find(MyEntity.class, myEntity.getPrimaryKey());
entityManager.getTransaction.commit();

2 个答案:

答案 0 :(得分:1)

对于只读操作,不需要。

设置 FORE_VERSION_INCREMENT 类型的锁或其他一些更高级别的锁定会将操作变为只读。在这种情况下,它需要交易。

答案 1 :(得分:1)

某些情况(涉及锁定)find确实需要事务处理。

参考第3.1.1节(第79页)中的官方JPA specification(最终版本,JPA 2.1),我们发现:

  

find方法(假设它在没有锁的情况下调用或使用LockModeType.NONE调用)   并且在事务中需要调用{strong> <{1}}方法。

在所描述的方案中,您可以安全地拨打getReference ,不用 em.find(..)

希望它有所帮助。