com*_*tta 85 java spring persistence jpa jta
我有以下疑问:
ska*_*man 95
JPA实现可以选择自己管理事务(RESOURCE_LOCAL),或者让它们由应用程序服务器的JTA实现管理.
在大多数情况下,RESOURCE_LOCAL很好.这将使用基本的JDBC级事务.缺点是该事务是JPA持久性单元的本地事务,因此如果您想要跨越多个持久性单元(或其他数据库)的事务,那么RESOURCE_LOCAL可能不够好.
JTA还用于管理JMS和JCA等系统的事务,但对于我们大多数人来说,这是非常奇特的用法.
要使用JTA,您需要在应用程序服务器中支持它,并且还需要JDBC驱动程序的支持.
inf*_*k01 78
作为其他答案的补充
以下是非常有用的文章(在Apache TomEE网站上发布)的摘录,它也可以帮助回答OP的第一个问题(该文章的链接如下).
比较RESOURCE_LOCAL和JTA持久性上下文
使用<persistence-unit transaction-type ="RESOURCE_LOCAL"> 您负责EntityManager(PersistenceContext/Cache)创建和跟踪...
- 您必须使用 EntityManagerFactory来获取EntityManager
- 生成的EntityManager实例 是 PersistenceContext/Cache
- 一个 的EntityManagerFactory可以通过被注入 @PersistenceUnit注解只有(未@PersistenceContext)
- 你是不是允许使用@PersistenceContext引用类型RESOURCE_LOCAL单位
- 您必须使用 EntityTransaction API开始/提交 对EntityManger的每次调用
- 两次调用entityManagerFactory.createEntityManager()会导致 两个单独的EntityManager实例,从而产生 两个单独的PersistenceContexts/Caches.
- 这是几乎从未有多于一个好主意, 比如在使用一个EntityManager的(不创建第二个,除非你已经破坏了第一)
与<持久单元交易类型="JTA">所述 容器会做的EntityManager(PersistenceContext /高速缓存)创建和跟踪...
- 您不能使用 EntityManagerFactory来获取EntityManager
- 您只能获取容器提供 的EntityManager
- 一个的EntityManager 可以通过注入@PersistenceContext 注解只有(未@PersistenceUnit)
- 您 不能使用@PersistenceUnit来引用JTA类型的单位
- 容器给出的EntityManager是对与JTA事务关联的PersistenceContext/Cache 的引用.
- 如果没有正在进行的JTA事务,则无法使用 EntityManager, 因为没有PersistenceContext/Cache.
- 大家都用一个EntityManager参照同一单元在同一事务将自动具有到一个参考 相同PersistenceContext /高速缓存
- 在JTA 提交时刷新并清除PersistenceContext/Cache
有兴趣学习Java Persistence API的人 - 请帮个忙,阅读完整的文章:JPA Concepts:JPA 101.
Cha*_*tni 17
Resource_Local和JTA是事务管理器(执行事务的方法).这不是数据库的属性,而是负责协调事务的组件.JPA和JTA事务管理器是不同的.JPA事务管理器负责JPA事务,如果您只进行JPA事务,则需要使用它.JTA事务管理器是通用事务管理器,可以在事务中登记其他资源,例如JMS队列.通常,Java EE容器为EJB,JPA实体等使用JTA事务管理器.
| 归档时间: |
|
| 查看次数: |
57695 次 |
| 最近记录: |