持久性中是否需要<类>元素.xml?

2022-08-31 09:21:11

我有非常简单的持久性.xml文件:

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="1.0"
    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">

    <persistence-unit name="eventractor" transaction-type="RESOURCE_LOCAL">
        <class>pl.michalmech.eventractor.domain.User</class>
        <class>pl.michalmech.eventractor.domain.Address</class>
        <class>pl.michalmech.eventractor.domain.City</class>
        <class>pl.michalmech.eventractor.domain.Country</class>

        <properties>
            <property name="hibernate.hbm2ddl.auto" value="validate" />
            <property name="hibernate.show_sql" value="true" />
        </properties>
    </persistence-unit>

</persistence>

它的工作原理。

但是当我删除元素时,应用程序看不到实体(所有类都用)<class>@Entity

是否有任何自动机制来扫描类?@Entity


答案 1

持久性.xml具有您可以使用的。来自 Java EE 5 教程jar-file

<persistence>
    <persistence-unit name="OrderManagement">
        <description>This unit manages orders and customers.
            It does not rely on any vendor-specific features and can
            therefore be deployed to any persistence provider.
        </description>
        <jta-data-source>jdbc/MyOrderDB</jta-data-source>
        <jar-file>MyOrderApp.jar</jar-file>
        <class>com.widgets.Order</class>
        <class>com.widgets.Customer</class>
    </persistence-unit>
</persistence>

此文件定义了一个名为 的持久性单元,它使用可识别 JTA 的数据源。和 元素指定托管持久性类:实体类、可嵌入类和映射超类。该元素指定对包含托管持久性类的打包持久性单元可见的 JAR 文件,而该元素显式命名托管持久性类。OrderManagementjdbc/MyOrderDBjar-fileclassjar-fileclass

在Hibernate的情况下,看看第2章。设置和配置也可查看更多详细信息。

编辑:实际上,如果您不介意不符合规范,那么即使在Java SE中,Hibernate也支持自动检测。为此,请添加以下属性:hibernate.archive.autodetection

<persistence-unit name="eventractor" transaction-type="RESOURCE_LOCAL">
  <!-- This is required to be spec compliant, Hibernate however supports
       auto-detection even in JSE.
  <class>pl.michalmech.eventractor.domain.User</class>
  <class>pl.michalmech.eventractor.domain.Address</class>
  <class>pl.michalmech.eventractor.domain.City</class>
  <class>pl.michalmech.eventractor.domain.Country</class>
   -->

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

    <property name="hibernate.hbm2ddl.auto" value="validate" />
    <property name="hibernate.show_sql" value="true" />
  </properties>
</persistence-unit>

答案 2

Java SE 环境中,根据规范,您必须像执行的那样指定所有类

必须在 Java SE 环境中指定所有命名的托管持久性类的列表,以确保可移植性

如果不打算将持久性单元根中包含的带注释的持久性类包含在持久性单元中,则应使用排除未列出的类元素。排除未列出的类元素不适用于 Java SE 环境。

(JSR-000220 6.2.1.6)

Java EE 环境中,您不必执行此操作,因为提供程序会为您扫描注释。

非正式地,你可以尝试设置你的持久性.xml。此参数默认为 EE 和 SE 中。据我所知,EclipseLinkToplink都支持这一点。但是,如上所述,根据规范,您不应该依赖它在SE中工作。<exclude-unlisted-classes>false</exclude-unlisted-classes>falsetrue

您可以尝试以下操作(在 SE 环境中可能有效,也可能不起作用):

<persistence-unit name="eventractor" transaction-type="RESOURCE_LOCAL">
     <exclude-unlisted-classes>false</exclude-unlisted-classes>

    <properties>
            <property name="hibernate.hbm2ddl.auto" value="validate" />
            <property name="hibernate.show_sql" value="true" />
    </properties>
</persistence-unit>

推荐