如何在broadleaf中获取entityManager的静态实例?

这个问题是针对阔叶商业的.

我必须在静态方法中加载实体.由于注入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);
}
点赞