事务完成后,EntityManager属性会丢失吗?

时间:2014-07-11 08:44:05

标签: java-ee jpa glassfish jta

我在Glassfish 4上运行了一些代码,它们在EntityManager(javax.persistence.EntityManager)上设置属性,这在事务中发生。

在另一个交易中,我想阅读属性,我发现它们已经消失了。

我看到在两种情况下它都是相同的EntityManager对象(实际上它是一个EntityManagerWrapper):

com.sun.enterprise.container.common.impl.EntityManagerWrapper@5a346e8f

属性是否仅在事务的生命周期内有效?

我通过注入得到了EntityManager(事实上注入的对象是上面提到的包装器):

@PersistenceContext(unitName = IEntityManagerService.DEFAULT_PERSISTENCE_UNIT)
    protected void setManager(final EntityManager manager) {
        assert manager != null;
        this.manager = manager;
    }

1 个答案:

答案 0 :(得分:1)

它是容器管理的EntityManager的默认行为。

每个事务都会创建和销毁EntityManager的实际实例,而EntityManagerWrapper只是一个委托调用与当前事务关联的EntityManager的代理。

如果您的EntityManager被注入有状态对象,则可以将其配置为跨越多个事务using type = PersistenceContextType.EXTENDED,但我不认为它是您所需要的

此外,还不太清楚为什么要在事务之间保留EntityManager属性。 EntityManager.setProperty()通常用于配置底层JPA实现的特定于供应商的选项,而不是作为事务之间通信的方式。