这一定是显而易见的事情,因为在任何地方都没有提到,但我仍然觉得需要确认。
如果要在持久操作中使用EntityManager
总是需要处于事务中吗?
以下应用程序管理的EntityManager
代码不会保留任何内容,除非我将其括在getTransaction().begin()
和getTransaction().commit()
中:
EntityManager em = entityManagerFactory
.createEntityManager();
Event e = new Event("A name", new Date());
em.persist(e);
但find()
调用正常。
答案 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提供程序允许非事务性操作,那么您可以更轻松地找到编写代码