我做了一些关于JSF和JPA的研究。阅读一些教程并遵循一些示例。在此之前,我将创建托管豆,模型和服务来处理我的应用程序。
将JPA纳入此模式的最佳做法是什么?我应该在同一个Service类中包含JPQL查询和数据库调用吗?在一些例子中,我看到JPA在与Invoke应用程序阶段中调用的方法相同的托管bean中实现,或者我看到在其他托管bean中实现了JPA?使用这两种方法的常见做法是什么?
答案 0 :(得分:2)
您应该将JPA访问权限合并到这种或那种DAO或服务层中,如果没有其他原因,您可以将该DAO层存根以进行单元测试。然后,所有JSF托管bean都将通过该类路由其JPA访问。这样,无论何时从JSF托管bean访问JPA,您都可以模拟单个DAO方法调用,而不是单独模拟EntityManager
,Query
等。
现在,更难的问题是:DAO /服务层应该是另一个JSF托管bean,EJB还是其他什么?从某种意义上讲,这比确认您想要分离JPA访问权限更重要。
就个人而言,我开始使用@ManagedProperty
进行注射,将DAO作为另一种JSF托管bean。然后我在Java EE 6中发现了CDI,并用@Named
/ @Inject
代替了它们。
如果您正在进行写入而不仅仅是读取,那么您应该考虑使用单独的服务层来声明事务 - 可能@Stateless
如果您使用JSF,则EJB最有意义。
希望这有帮助!
答案 1 :(得分:2)
我是一名自学者,所以请原谅我可能不合适的措辞。
如果查看此answer,可以使用NetBeans的向导链接来创建RESTful Web服务。这肯定超出了您的问题的范围,但生成的DAO类非常有用,可以用于JSF项目。如果需要,可以删除JAX-RS RESTful注释,但保留其余部分。
然后我将自动生成的Facade类注入到我的Beans中(使用EJB注释)。在这些Facade和Entity类中,已经编写了基本JPA查询。
如果您需要创建更复杂的查询,还可以使用类型安全Criteria API而不是JPQL。最初的努力更大,但Criteria API允许您以OO方式编写复杂查询,这在具体情况下也很有用,例如在“WHERE”语句中使用多个条件(其数量是动态生成的,如{{ 1}})。