问题

我有非常简单的persistance.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>elements时,应用程序看不到实体(所有类都注明了@Entity)。

有没有自动机制扫描2,350401781类?


#1 热门回答(75 赞)

persistence.xml有一个可以使用的jar-file。 Fromthe Java EE 5 tutorial

<persistence>

    <persistence-unit name ="OrderManagement">
        <description>该单位管理订单和客户。
            它不依赖于任何特定于供应商的功能而且可以
            因此可以部署到任何持久性提供程序。
        </描述>
        <JTA数据源> JDBC / MyOrderDB </ JTA - 数据 - 源>
        <罐子文件> MyOrderApp.jar </罐文件>
        <类> com.widgets.Order </类>
        <类> com.widgets.Customer </类>
    </持久性单元>
</持久>

此文件定义名为OrderManagement的持久性单元,该单元使用支持JTA的数据源jdbc/MyOrderDBjar-fileclasselements指定托管持久性类:实体类,可嵌入类和映射的超类。 305205​​208element指定对包含托管持久性类的打包持久性单元可见的JAR文件,而classelement明确命名托管持久性类。

在Hibernate的情况下,请查看Chapter2. Setup and configurationtoo以获取更多详细信息。

**编辑:**实际上,如果你不介意不符合规范,即使在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 热门回答(40 赞)

InJava SE环境,根据规范,你必须指定已完成的所有类

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

如果不打算将持久性单元的根中包含的带注释的持久性类包含在持久性单元中,则应使用exclude-unlisted-classes元素。 exclude-unlisted-classes元素不适用于Java SE环境。

(JSR-000220 6.2.1.6)

Java EE环境中,当提供程序为你扫描注释时,你没有这样做

非正式地,你可以尝试在persistence.xml中设置set<exclude-unlisted-classes>false</exclude-unlisted-classes>。此参数默认为EE中的false和SE中的true。到目前为止,EclipseLinkToplink都支持这个。但如上所述,根据规范,你不应该依赖它在SE工作。

你可以尝试以下操作(在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>

#3 热门回答(14 赞)

我是否需要persistence.xml中的Class元素?

不,你不一定。以下是在Eclipse中执行此操作的方法(Kepler测试):

右键单击该项目,单击Properties,selectJPA,inPersistence class managementtick自动发现带注释的类

enter image description here


原文链接