【发布时间】:2016-09-04 14:38:49
【问题描述】:
有人可以解释在无状态 bean 中注入的 EntityManager 的生命周期吗?如果无状态 bean 有一个与特定 PersistenceContext 关联的注入 EntityManager,那么第二次使用该 bean 时该关联会发生什么?
例如,我有以下内容:
@Stateless
public class TimeStepsBean
{
@PersistenceContext(unitName="DynamicDB")
private EntityManager em;
public List<TimeStep> timeSteps = new ArrayList<TimeStep>();
private void init()
{
if (timeSteps.isEmpty())
{
TypedQuery<TimeStep> query = em.createQuery("SELECT t FROM TimeStep t", TimeStep.class);
timeSteps = query.getResultList();.
}
}
public void refreshSteps()
{
init();
em.flush();
em.refresh(timeSteps.get(0));
}
}
当第二次使用 bean 时调用 refreshSteps(第二次事务),我得到一个“java.lang.IllegalArgumentException: Entity not managed”。 entityManager 被注入,所以我假设它始终是当前持久性上下文的一部分。真的吗?
在刷新之前添加 em.merge(timeSteps.get(0)) 仍然会产生相同的异常。
【问题讨论】:
-
容器会注入一个代理EntityManager。如果您不在事务中,则此代理可能会为每次调用获取一个新的 EntityManager,因此当您检查下一次调用时将永远不会管理 em.find(x.class)。
-
看看这个,对你有帮助:stackoverflow.com/questions/2070073/….
-
您是否认为如果新事务正在启动,则会为代理生成一个新的实体管理器,并在整个事务中使用该实体管理器?
标签: java hibernate jpa dependency-injection cdi