使用适合验证JPA实现的Java断言

时间:2012-03-23 08:46:21

标签: java jpa glassfish eclipselink assert

我正在开发一个带有(几乎)vanilla Java EE 6堆栈(EJB,JPA,JSF等)的应用程序。我们在Glassfish 3上托管我们的应用程序,我们的持久性相关代码现在是100%纯JPA。

不幸的是,我们的应用程序的一部分必须使用Oracle 10g数据库中的存储过程。为了调用这个存储过程,我们决定使用EclipseLink(与Glassfish捆绑在一起的JPA实现)。

由于我们代码的(小)部分现在依赖于EclipseLink,我想知道如何验证这种依赖。依赖项未与应用程序打包在一起,但假设它们可在我们的部署平台(即Glassfish)上使用。

在我看来,我们的选择是:

  1. 不要做任何事情,只是让它失败。我认为这个解决方案是次优的,因为从来没有明确表示我们的代码假定存在EclipseLink。
  2. 在if语句中检查EclipseLink并抛出特定异常。

    if (!JpaHelper.isEclipseLink(entityManager)) {
        throw new InvalidJpaImplementationException();
    }
    
  3. 添加一个检查EclipseLink的断言,如果失败则抛出异常。

    assert JpaHelper.isEclipseLink(entityManager)) : "Blah!";
    
  4. 断言(选项3)是否是有效的解决方案?您更喜欢其他解决方案吗?哪一个,为什么?

2 个答案:

答案 0 :(得分:2)

由于您正在使用JPA,因此我不会使EclipseLink具体实现(因为必须符合JPA规范)。人们不应该关心他们正在使用的JPA提供商。

如果您决定转移(假设)Hibernate(如果您实现依赖性验证),您的代码可能会中断。 JPA规范的全部目的是开发人员根本不应该担心实现供应商产品。


如果您想使用Eclipse Link的存储过程,那么我建议您创建一个可以调用存储过程的引擎,而不管EntityManager。这样,它仍然不会担心JPA实现提供程序依赖性。可以找到如何使用Hibernate JPA调用StoredProcedure的示例here

答案 1 :(得分:0)

可以禁用断言,这会在出错时破坏您的代码。因此,官方更好的没有断言。如果将来其他实体管理器被删除,您仍然可以更好地删除测试而不是禁用断言。原因:你在“运气”,其他JPA使用另一个实现。也许只为InvalidJpaImplementationException记录也更简单。