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

时间:2010-09-23 00:45:29

标签: java orm 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)。

2 个答案:

答案 0 :(得分:4)

在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文件的附加内容或附加内容   和映射文件。任何映射   在这些上找到元数据注释   课程将被处理,或者他们   将使用映射进行映射   注释默认值。类元素   用于列出托管持久性   类。 所有已命名的托管列表   必须指定持久性类   在Java SE环境中进行保险   可移植性。便携式Java SE   应用程序不应该依赖于   这里描述的其他机制   指定托管持久性   持久性单元的类。   持久性提供者也可能需要   那组实体类和   要管理的类必须是   在每一个中完全列举   Java SE中的persistence.xml个文件   的环境中。

     

根目录中包含的所有类   还搜索了持久性单元   用于注释的托管持久性   类和任何映射元数据   在他们身上发现的注释将是   已处理,或将被映射   使用映射注释默认值。   如果不打算那样的话   带注释的持久性类   包含在根   持久性单位包括在内   持久性单位   exclude-unlisted-classes元素   应该使用。的的   exclude-unlisted-classes元素是   不适用于Java SE   的环境中。

     

管理的最终实体集   由持久性单位是联盟   这些来源,与映射   元数据注释(或注释   默认值)对于任何给定的类   被XML映射覆盖   信息文件,如果有的话   注释以及XML映射   为那堂课。最小便携式   压倒一级的水平   持久性字段或属性。

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

如果担心可移植性,使用像Spring这样的第三方容器会有所帮助。

答案 1 :(得分:0)

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