首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用PersistenceUnit的JTA

使用PersistenceUnit的JTA
EN

Stack Overflow用户
提问于 2013-01-20 22:36:16
回答 2查看 1.5K关注 0票数 3

@PersistenceUnit可以和JTA一起使用吗?如果是的话,怎么可能呢?

http://tomee.apache.org/jpa-concepts.html

<persistence-unit transaction-type="RESOURCE_LOCAL"> ..。

  • 您必须使用EntityManagerFactory来获得EntityManager
  • ..。
  • EntityManagerFactory只能通过@PersistenceUnit注释注入(而不是@PersistenceContext)

<persistence-unit transaction-type="JTA"> ..。

  • EntityManager只能通过@PersistenceContext注释注入(而不是@PersistenceUnit)

我有一个类似的代码,它同时使用JTA和@PersistenceUnit。但有时,当我访问事务(定义为NullPointerException )时,我使用的是@Resource

EN

回答 2

Stack Overflow用户

发布于 2013-04-24 10:58:31

使用JTA意味着将工作委托给容器。您可以使用UserTransaction覆盖它。你的报价包含了你想知道的所有答案。使用PersistenceUnit获取EntityManager是行不通的。

如果使用的是RESOURCE_LOCAL,则使用EntityManager.getTransaction()负责事务本身。实体管理器由EntityManagerFactory创建。要获得那个工厂,您可以使用PersistenceUnit

因此,如果您依赖容器管理的实体管理器,那么简单的答案是否定的。

作为示例,请参见http://docs.oracle.com/javaee/6/tutorial/doc/bnbqw.html

应用程序托管实体管理器= RESOURCE_LOCAL可以使用UserTransaction (这是JTA的一部分)。

票数 0
EN

Stack Overflow用户

发布于 2015-12-30 08:31:51

实体经理是什么意思?如果我是一个天真的程序员,我可以简单地解释一些管理实体的东西&实际上,它的意思是一样的。

实体管理器在实体管理器工厂的帮助下被实例化。到数据库的连接由实体管理器管理,即它提供对数据库执行操作的功能。因此,我们可以说,如果一个应用程序需要多个数据库连接,那么将为一个特定的数据库构造一个EntityManagerFactory,该数据库为每个HTTP请求所需的数据库构建多个EntityManager实例(如果需要的话,即使是实体管理器的单个实例也可以根据您可能选择的多个实例的需求来完成)。我们将通过一个例子来理解这一点。假设我们有一个数据库: A,有一个关系表B和C。所以对于A,实体管理器工厂的一个实例将被实例化。现在,如果我们想要对表B执行任何更新&假设表C的delete操作,那么可以实例化两个不同的实体管理器,也可以使用相同的实体管理器实例。实体管理器工厂本身的实例化被认为效率较低,但由于它是一次活动,因此它是可管理的任务,因为实体管理器工厂一旦被实例化,它将服务于整个应用程序--实例化的实体管理器与持久性上下文相关联。

代码语言:javascript
复制
@PersistenceUnit(unitName = "MyDatabase")
EntityManagerFactory emf;
EntityManager entityManager = emf.createEntityManager();

代码语言:javascript
复制
@PersistenceContext(unitName = "MyDatabase") 
private EntityManager entityManager;

PersistenceUnit注入一个EntityManagerFactory,PersistenceContext注入一个EntityManager。通常最好使用PersistenceContext,除非您确实需要手动管理EntityManager生命周期。EntityManagerFactory定义了另一个用于实例化EntityManager的方法,与工厂一样,它以属性映射作为参数。如果要指定EntityManagerFactory的默认用户名和密码以外的用户名和密码,则此表单非常有用:

代码语言:javascript
复制
Map properties = new HashMap(); 
properties.put("javax.persistence.jdbc.user", "kashyap");
properties.put("javax.persistence.jdbc.password","kashyap"); 
EntityManager em = emf.createEntityManager(properties);

在持久性上下文中,对实体实例及其生命周期进行管理。所谓实体实例,我们指的是实体的实例&每个实体都指定数据库中的关系表。Entity实际上是一个接口,它提供了创建和删除持久实体实例的方法,通过它们的主键查找实体,以及对实体进行查询,从而将这些功能组合在我们执行的操作下。修改数据库内容的操作需要活动事务。事务由从EntityManager获取的实体事务实例管理。精确定义:-实体管理器由持久性单元定义。持久化单元定义了由应用程序关联或分组的所有类的集合,这些类必须在它们到单个数据库的映射中进行协同。下面我正在编写一个代码片段,以便更好地理解:-

代码语言:javascript
复制
try {
        em.getTransaction().begin();
        // Operations that modify the database should come here.
        em.getTransaction
        /**
        *getTransaction() EntityManager's method Return the resource-level EntityTransaction object. See JavaDoc Reference Page
        */
        em.getTransaction().commit();
  }
  finally {
        if (em.getTransaction().isActive())
            em.getTransaction().rollback();
  }

让我们按照JPA规范:- 1)扩展与事务范围:默认情况下使用事务持久性上下文,这意味着当当前事务提交时,所有更改都被刷新,所有托管实体都被取消。扩展的范围仅适用于状态EJB&它甚至是非常有意义的,因为有状态bean可以保存状态,因此可以说,一个业务方法的结束并不意味着事务的结束。对于无状态bean,它有一个不同的方面--业务方法必须在业务方法完成时结束。===> One方法=一个事务;对于无状态Beans,只允许事务范围内的实体管理器,您可以控制EntityManager在EntityManager注入期间是否扩展或事务:-

代码语言:javascript
复制
@PersistenceContext (type = javax.persistence.PersistenceContextType.EXTENDED)
    EntityManager emng;

默认情况下,它是javax.persistence.PersistenceContextType.TRANSACTION扩展的,只有在容器管理的EntityManagers情况下才允许事务作用域PersistenceContext。是时候加强一下:容器管理的vs应用程序管理的2)容器管理的vs应用程序管理的:

代码语言:javascript
复制
@PersistenceContext
EntityManager emng;

上面的语句授权容器为您注入实体管理器,因此容器管理。或者,您可以使用EntityManager自己创建一个EntityManagerFactory,但这一次注入将有所不同-

代码语言:javascript
复制
@PersistenceUnit
EntityManagerFactory emf;

现在,要获得您需要调用的EntityManager

代码语言:javascript
复制
emf.createEntityManager();

这里是--您使用的是应用程序管理的持久性上下文。现在,您负责创建和删除EntityManagers。在阅读下一段之前,请集中精力,因为这就是我试图解决的复杂上下文--如果您想要控制创建的EM (例如,如果您需要将创建的EntityManager移动到涉及到事务处理的多个bean中),则可以使用EntityManager来解决这个问题--容器不会为您做这件事,而且每次调用createEntityManager()时,您都会创建一个连接到新PersistenceContext的EntityManager。您可以使用CDI进行EntityManager的共享。请继续关注实体事务- JPA和Resource,将对其进行详细讨论。希望它能给出一个关于上下文的简短的想法。请随意发帖查询。

这里阅读第二部分

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14430111

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档