【问题标题】:Injected EntityManager's scope/lifecycle in a Stateless bean在无状态 bean 中注入 EntityManager 的范围/生命周期
【发布时间】: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


【解决方案1】:

你的 timeSteps 是一个状态。您的类被注释为无状态。这是对框架的滥用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-04
    • 1970-01-01
    • 2011-06-26
    相关资源
    最近更新 更多