JPA2 EntityManager为null

时间:2012-04-17 21:25:43

标签: java mysql jpa jsf-2 persistence

代码在这里:http://github.com/knownasilya/Ambience

我正在通过index.xhtml测试持久性,在我的Admin类中,我使用@PersistenceContext注释实例化EntityManager。每次我运行这个例子,我都会在em.persist(another);获得NPE。

我的persistence.xml设置与Eclipse中的本地数据库配置具有相同的连接信息。如何找出错误的位置?

编辑以下是相关文件。

Index.xhtml https://github.com/knownasilya/Ambience/blob/master/g5.ambience/WebContent/index.xhtml

Admin.java https://github.com/knownasilya/Ambience/blob/master/g5.ambience/src/g5/ambience/user/admin/model/Admin.java

的persistence.xml https://github.com/knownasilya/Ambience/blob/master/g5.ambience/src/META-INF/persistence.xml

EDIT2 我创建了一个UserDAO,但是当我尝试在第24行专门创建EntityManager时,我仍然得到一个NPE

EntityManager em = emf.createEntityManager();

发生此错误Caused by: java.lang.NullPointerException at g5.ambience.user.UserDAO.<init>(UserDAO.java:24)

UserDAO.java https://github.com/knownasilya/Ambience/blob/master/g5.ambience/src/g5/ambience/user/UserDAO.java

EDIT3 我现在有3层抽象/封装。模型(持久性的getter / setter),业务逻辑和视图逻辑。

我的实体工厂在这里:http://bit.ly/HV4d11,这是一个应用程序范围的托管bean。然后我有ManagedUserBean http://bit.ly/In19rX,当我通过UserView http://bit.ly/In1ta6(会话作用域)调用getUserByUsername方法时,它仍然给我一个NPE。仍然没有运气,错误是在EntityManager创建,这是我的stackTrace:http://pastie.org/3814236

2 个答案:

答案 0 :(得分:1)

UserDAO需要是一个EJB bean,例如@Stateless使用@PersistenceContext注释。 好的设计模式是创造两层

  • 支持bean - 用于UI的托管bean,您可以在XHTML中使用它们。
  • 服务层,或称为DAO - 实现基本业务逻辑的无状态bean

您决定什么是业务逻辑以及什么是UI相关逻辑。

如果您使用JEE6 CDI解决方案,则无需在faces-config.xml中声明托管bean

答案 1 :(得分:1)

问题是您将“活动记录”模式与“DAO”模式混淆。

如果您想在Java中使用“Active Record”模式,最好的选择是使用Spring Roo或Play框架(&lt; 2.0)。

否则你会想要遵循传统的DAO +服务模式(我相信Roo 1.2.1现在支持这种模式)。

编辑:在回到这个问题后,我认真地建议您使用Spring Roo,这样您就可以看到不同的设计模式是如何工作的,因为Roo现在支持这两种模式。此外,它还将在许多其他事情中正确设置实体管理器。从长远来看,您不必使用Roo。您只需要查看脚手架代码以了解正确的方法。