Jpa 如何使用实体类获取entityManager
如何联系管理实体的实体经理。我是说;假设我在sessionBean中有一个实体引用,我如何获得这个实体的entityManager? 我已经尝试过(请参见getEntityManagerOfEntity()方法)包含em的方法;但它不起作用 Thx bgrdsJpa 如何使用实体类获取entityManager,jpa,ejb,Jpa,Ejb,如何联系管理实体的实体经理。我是说;假设我在sessionBean中有一个实体引用,我如何获得这个实体的entityManager? 我已经尝试过(请参见getEntityManagerOfEntity()方法)包含em的方法;但它不起作用 Thx bgrds 您不能从使用JPA API的实体中回溯EntityManager,即使它仍然处于管理状态 如果您在bean中有对不同EMs的引用,并且实体被管理,那么您可以做的是通过调用EM.contains(entity)来检查正确的EM 在大多数情况
您不能从使用JPA API的实体中回溯
EntityManager
,即使它仍然处于管理状态
如果您在bean中有对不同EMs的引用,并且实体被管理,那么您可以做的是通过调用EM.contains(entity)
来检查正确的EM
在大多数情况下,知道哪个EM最初获取了一个实体并不重要,因为您可以将该实体合并到任何持久性上下文中并继续使用它。您只能在使用供应商扩展时这样做。DataNucleus JPA提供了NucleusJPAHelper.getEntityManager(obj)作为例子。出于好奇-为什么要这样做?你能更清楚地说明你的用例吗?甚至在生命周期方法中也不建议您使用EntityManager(在JPA2.0中正式使用AFAIR)。我需要它,这就是为什么要为多个数据源创建通用方法的原因。我试图通过在我的项目MainManagerBean中命名的stateles sessionbean来联合crud方法。Thx 4您的评论您确定该实体真的属于某个实体经理吗?-Adam Dyga 3小时前1次投票-请将此代码移至问题(更新)。StackOverflow不是一个公告板Piotr Nowicki 3小时前,还有一个问题需要回答:调用getEntityManagerOfEntity()函数时,您是否处于同一事务中?您确定其中一个EM应使您的实体处于托管状态吗?-Piotr Nowicki 3小时前是的,我确信实体属于一个em。谢谢Novicki先生考虑。目前,它作为2个spereate find方法工作。一个是findByPrimaryKeyWithinManager(实体),另一个是findByPrimaryKeyWithinIntegrationManager(实体集成)。在这种情况下也是如此。但是,正如我所说;如果我通过findByPrimaryKey方法调用getEntityManagerOfEntity。getEntityManagerOfEntity方法返回null,这就是为什么if子句的求值为false。无状态sessionBean会导致这个问题吗(此外,当我在调试期间跟踪时,我在em实例上看不到任何关于实体的信息);是的,在同一笔交易中。
@Stateless(name = "MainManager", mappedName = "MainManager")
@TransactionManagement(TransactionManagementType.CONTAINER)
@Interceptors(value = { PerformanceMonitor.class, ProfileInterceptor.class })
public class MainManagerBean implements MainManager, MainManagerLocal
{
private Logger logger = Logger.getLogger(this.getClass());
@PersistenceContext(unitName = "DSApp")
private EntityManager manager;
@PersistenceContext(unitName = "DSIX")
private EntityManager integrationManager;
@Resource
SessionContext ctx;
public EntityManager getEntityManagerOfEntity(SuperEntity superEntity)
{
if (manager.contains(superEntity))
return manager;
else if (integrationManager.contains(superEntity))
return integrationManager;
return null;
}
public SuperEntity findByPrimaryKey(SuperEntity superEntity)
{
getEntityManagerOfEntity(superEntity).setFlushMode(FlushModeType.COMMIT);
return dao.findByPrimaryKey(getEntityManagerOfEntity(superEntity), superEntity);