EntityManager只能在事务中使用吗?

时间:2014-04-21 20:28:39

标签: java-ee jpa entitymanager

这一定是显而易见的事情,因为在任何地方都没有提到,但我仍然觉得需要确认。

如果要在持久操作中使用EntityManager总是需要处于事务中吗?

以下应用程序管理的EntityManager代码不会保留任何内容,除非我将其括在getTransaction().begin()getTransaction().commit()中:

   EntityManager em = entityManagerFactory
            .createEntityManager();

    Event e  = new Event("A name", new Date());
    em.persist(e);

find()调用正常。

  1. 这是否意味着我不能使用EM进行写入/更新操作,除非在事务中?如果是这样的话,为什么在没有交易的情况下尝试使用它时没有抛出异常?如果EM不在事务中,可以将EM设置为自动开始和提交事务吗?
  2. 在容器管理的情况下,EM仍然是对一个事务中注入到事务中涉及的各个组件的相同EM实例的引用,或者多个EM实例可以共享1个事务吗?
  3. 可以在多个交易中使用1个EM实例吗?

2 个答案:

答案 0 :(得分:2)

  

这是否意味着我无法使用EM进行写入/更新操作   除非在交易中?

是的,这是正确的,对数据库的任何写入或更新必须在事务中

  

如果是这样的话,为什么当我试图不使用它时没有抛出任何异常   交易?

查找方法不需要在事务中,因为它不会影响数据。您可以在事务之外运行查询。由于fetch(或find)是不可变的,查询将成功

  

可以将EM设置为自动创建并提交   交易,如果它不在交易中?

这涉及容器管理事务的一些概念,它们通过其所有者创建事务的开始,提交和结束,但是当您使用Bean管理事务时,您必须自己创建启动和提交事务。

  

在容器管理的情况下,EM仍然是对同一EM的引用   实例在一个事务中注入到各个组件   参与交易或可以多个EM实例共享1   交易?

对于容器管理的EM,EM是通过依赖注入(@PersistenceContext)或JNDI获得的,容器管理持久化上下文生命周期并始终使用JTA,这意味着持久化上下文被传播使用当前的JTA事务,因此如果TransactionalAttributes允许(REQUIRED, MANDATORY, SUPPORTS),则使用不同bean中的多个EM实例可以共享相同的事务。因此,回答您的问题倍数EM可以共享相同的交易。

  

可以在多个交易中使用1个EM实例吗?

不,EM与一个事务相关联,它允许同时使用多个事务。 持久性上下文可以与单个或多个事务相关联,并且可以与多个实体管理器关联,但EM不支持涉及多个事务。但它可以在不同的交易中使用,但不能在同一时刻使用。

答案 1 :(得分:1)

一些JPA实现支持非事务性写入。有些人不愿意。对于与实现无关的行为,您使用事务。如果您的JPA提供程序允许非事务性操作,那么您可以更轻松地找到编写代码