我有一个DBManager单例,可确保单个EntityManagerFactory的实例化。我正在辩论使用单个或多个EntityManager,因为只有单个事务与EntityManager相关联。

我需要使用多个交易。 JPA不支持嵌套事务。

所以我的问题是:在大多数在单个数据库环境中使用事务的普通应用程序中,您是否完全使用单个EntityManager?到目前为止,我一直在使用多个EntityManager,但是想看看创建单个ojit_code是否可以达到目的,并且还可以加快速度。

所以我发现以下帮助:希望它也能帮助其他人。
http://en.wikibooks.org/wiki/Java_Persistence/Transactions#Nested_Transactions

从技术上讲,在JPA中,EntityManager是从
点创建。因此开始有点多余。直到开始是
调用时,某些操作(例如持久,合并,删除)不能
叫。仍然可以执行查询以及被查询的对象
可以更改,尽管尚不确定,将会发生什么
对于JPA规范中的这些更改,通常会做出 promise ,
但是最好在进行任何更改之前先致电开始
对象。通常,最好为每个对象创建一个新的EntityManager
避免过时的对象保留在持久性中的事务
上下文,并允许以前管理的对象进行垃圾回收。

成功提交后,可以继续使用EntityManager,
并且所有托管对象均保持托管状态。但是通常
最好关闭或清除EntityManager以允许垃圾回收
并避免过时的数据。如果提交失败,则托管对象
被视为已分离,并且EntityManager被清除。这表示
如果失败,则无法捕获并重试提交失败
发生时,必须再次执行整个交易。以前的
被管理对象也可能处于不一致状态,这意味着某些
对象锁定版本的可能已增加。提交意愿
如果已将事务标记为回滚,也将失败。这个可以
通过显式调用setRollbackOnly发生,或者需要
如果任何查询或查找操作失败,则设置。这可能是一个问题,因为
某些查询可能会失败,但可能不希望导致整个查询
交易将被回滚。

回滚操作将仅回滚数据库事务。
持久性上下文中的托管对象将被分离
并清除了EntityManager。这意味着以前有任何物体
阅读,不应再使用,并且不再是
持久性上下文。对对象所做的更改将保留为
是,对象更改将不会恢复。

最佳答案

EntityManager的定义不是线程安全的。因此,除非您的应用程序是单线程的,否则使用单个EM可能不是可行的方法。

关于java - OpenJPA事务-单个或多个实体管理器?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8495890/

10-11 20:42