JPA 2.0:自动从不同的jar*向PersistenceUnit*添加实体类

Ond*_*žka 38 configuration entity entities hibernate jpa-2.0

我有一个maven构建的基于CDI的Java SE应用程序,它有一个核心模块和其他模块.
核心有persistence.xml一些实体.模块有其他实体.

如何将实体添加到持久性单元的聚光灯下?

我已阅读Hibernate手册,http://docs.jboss.org/hibernate/stable/entitymanager/reference/en/html/configuration.html#setup-configuration-packaging

我也看过这些问题

我正在寻找一个解决方案,其中Hibernate将扫描所有加载的类,或者,将从其他罐中获取一些配置文件(例如CDI所做的beans.xml).

我的应用程序不使用Spring.我不坚持可移植性 - 我会坚持使用Hibernate.

  • 有一些这样的解决方案吗?
  • 有没有办法从程序创建PU persistence.xml并向其添加类?
  • EntityManagerFactory可以在创建后添加@Entity类吗?

更新:我发现org.?hibernate.?ejb.?Ejb3Configuration:

public Ejb3Configuration configure(String persistenceUnitName, Map integration)  
Run Code Online (Sandbox Code Playgroud)

http://docs.jboss.org/hibernate/entitymanager/3.6/javadocs/

Adr*_*hum 11

有几种方法可以解决它:

  1. 我在persistence.xml中需要<class>元素中所述?,你可以设置hibernate.archive.autodetection属性,Hibernate应该能够从classpath中查找所有带注释的类.但是,这不符合JPA规范.

  2. 如果您正在使用Spring,从Spring 3.1.2(或者甚至可能更早一点)开始LocalContainerEntityManagerFactoryBean,您可以定义packageToScan哪个将要求LocalContainerEntityManagerFactoryBean在类路径中扫描以查找所有带注释的类.同样,不符合JPA规范.

  3. 我使用Maven作为构建工具.几年前,我编写了一个小插件,它将在构建过程中生成persistence.xml.该插件将从构建类路径扫描以找出所有带注释的类,并在生成的persistence.xml中列出它们.这是最乏味的,但结果是JPA规范兼容.一个缺点(不适用于我认为的大多数人)是查找发生在构建时,而不是运行时.这意味着如果您的应用程序仅在部署/运行时但不是构建时提供实体JAR,则此方法不起作用.


Ign*_*aca 7

Ejb3Configuration已在4.3.0中删除.如果您不想创建Hibernate的Integrator,则可以使用该属性hibernate.ejb.loaded.classes.

properties.put(org.hibernate.jpa.AvailableSettings.LOADED_CLASSES, entities);
Persistence.createEntityManagerFactory("persistence-unit", properties);
Run Code Online (Sandbox Code Playgroud)

哪里entitiesList<Class>实体类的.


小智 6

我有一个稍微不同的设置,我将persistence.xml放在WAR文件中,但是它的一些依赖包括@Entity注释被归类为包含在持久性单元中.

我已经使用Maven解决了我的问题,有点像#3中描述的Adrian Shum,但是使用该元素来包含要扫描的jar用于@Entity注释.

我为my-web/pom.xml添加了一个属性,用于包含额外实体的每个依赖项.我所有的罐子都是Maven多项目构建的一部分,所以对我来说它看起来像.

<properties>
    <common.jar>common-${project.version}.jar</common.jar>
    <foo.jar>foo-${project.version}.jar</foo.jar>
</properties>
Run Code Online (Sandbox Code Playgroud)

之后我将以下内容添加到persistence.xml中

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0" ... >
    <persistence-unit name="primary">
        <jta-data-source>java:jboss/datasources/mysource</jta-data-source>

        <jar-file>lib/${common.jar}</jar-file>
        <jar-file>lib/${foo.jar}</jar-file>

        ...
    </persistence-unit>
</persistence>
Run Code Online (Sandbox Code Playgroud)

最后,我在web/pom.xml中配置maven-resource-plugin,将persistence.xml中的$表达式替换为POM中设置的属性

<build>
  <resources>
    <resource>
      <directory>src/main/resources</directory>
      <filtering>true</filtering>
      <includes>
        <include>**/persistence.xml</include>
      </includes>
    </resource>
    <resource>
      <directory>src/main/resources</directory>
      <filtering>false</filtering>
      <excludes>
        <exclude>**/persistence.xml</exclude>
      </excludes>
    </resource>
  </resources>
  ...
</build>
Run Code Online (Sandbox Code Playgroud)


Ada*_*yga 3

我也遇到过同样的问题,不幸的是没有简单的解决方案,基本上看起来 JPA 并不是设计用于这种方式的。解决方案之一是每个顶级项目(应用程序)只有一个persistence.xml。它有点类似于 log4j 配置。persistence.xml 必须列出所有类(使用<class>),或者,如果它不是 Java SE 应用程序,则列出 jar 文件(使用<jar-file>应用程序使用的 jar 文件(使用 )。通过这种方式,您可以将多个模块(jar)中的实体放入单个持久性单元中。缺点很明显:您必须在一个文件中列出所有内容。

编辑:我(可能)找到了另一个使用 XML 映射文件的解决方案,请在此处查看:多个 jars,单个持久单元解决方案?