【问题标题】:Can EntityManager be used only within transaction?EntityManager 只能在事务中使用吗?
【发布时间】:2014-06-05 23:50:18
【问题描述】:

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

如果要在持久化操作中使用EntityManager,是否总是需要在事务中?

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

   EntityManager em = entityManagerFactory
            .createEntityManager();

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

find() 调用工作正常。

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

【问题讨论】:

    标签: jakarta-ee jpa entitymanager


    【解决方案1】:

    一些 JPA 实现支持非事务性写入。有些没有。对于独立于实现的行为,您使用事务。如果您的 JPA 提供程序允许非事务性操作,那么您会发现编写代码要容易得多

    【讨论】:

      【解决方案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 不支持参与多个事务。但它可以在不同的事务中使用,但不能同时使用。

      【讨论】:

      • 我喜欢你的回答,也喜欢你的回答方式。
      猜你喜欢
      • 1970-01-01
      • 2012-06-28
      • 1970-01-01
      • 2010-11-23
      • 1970-01-01
      • 2017-08-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多