Java OpenJPA事务-单个或多个实体管理器?

Java OpenJPA事务-单个或多个实体管理器?,java,jpa,transactions,openjpa,entitymanager,Java,Jpa,Transactions,Openjpa,Entitymanager,我有一个DBManagersingleton,它确保单个EntityManagerFactory的实例化。不过,我正在讨论单个或多个EntityManager的使用,因为只有一个事务与EntityManager关联 我需要使用多个事务。JPA不支持嵌套事务 所以我的问题是:在大多数在单个db环境中使用事务的普通应用程序中,您是否使用单个EntityManager?到目前为止,我一直在使用多个EntityManagers,但我想看看创建一个是否可以做到这一点,并加快一点速度 所以我发现下面的建议很

我有一个
DBManager
singleton,它确保单个
EntityManagerFactory
的实例化。不过,我正在讨论单个或多个
EntityManager
的使用,因为只有一个事务与
EntityManager
关联

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

所以我的问题是:在大多数在单个db环境中使用事务的普通应用程序中,您是否使用单个
EntityManager
?到目前为止,我一直在使用多个
EntityManager
s,但我想看看创建一个是否可以做到这一点,并加快一点速度

所以我发现下面的建议很有帮助:希望它也能帮助别人。

从技术上讲,在JPA中,EntityManager处于来自 它被创建的点。所以begin有点多余。直到开始 调用时,无法执行某些操作,如持久化、合并、删除 打电话。仍然可以执行查询,并且可以删除已查询的对象 可以更改,尽管这有点不确定会发生什么 对于JPA规范中的这些更改,通常会提交, 但是,最好在对您的应用程序进行任何更改之前调用begin 物体。通常,最好为每个应用程序创建一个新的EntityManager 要避免的事务在持久性中保留过时的对象 上下文,并允许以前管理的对象进行垃圾收集

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

回滚操作将仅回滚数据库事务。 持久性上下文中的托管对象将分离 整个管理器被清除。这表示以前的任何对象 读取,不应再使用,并且不再是 持久性上下文。对对象所做的更改将保留为 即,对象更改将不会恢复


EntityManager
s根据定义不是线程安全的。因此,除非您的应用程序是单线程的,否则使用单个EM可能不是一条出路。

基于CLI的应用程序是单线程的&假设您不调用任何Thread.start(),这是正确的吗?那么,如果应用程序在ajax中使用延迟加载,但也应该合并在延迟加载的实体上所做的更改,该怎么办?