繁体   English   中英

JPA2 EntityManager为null

[英]JPA2 EntityManager is null

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

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

我的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

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

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

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

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

问题是你将“Active Record”模式与“DAO”模式混淆了。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM