【发布时间】:2012-01-19 17:17:27
【问题描述】:
我有一个 DBManager 单例,可确保单个 EntityManagerFactory 的实例化。不过,我正在讨论使用单个或多个EntityManager,因为只有单个事务与EntityManager 相关联。
我需要使用多个事务。 JPA 不支持嵌套事务。
所以我的问题是:在大多数在单个数据库环境中使用事务的普通应用程序中,您是否使用单个 EntityManager?到目前为止,我一直在使用多个 EntityManagers,但想看看创建一个是否可以解决问题并加快速度。
所以我发现以下内容很有帮助:希望它也对其他人有所帮助。 http://en.wikibooks.org/wiki/Java_Persistence/Transactions#Nested_Transactions
从技术上讲,在 JPA 中,EntityManager 处于来自 点它被创建。所以 begin 有点多余。直到开始是 调用,某些操作,如persist,merge,remove不能 叫。仍然可以执行查询,并且查询的对象 可以改变,虽然这有点不确定会发生什么 对于 JPA 规范中的这些更改,通常它们将被提交, 但是最好在对您的文件进行任何更改之前调用 begin 对象。通常最好为每个创建一个新的 EntityManager 事务以避免在持久性中保留陈旧的对象 上下文,并允许以前管理的对象进行垃圾收集。
提交成功后EntityManager可以继续使用, 并且所有托管对象都保持托管状态。不过通常情况下 最好关闭或清除 EntityManager 以允许垃圾收集 并避免过时的数据。如果提交失败,则托管对象 被认为是分离的,并且 EntityManager 被清除。这意味着 提交失败不能被捕获和重试,如果失败 发生时,必须重新执行整个事务。以前的 托管对象也可能处于不一致的状态,这意味着一些 的对象锁定版本可能已增加。提交意愿 如果事务已被标记为回滚,也会失败。这个可以 通过调用 setRollbackOnly 显式发生或需要 如果任何查询或查找操作失败,则设置。这可能是一个问题,因为 某些查询可能会失败,但可能不希望导致整个 要回滚的事务。
回滚操作只会回滚数据库事务。 持久化上下文中的托管对象将变得分离 并且 EntityManager 被清除。这意味着以前的任何对象 已阅读,不应再使用,并且不再是 持久性上下文。对对象所做的更改将保留为 也就是说,对象的更改不会被还原。
【问题讨论】:
标签: java jpa transactions openjpa entitymanager