[java] persistence.xml에 <class> 요소가 필요합니까?

매우 간단한 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>요소를 제거하면 응용 프로그램에 엔티티가 표시되지 않습니다 (모든 클래스에으로 주석 처리됨 @Entity).

@Entity클래스 를 스캔하는 자동 메커니즘이 있습니까?



답변

persistence.xml에는 jar-file사용할 수있는가 있습니다. 에서 자바 EE 5 튜토리얼 :

<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>

이 파일은 OrderManagementJTA 인식 데이터 소스를 사용하는 라는 지속성 단위를 정의합니다 jdbc/MyOrderDB. jar-fileclass엔티티 클래스 임베드 클래스 및 매핑 수퍼 : 요소 영속성 관리 클래스를 지정한다. jar-file그동안 클래스 영속성 관리 포함하는 패키지 퍼시스턴스 유닛에게 표시 소자 지정 JAR 파일 class소자 명시 클래스 이름은 영속성 관리.

Hibernate의 경우 Chapter2를 살펴보십시오 . 자세한 내용은 설정 및 구성 도 참조하십시오.

편집 : 실제로 사양을 준수하지 않아도 괜찮다면 Hibernate는 Java SE에서도 자동 감지를 지원합니다. 이렇게하려면 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>


답변

에서 자바 SE 환경, 사양에 의해 모든 클래스를 지정해야 당신이했던 것처럼 :

이식성을 보장하려면 모든 명명 된 관리 지속성 클래스 목록을 Java SE 환경에 지정해야합니다.

지속성 단위의 루트에 포함 된 어노테이션이있는 지속성 클래스가 지속성 단위에 포함되도록 의도되지 않은 경우 exclude-unlisted-classes 요소를 사용해야합니다. exclude-unlisted-classes 요소는 Java SE 환경에서 사용하기위한 것이 아닙니다.

(JSR-000220 6.2.1.6)

에서 자바 EE 환경, 당신은하지 않습니다 당신을위한 주석 공급자 스캔으로이 작업을 수행 할 수 있습니다.

비공식적으로 <exclude-unlisted-classes>false</exclude-unlisted-classes>persistence.xml에서 설정 을 시도 할 수 있습니다 . 이 매개 변수의 기본값 false은 EE 및 trueSE입니다. 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>


답변

persistence.xml에 Class 요소가 필요합니까?

아니요, 반드시 그런 것은 아닙니다. 다음은 Eclipse에서 수행하는 방법입니다 (Kepler 테스트 됨).

프로젝트를 마우스 오른쪽 버튼으로 클릭하고 속성을 클릭 한 다음 JPA를 선택 하고 지속성 클래스 관리 틱에서 자동으로 어노테이션이있는 클래스 발견을 선택하십시오 .

여기에 이미지 설명 입력


답변

Spring에서 JPA를 실행하는 경우 3.1 버전부터 packagesToScan속성을 설정 LocalContainerEntityManagerFactoryBean하고 persistence.xml을 모두 제거 할 수 있습니다 .

여기에 낮은 다운


답변

jar-file컴파일 된 클래스가있는 폴더에 대한 요소 경로를 제공 할 수 있습니다 . 예를 들어 몇 가지 통합 테스트에 persistence.xml을 준비 할 때 다음과 같은 내용을 추가했습니다.

 <jar-file>file:../target/classes</jar-file>


답변

JPA 2+의 경우 이것은 트릭을 수행합니다.

 <jar-file></jar-file>

주석이 달린 @Entity 클래스에 대해 전쟁의 모든 항아리를 스캔하십시오.


답변

Hibernate는 <exclude-unlisted-classes>false</exclude-unlisted-classes>SE에서 지원하지 않습니다 (다른 포스터가 TopLink 및 EclipseLink에서 작동한다고 언급했습니다).

IntelliJ의 Import Database Schema 마법사와 같이 persistence.xml에 클래스 목록을 자동 생성하는 도구가 있습니다. persistence.xml에 프로젝트의 초기 클래스가 있으면 프로젝트가 진행됨에 따라 단일 클래스를 직접 추가 / 제거하는 것이 간단해야합니다.