2

我正在使用许多带有注释javax.persistence.Entity等的类。我的项目是关于生成关于 JPA 注释类的元数据而不是自身的持久性,所以我将它们用作测试用例。

我不想启动 Hibernate 或其他一些 JPA 提供程序,而是想以编程方式检查 - 我的单元测试的一部分 - 我的 JPA 声明确实有效。

最简单的方法是什么?

4

4 回答 4

4

只需创建最简单的SessionFactory或 EclipseLink 或 OpenJPA 提供的任何东西,EntityManagerFactory然后让他们验证它(如果需要,使用一些虚拟的内存数据库)。重新发明它太复杂了。

对于 Hibernate,这可以使用Configuration.buildMappings

@RunWith(Theories.class)
public class EntitiesAreValidTest {

    @DataPoints
    public static Class<?>[] entities = new Class[] {
        SimpleEntity.class,
        SimpleEntityWithTransientField.class,
        TwoFieldEntity.class
    };

    @Theory
    public void classHasValidConfiguration(Class<?> entityClass) {

        new AnnotationConfiguration().addAnnotatedClass(entityClass).buildMappings();
    }
}
于 2010-02-14T21:34:07.317 回答
1

在测试中使用具体的 JPA 提供程序有什么问题?结合嵌入式数据库(例如 Apache Derby),您可以重用确实已经实现的逻辑。另一个想法是检查 EclipseLink、Hibernate、OpenJPA 的源代码……看看你是否可以直接使用它。

于 2010-02-14T21:35:46.277 回答
0

我不确定是否有更简单的方法,但您可以使用反射来访问类的注释

Class class = Example.class;
Annotation[] annotations = class.getAnnotations();
于 2010-02-14T21:32:50.137 回答
0

如果您不信任 JPA 提供程序(或不想使用它们),请尝试将使用反射检索到的 JPA 注释(元数据)与使用ResultSetMetaData检索到的 JDBC 元数据进行协调(例如,请参见此处)。

我并不是说这很简单,但是通过正确的方法,您应该拥有一组相当紧凑的辅助方法来检查每个实体的基本定义。里程可能会有所不同,具体取决于您要涵盖多少 JPA 功能。

于 2010-02-14T21:46:45.247 回答