我想搜索当前的持久性上下文,并在必要时搜索实体存在的支持数据库。这是一个独立的java-se应用程序。 (它不会在java-ee应用程序容器中运行。)我不需要担心线程安全。我是否需要在EntityTransaction的上下文中查询数据库?
这种或那种方式存在潜在的差异吗?
entityManager.getTransaction.begin();
MyEntity me = entityManager.find(MyEntity.class, myEntity.getPrimaryKey());
entityManager.getTransaction.commit();
答案 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(..)
。
希望它有所帮助。