2012-01-03 51 views
2

我对JSF和JPA做了一些研究。阅读一些教程,并遵循一些示例。在此之前,我会创建Managed Beans,Models和Services来处理我的应用程序。将JSF与JPA集成

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

+0

它实际上不回答你的问题。只是我们的经验。如果您正在创建公共站点并希望获得良好的性能,请不要使用JSF。我们用JSF获得了很多内存和CPU瓶颈。 – abdolence 2012-01-03 21:31:26

+0

谢谢!这更像是一个与JEE结合使用的个人项目。 – TGM 2012-01-03 21:38:04

回答

2

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

现在,更难的问题是:DAO /服务层应该是另一个JSF托管bean,EJB还是其他什么?这在某种程度上不如承认您想要分开JPA访问那么重要。

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

但是,如果您正在进行写入操作而不只是读取操作,那么您应该考虑拥有一个单独的服务层,您可以在其中声明事务 - 可能@Stateless如果您使用的是JSF,则EJB最有意义。

希望这会有所帮助!

+1

也 - 在我进入CDI之前,我已经写了一段时间了。你可能会发现它很有用,虽然你的里程可能会有所不同,它可能已经过时了。 http://wrschneider.blogspot.com/2011/09/jsf-jpa-without-ejb-or-spring.html – wrschneider 2012-01-03 21:30:08

+0

所以你说的是每个实体的CRUD(和其他方法)应该放在一个单独的课堂权利?在这种情况下,我不明白为什么我需要这个DAO层。 – TGM 2012-01-03 21:50:17

2

我是一个自学者,所以请原谅我的措辞,可能不合适。

如果您查看answer,可以找到NetBeans向导创建RESTful Web服务的链接。这肯定超出了你的问题的范围,但生成的DAO类非常有用,可以用于JSF项目。如果你想要的话,你可以删除JAX-RS RESTful注释,但保留其余部分。

然后我向Beans注入自动生成的Facade类(使用EJB注释)。在这些Facade和Entity类中,基本的JPA查询已经写好了。

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