代码在这里: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
的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
答案 0 :(得分:1)
UserDAO需要是一个EJB bean,例如@Stateless使用@PersistenceContext注释。 好的设计模式是创造两层
您决定什么是业务逻辑以及什么是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。您只需要查看脚手架代码以了解正确的方法。