2010-04-12 2 views

답변

6

공식적으로 (사양에 따라), 당신은 class 요소을 사용하여 모든 클래스를 지정해야합니다. 장 6.2.1.6 매핑 파일, 항아리 파일, 클래스를 인용, 제외-목록에없는-클래스에게 JSR-220 : 이름 관리 지속성 클래스의 목록도 대신 지정 될 수있다

, 또는 추가 to, JAR 파일 및 매핑 파일. 이러한 클래스에서 발견 된 모든 매핑 메타 데이터 주석이 처리되거나 매핑 주석 기본값을 사용하여 매핑됩니다. class 요소는 관리되는 지속성 클래스를 나열하는 데 사용됩니다. 이식성을 보장하기 위해 모든 명명 된 관리 지속성 클래스의 목록을 Java SE 환경에 지정해야합니다.. 이식 가능한 Java SE 어플리케이션은, 영속 유닛의 관리 지속 클래스를 지정하기 위해서, 여기에 설명 된 다른기구에 의존해서는 안됩니다. 지속성 공급자는 관리 할 엔티티 클래스 및 클래스 집합을 Java SE 환경의 각 파일 persistence.xml에 완전히 열거해야한다고 요구할 수도 있습니다. 당신은 이식 할 수 없습니다되는 괜찮다면

지금, 자바 SE의 jar-file 요소를 사용하여 supports 최대 절전 모드 (이 경우 절대 URL이 편리하지 필요하다). Hibernate는 실제로 JSE에서도 자동 감지를 지원한다. 훨씬 좋음 :

<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

필자가 아는 한, 주석을 검색하는 클래스가 해당 구성에서 작동하도록하는 방법은 없습니다. 그러나 각 엔티티 클래스에서 persistence.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> 
1

이것은 내가 겪었던 문제였습니다. 전쟁 전개의 일부뿐만 아니라 여러 독립 실행 형 독립 실행 형을 실행해야하므로 약간 더 우선합니다.

여러 개의 persistence.xml 파일 및 스프링 리소스 로더 (jour file)를 사용하여 jar 파일을 참조하려고 시도 할 때 이상한 모양의 시도를하는 경우가 있습니다. .

개인적인 해킹은 모든 엔티티 jar에있는 리소스를 해결하고 URL jar 참조를 파싱하고 스프링 지속성 관리자를 사용하여 가상 엔티티의 jar-file 태그에 삽입합니다. persistence.xml

기술적 인 측면에서 볼 때 여러 가지 persistence.xml을 사용하지 않으려 고합니다.

public class SpringPersistenceUnitManager extends DefaultPersistenceUnitManager implements ApplicationContextAware { 

private final Logger log = LoggerFactory.getLogger(getClass()); 

private ApplicationContext ctx = null; 


private String jarLocationPattern; 

@Override 
protected void postProcessPersistenceUnitInfo(MutablePersistenceUnitInfo pui) { 
    super.postProcessPersistenceUnitInfo(pui); 
    try { 
     Resource[] resources = ctx.getResources("classpath*:applicationContext.xml"); 
     for (Resource res : resources) { 
      String resJar = resolveJar(res.getURL()); 
      if (!resJar.equals(pui.getPersistenceUnitRootUrl().toString())) { 
       log.info("Adding " + resJar + " to persistence context"); 
       pui.addJarFileUrl(new URL(resJar)); 
      } 
     } 
    } 
    catch (IOException e) { 
     log.error("error", e); 
    } 
} 

private String resolveJar(URL fileInJar) { 
    String path = fileInJar.getPath(); 
    return path.substring(0, path.indexOf('!')); 
} 

및 스프링 컨텍스트 물건 :

<util:properties id="hibernate.properties" location="classpath:hibernate.properties" /> 

<bean id="persistenceUnitManager" class="com.rokksoft.blackice.util.SpringPersistenceUnitManager" 
    p:defaultDataSource-ref="jdbcDataSourcePool" 
/> 

<bean id="emf" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean" lazy-init="true" 
    p:persistenceUnitManager-ref="persistenceUnitManager" 
    p:persistenceUnitName="blackicePU" 
    p:dataSource-ref="jdbcDataSourcePool" 
    p:jpaProperties-ref="hibernate.properties"> 
    <property name="jpaVendorAdapter"> 
     <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"/> 
    </property> 
</bean> 

당신이 이상적으로 생각 항아리 이름을 필터링 할 - 제 3 자 항아리에서 아무것도있을 수 있습니다.

2

제 경험으로는 이제 작동합니다.

우리가 사용하는 : 인 hibernate3.jar 3.6.0.Final 최대 절전 모드에서 JPA-2.0-API-1.0.0.Final.jar

< 항아리 파일> 파일을 ... </jar-file>은 상대 경로를 찾는 방법을 알고 있으며 jar 파일이나 디렉토리에서 작동합니다.

나는 두 번이 기능을 사용하고 있습니다 :

  • 을 항아리 내 기관 채 - 여러 응용 프로그램에 사용됩니다. 각 앱마다 고유 한 persistence.xml이 있습니다. 주로 다른 ehcache 설정을 제공합니다.
  • 모든 테스트를 원할 때 다른 모든 종속 프로젝트에서 엔티티 프로젝트의 모든 엔티티를 가리키는 단일 persistence.xml 파일을 갖기를 원할 때. 그런 다음 해당 프로젝트의 Bin 디렉토리를 가리키는 엔티티 프로젝트의 resources/META-INF에 persistence.xml을 보관합니다. < jar-file> : 엔티티/bin </jar- 파일>
관련 문제