gpt4 book ai didi

java - 如何在阔叶树中获取 entityManager 的静态实例?

转载 作者:搜寻专家 更新时间:2023-11-01 03:33:58 25 4
gpt4 key购买 nike

此问题特定于阔叶商业。我必须在静态方法中加载一个实体。由于注入(inject) entityManager 无济于事(因为我无法在静态方法中访问它),因此我无法加载该实体。

我尝试使用 Persistence.createEntityManagerFactory,但没有帮助。这是我的示例代码。

Query query = Persistence.createEntityManagerFactory("blPU").createEntityManager().createQuery("some query");
List results = query.getResultList();

我得到的错误:-

javax.persistence.PersistenceException: No Persistence provider for EntityManager named blPU

对于我必须在实例方法中正常使用它的情况,entityManager 就像一个魅力:

@PersistenceContext(unitName="blPU")
protected EntityManager em;

所以我想这不是任何类路径问题。任何帮助都会很棒。

最佳答案

如果您实际上不需要在静态上下文中编写查询,但仍想在静态方法中访问实体,我会建议您通过 CDI 上下文查找 EJB 的现有实例使用以下通用代码:

public class Util {
private static <T> T lookUpClassInBeanManager(Class<T> clazz) {
BeanManager bm = CDI.current().getBeanManager();
Bean<T> bean = (Bean<T>) bm.getBeans(clazz).iterator().next();
CreationalContext<T> ctx = bm.createCreationalContext(bean);
return (T) bm.getReference(bean, clazz, ctx);
}

public static YourDaoClass lookUpYourDaoClass() {
return lookUpClassInBeanManager(YourDaoClass.class);
}
}

你的 DaoClass 看起来像这样:

@Stateless
public class YourDaoClass {

@PersistenceContext(unitName = "blPU", type = PersistenceContextType.TRANSACTION)
protected EntityManager em;

public <T> List<T> getEntityListByType(Class<T> clazz) {
TypedQuery<T> query = em.createQuery("select entity from "+ clazz.getSimpleName() +" entity", clazz);
return query.getResultList();
}
}

在静态方法中可以这样使用:

public static void tryEJBinStaticContext() {
YourDaoClass dao = Util.lookUpYourDaoClass();
List<SomeEntity> list = dao.getEntityListByType(SomeEntity.class);
}

关于java - 如何在阔叶树中获取 entityManager 的静态实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37771566/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com