0

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

我正在通过我的和我的管理类测试持久性,我用注释index.xhtml实例化了 EntityManager 。@PersistenceContext每次运行此示例时,我都会在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/In19rXgetUserByUsername当我通过 UserView http://bit.ly/In1ta6 (会话范围)调用方法时,它仍然给了我一个 NPE 。仍然没有运气,错误在 EntityManager 创建上,这是我的 stackTrace:http://pastie.org/3814236

4

2 回答 2

1

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

  • Backing beans - 用于 UI 的托管 bean,您可以在 XHTML 中使用它们。
  • 服务层,也就是你所说的 DAO——实现基本业务逻辑的无状态 bean

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

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

于 2012-04-18T12:50:17.850 回答
1

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

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

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

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

于 2012-04-18T13:19:00.780 回答