如何在broadleaf中获取entityManager的静态实例? [英] How to get a static instance of entityManager in broadleaf?
问题描述
我必须在静态方法中加载一个实体。由于注入entityManager不会帮助(因为我不能在静态方法中访问它),我无法加载实体。
我尝试使用Persistence.createEntityManagerFactory,但它没有帮助。
这里是我的示例代码。
$ b $ pre $ Query query = Persistence.createEntityManagerFactory(blPU)。createEntityManager()。 createQuery(一些查询);
列表结果= query.getResultList();
我得到的错误: - $ / b
$ b
<
@PersistenceContext(unitName = 0)对于当我必须在实例方法中正常使用它的情况, blPU)
受保护的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)
受保护的EntityManager em;
public< T>列表与LT; T> getEntityListByType(Class< T> clazz){
TypedQuery< T> query = em.createQuery(select entity from+ clazz.getSimpleName()+entity,clazz);
返回query.getResultList();
$ b 在静态方法中,可以这样使用:
public static void tryEJBinStaticContext(){
YourDaoClass dao = Util.lookUpYourDaoClass();
列表< SomeEntity> list = dao.getEntityListByType(SomeEntity.class);
}
This question is specific to broadleaf commerce.
I have to load an entity in a static method. Since injecting entityManager would not help (as i cannot access it in a static method), i am not able to load the entity.
I tried using Persistence.createEntityManagerFactory, but it does not help.
Here is my sample code.
Query query = Persistence.createEntityManagerFactory("blPU").createEntityManager().createQuery("some query");
List results = query.getResultList();
The error i am getting:-
javax.persistence.PersistenceException: No Persistence provider for EntityManager named blPU
For cases when i have to use it normaly in instance methods, entityManager works like a charm:
@PersistenceContext(unitName="blPU")
protected EntityManager em;
So i guess it is not any classpath issue.
Any help would be great.
解决方案 If you don't actually need to write your query in a static context but still want to access an entity in a static method, I'll give you the suggestion to just find an existing instance of an EJB through CDI-context with the following generic code:
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);
}
}
Your DaoClass looks like that:
@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();
}
}
In a static method this can be used like that:
public static void tryEJBinStaticContext() {
YourDaoClass dao = Util.lookUpYourDaoClass();
List<SomeEntity> list = dao.getEntityListByType(SomeEntity.class);
}
这篇关于如何在broadleaf中获取entityManager的静态实例?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!