以编程方式检查类是否具有有效 JPA 定义的最简单方法

发布于 2024-08-21 06:41:01 字数 192 浏览 6 评论 0原文

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

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

最简单的方法是什么?

I'm working with many classes which are annotated with javax.persistence.Entity and the like. My project is about generating metadata about JPA-annotated classes rather than persistence by itself, so I'm using them as test cases.

Rather than firing up Hibernate or some other JPA provider, I'd like to programatically check - part of my unit tests - that my JPA declarations are indeed valid.

What's the easiest way of doing that?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

古镇旧梦 2024-08-28 06:41:01

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

对于 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();
    }
}

Just create the simplest possible SessionFactory or whatever EclipseLink or OpenJPA provide behind the EntityManagerFactory and let them validate it (using some dummy in-memory database, if needed). It's too complex to reinvent it.

For Hibernate this can be done using 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();
    }
}
一杆小烟枪 2024-08-28 06:41:01

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

Whats wrong about using a concrete JPA-provider in your tests? In combination with an embedded database (e.g. Apache Derby) you could reuse logic that has indeed already been implemented. Another idea would be to check the sources of EclipseLink, Hibernate, OpenJPA, ... to see whether you can directly use it.

南街九尾狐 2024-08-28 06:41:01

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

Class class = Example.class;
Annotation[] annotations = class.getAnnotations();

I'm not sure if there's an easier way but you can use Reflection to access the annotations of a class

Class class = Example.class;
Annotation[] annotations = class.getAnnotations();
浪推晚风 2024-08-28 06:41:01

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

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

If you don't trust JPA providers (or don't want to use them) then try to reconcile JPA annotations (metadata) retrieved using reflection with JDBC metadata retrieved using ResultSetMetaData (for example see here).

I don't mean this to be simple, but with right approach you should have rather compact set of helper methods to check basic definitions for each entity. And mileage may vary depending on how much JPA functionality you want to cover.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文