在 SE 环境中将 JPA 实体 jar 与持久性.xml分离

2022-09-04 22:04:09

有没有办法在多个 SE 应用程序中重用带有 JPA 注释实体的 jar(作为依赖项)?<jar-file>在持久性中.xml在SE环境中不受支持,那么还有另一种方法吗?


答案 1

正式地(根据规范),您必须使用class元素指定所有。引用 JSR-2206.2.1.6 章映射文件、jar 文件、类、排除未列出的类

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

现在,如果您不介意不具有可移植性,Hibernate支持在Java SE中使用该元素(在这种情况下,需要一个绝对的url,而不是方便)。休眠实际上也支持自动检测,即使在JSE中也是如此。好多了:jar-file

<persistence xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"
  version="1.0">
  <persistence-unit name="foo">

    <!-- This is required to be spec compliant, Hibernate however supports auto-detection even in JSE. -->
    <class>foo.Bar<class>

    <properties>
      <!-- Scan for annotated classes and Hibernate mapping XML files -->
      <property name="hibernate.archive.autodetection" value="class, hbm"/>
      ...
    </properties>
  </persistence-unit>

</persistence>

答案 2

据我所知,没有办法让类扫描注释在该配置中工作。但是,您可以将持久性.xml文件显式指向每个实体类。

<persistence xmlns="http://java.sun.com/xml/ns/persistence"
                     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                     xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"
                     version="1.0">

  <persistence-unit name="punit">

    <provider>org.hibernate.ejb.HibernatePersistence</provider>

    <jta-data-source>java:/myDS</jta-data-source>

    <!-- Must be explicit as classes are in separate jar -->
    <class>com.foo.Bar</class>
    <class>com.foo.Baz</class>

    <properties/>      
  </persistence-unit>

</persistence>

推荐