我正在开发一个带有(几乎)vanilla Java EE 6堆栈(EJB,JPA,JSF等)的应用程序。我们在Glassfish 3上托管我们的应用程序,我们的持久性相关代码现在是100%纯JPA。
不幸的是,我们的应用程序的一部分必须使用Oracle 10g数据库中的存储过程。为了调用这个存储过程,我们决定使用EclipseLink(与Glassfish捆绑在一起的JPA实现)。
由于我们代码的(小)部分现在依赖于EclipseLink,我想知道如何验证这种依赖。依赖项未与应用程序打包在一起,但假设它们可在我们的部署平台(即Glassfish)上使用。
在我看来,我们的选择是:
在if语句中检查EclipseLink并抛出特定异常。
if (!JpaHelper.isEclipseLink(entityManager)) {
throw new InvalidJpaImplementationException();
}
添加一个检查EclipseLink的断言,如果失败则抛出异常。
assert JpaHelper.isEclipseLink(entityManager)) : "Blah!";
断言(选项3)是否是有效的解决方案?您更喜欢其他解决方案吗?哪一个,为什么?
答案 0 :(得分:2)
由于您正在使用JPA,因此我不会使EclipseLink具体实现(因为必须符合JPA规范)。人们不应该关心他们正在使用的JPA提供商。
如果您决定转移(假设)Hibernate(如果您实现依赖性验证),您的代码可能会中断。 JPA规范的全部目的是开发人员根本不应该担心实现供应商产品。
如果您想使用Eclipse Link的存储过程,那么我建议您创建一个可以调用存储过程的引擎,而不管EntityManager
。这样,它仍然不会担心JPA实现提供程序依赖性。可以找到如何使用Hibernate JPA调用StoredProcedure的示例here。
答案 1 :(得分:0)
可以禁用断言,这会在出错时破坏您的代码。因此,官方更好的没有断言。如果将来其他实体管理器被删除,您仍然可以更好地删除测试而不是禁用断言。原因:你在“运气”,其他JPA使用另一个实现。也许只为InvalidJpaImplementationException记录也更简单。