【发布时间】:2013-08-12 06:29:46
【问题描述】:
我正在开发一个简单的 Java EE 应用程序。
我有这样的课:
import javax.annotation.PostConstruct;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
@Stateless
public class BlogEntryDao {
EntityManager em;
@PostConstruct
public void initialize(){
EntityManagerFactory emf = Persistence.createEntityManagerFactory("Persistence");
em = emf.createEntityManager();
}
public void addNewEntry(){
Blogentry blogentry = new Blogentry();
blogentry.setTitle("Test");
blogentry.setContent("asdfasfas");
em.persist(blogentry);
}
}
所以我的托管 bean 调用了这个方法。直到这里没有问题。但是由于没有调用初始化方法,我在 em.persist 中得到了一个 NPE。
为什么没有调用初始化方法?我在 Glassfish 服务器上运行它。
问候。
【问题讨论】:
-
对于初学者,您不应该在全局范围内打开您的
EntityManager;EntityManager大致对应一个会话。如果您确实需要处理自己的会话管理(注入@PersistenceContext 更好),您应该在每次调用addNewEntry时创建和关闭EntityManager。 -
您是否确认您的容器将对象视为需要依赖注入的东西?不是每个对象都被钩住了,如果你只是在某个地方调用
new BlogEntryDao(),容器可能不知道将它初始化为一个 bean。 -
@chrylis 是的,谢谢,我实际上正在调用新的 BlogEntryDao。
-
@chrylis 谢谢,将其更改为 EJB BlogEntryDao 修复了它。能否请您提供一个答案,以便我接受?
-
我觉得可以在bean配置文件中定义init-method="initialize"。
标签: java jakarta-ee ejb