java – EJB:在PostConstruct方法中使用EntityManager
在构造bean之后,我想使用EntityManager从数据库中检索数据.在构造函数中是不可能的,因为在调用构造函数之后注入EntityManager.所以我尝试在用@PostConstruct注释的方法中做到这一点.根据API,在完成所有注入后调用PostConstruct方法.执行查询有效,但它总是返回一个空列表.如果我在其他方法中使用相同的查询,则返回正确的结果.有谁知道,为什么它在PostConstruct方法中不起作用?
@Stateful(mappedName = "price") @Singleton @Startup public class PriceManagementBean implements PriceManagement { @PersistenceContext private EntityManager em; private List<PriceStep> priceSteps = Collections.synchronizedList(new ArrayList<PriceStep>()); public PriceManagementBean(){ } @PostConstruct public void init(){ javax.persistence.Query query = em.createQuery("SELECT ps FROM PriceStep ps"); List<PriceStep> res = query.getResultList(); ..... } } 解决方法
原因1 只记得: > Singleton bean是一个保持其状态的bean.应用程序中只有一个Singleton实例,它在应用程序的所有用户之间共享.此外,由于它是一个共享(可能更好的并发)bean,因此需要使用@Lock注释实现某种锁定机制. 原因2 无论如何,你的代码中有很多错误,因为没有说出一切.我不知道你的系统要求是什么,但在这里我会给你一个简单的解决方案,允许你访问数据库: 我想你正试图以某种方式返回bean生命周期中的数据,因为如果bean是@Stateful,你想避免一次又一次地发送查询. 因此,使用@NamedQuery注释您的实体PriceStep,然后输入您编写的查询字符串.在此链接中,您将找到有关如何使用@NamedQueries的信息: 我建议你接下来要注意你的类PriceManagementBean为* @ Stateless *.不要担心,如果在每个请求中创建了一个新的entityManager,它根本不会对数据库造成压力,因为它与域模型交互. 这里有一个代码: @Entity @NamedQuery( name="allPriceSteps",queryString="SELECT ps FROM PriceStep ps" ) public class PriceStep implements Serializable { ... } 现在豆子: @Stateless public class PriceManagementBean implements PriceManagement { @PersistenceContext private EntityManager em; public List<PriceStep> getAllPriceSteps() { Query query = em.createNamedQuery("allPriceSteps"); return query.getResultList(); } } 我希望这很有用.如果您提供有关系统要求的更多信息,我们可以为您提供最佳实践建议. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |