【问题标题】:Integrate JSF with JPA将 JSF 与 JPA 集成
【发布时间】:2012-02-01 20:16:51
【问题描述】:

我对 JSF 和 JPA 做了一些研究。阅读一些教程并遵循一些示例。在此之前,我会创建托管 Bean、模型和服务来处理我的应用程序。

在此模式中包含 JPA 的最佳实践是什么?我应该在同一个服务类中包含 JPQL 查询和数据库调用吗?在某些示例中,我看到 JPA 在与 Invoke 应用程序阶段调用的方法相同的托管 bean 中实现,或者我看到 JPA 在其他托管 bean 中实现?使用这两者的常见做法是什么?

【问题讨论】:

  • 实际上没有回答你的问题。只是我们的经验。如果您正在创建公共站点并希望获得良好的性能,请不要使用 JSF。 JSF 遇到了很多内存和 CPU 瓶颈。
  • 谢谢!使用 JEE 更​​像是一个个人项目。

标签: java jsf jpa


【解决方案1】:

您应该将您的 JPA 访问权限整合到一种或另一种 DAO 或服务层中,如果没有其他原因,您可以将 DAO 层存根用于单元测试。然后,所有 JSF 托管 bean 将通过该类路由它们的 JPA 访问。这样,无论何时从 JSF 托管 bean 访问 JPA,您都可以模拟单个 DAO 方法调用,而不是单独模拟 EntityManagerQuery 等。

现在,更难的问题是:DAO/服务层应该是另一个 JSF 托管 bean、EJB 还是其他什么东西?从某种意义上说,这比承认您想要分离 JPA 访问更重要。

就个人而言,我开始使用@ManagedProperty 进行注入将DAO 作为JSF 托管bean 的另一种风格。然后我在 Java EE 6 中发现了 CDI,并将它们改为使用 @Named/@Inject 的 POJO。

但是,如果您正在执行写入而不仅仅是读取,则应该考虑使用一个单独的服务层来声明事务 - 如果您使用 JSF,可能@Stateless EJB 最有意义。

希望这会有所帮助!

【讨论】:

  • 还有 - 我在进入 CDI 之前就写过这篇文章。您可能会发现它很有用,尽管您的里程可能会有所不同并且可能已经过时。 wrschneider.blogspot.com/2011/09/…
  • 所以你是说每个实体的 CRUD(和其他方法)都应该放在一个单独的类中,对吧?在这种情况下,我不明白我为什么需要这个 DAO 层。
【解决方案2】:

我是自学者,所以请原谅我的措辞可能不恰当。

如果您查看此answer,则有一个指向 NetBeans 向导的链接,用于创建 RESTful Web 服务。这肯定超出了您的问题范围,但生成的 DAO 类确实很有帮助,可用于 JSF 项目。如果您愿意,可以删除 JAX-RS RESTful 注释,但保留其余部分。

然后我将自动生成的 Facade 类注入到我的 Bean 中(利用 EJB 注释)。在这些 Facade 和 Entity 类中,已经编写了基本的 JPA 查询。

如果您需要创建更复杂的查询,您也可以使用类型安全的Criteria API 而不是 JPQL。最初的工作量更大,但 Criteria API 允许您以 OO 方式编写复杂的查询,这在具体情况下也很有帮助,例如在“WHERE”语句中使用多个条件(其编号是动态生成的,如 @987654323 @)。

【讨论】:

    猜你喜欢
    • 2011-02-05
    • 2011-02-18
    • 1970-01-01
    • 2012-09-18
    • 1970-01-01
    • 1970-01-01
    • 2020-07-05
    • 2012-12-24
    相关资源
    最近更新 更多