我在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;
}
答案 0 :(得分:1)
它是容器管理的EntityManager
的默认行为。
每个事务都会创建和销毁EntityManager
的实际实例,而EntityManagerWrapper
只是一个委托调用与当前事务关联的EntityManager
的代理。
如果您的EntityManager
被注入有状态对象,则可以将其配置为跨越多个事务using type = PersistenceContextType.EXTENDED
,但我不认为它是您所需要的
此外,还不太清楚为什么要在事务之间保留EntityManager
属性。 EntityManager.setProperty()
通常用于配置底层JPA实现的特定于供应商的选项,而不是作为事务之间通信的方式。