在persistence.xml之外定义jpa实体类

有没有办法在persistence.xml之外定义jpa实体类(即在单独的文件中)?

能够将persistence.xml作为外部文件也足够了。

先谢谢,史蒂文

编辑:对不起,我不清楚。 这是在Java SE环境中。 另外,我想在persistence.xml文件中没有some.class.AClass的列表。 这是因为我想动态创建这个类列表并引用包含该列表的文件。

Edit2:通过在打包之前在构建时编写persistence.xml文件来管理解决此问题。 如果有人感兴趣,我使用scannotations来发现所有使用@Entity注释的类,并将它们写入target / classes / META-INF中的persistence.xml文件(使用maven)。

在Java SE环境中,可移植应用程序必须persistence.xml显式列出类。 从JPA 1.0规范:

6.2.1.6 mapping-file,jar-file,class,exclude-unlisted-classes

必须将以下类隐式或显式地表示为要包含在持久性单元中的托管持久性类:实体类; 可嵌入的课程; 映射的超类。

由持久性单元管理的托管持久性类集通过使用以下一个或多个来定义:

  • 一个或多个对象/关系映射XML文件
  • 将搜索类的一个或多个jar文件
  • 明确的类列表
  • 包含在持久性单元的根中的带注释的托管持久性类(除非指定了exclude-unlisted-classes元素)

(……)

还可以指定命名的托管持久性类列表,而不是JAR文件和映射文件。 将处理在这些类上找到的任何映射元数据注释,或者使用映射注释默认值映射它们。 class元素用于列出托管持久性类。 必须在Java SE环境中指定所有命名的托管持久性类的列表,以确保可移植性。 可移植Java SE应用程序不应依赖此处描述的其他机制来指定持久性单元的托管持久性类。 持久性提供程序还可能要求必须在Java SE环境中的每个persistence.xml文件中完全枚举要管理的实体类和类集。

持久性单元的根中包含的所有类也将搜索带注释的托管持久性类,并且将处理在其上找到的任何映射元数据注释,或者将使用映射注释默认值对它们进行映射。 如果不打算将持久性单元的根中包含的带注释的持久性类包含在持久性单元中,则应使用exclude-unlisted-classes元素。 exclude-unlisted-classes元素不适用于Java SE环境。

由持久性单元管理的结果实体集是这些源的并集,如果同时存在注释和XML映射,则XML映射信息文件将覆盖任何给定类的映射元数据注释(或注释缺省值)。那个class。 最低可覆盖的可移植级别是持久字段或属性的级别。

如果不考虑可移植性,某些提供程序确实支持Java SE环境中的实体发现(例如,EclipseLink, Hibernate )。

如果可移植性是一个问题,使用像Spring这样的第三方容器会有所帮助。

如果您愿意并且能够将实体类与persistence.xml文件一起打包在JAR文件中,那么您不需要在元素中列出每个实体。 当在META-INF目录中使用persistence.xml文件部署JAR时,将在运行时搜索具有@Entity注释的任何类的JAR。