2012-09-04 4 views
1

나는 영속성과 트랜잭션 관리를 위해 JPA/HIbernate와 Spring을 사용하는 프로젝트를 진행 중이다. 이 응용 프로그램에는 동일한 데이터베이스 서버 (Sybase 환경)의 여러 카탈로그 및 스키마에서 매핑 된 테이블이 있습니다. 메모리 데이터베이스를 사용하여이 응용 프로그램에 대한 자동화 된 테스트 생성을 시작하기 위해persistence.xml에서 클래스 선언을 재사용하는 방법은 무엇입니까?

, 나는의 스키마 정보를 무시 대안 orm.xml 매핑 파일을 기본 persistence.xml에서 모두 동일한 개체를 나열하지만, ​​지정하는 다른 test-persistence.xml을 만들어야했습니다 클래스의 주석.

시험에 대한 나의 봄 구성의 중요한 부분은 다음과 같이이다 :

HSQLFixes
<bean id="hsqlFixes" class="com.example.app.util.HSQLFixes" /> 
<bean id="entityManagerFactory" 
     class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean" 
     depends-on="hsqlFixes"> 
    <property name="persistenceUnitName" value="puName" /> 
    <property name="persistenceXmlLocation" 
       value="META-INF/persistence-tests.xml" /> 
.... 
</bean> 

그냥 몇 가지 유형을 만드는 몇 가지 JDBC 문을 실행하는 콩입니다.

그리고 persistence-tests.xml에서 : 나는이 두 번째 파일의 생성을 자동화 할 수있는 느낌이 원인

<persistence-unit name="puName" transaction-type="RESOURCE_LOCAL"> 
    <mapping-file>META-INF/orm-tests-db1.xml</mapping-file> 
    <mapping-file>META-INF/orm-tests-db2.xml</mapping-file> 
    <mapping-file>META-INF/orm-tests-db3.xml</mapping-file> 
    ... followed by the same list of entities from persistence.xml 

지금, 나는 persistence.xmltest-persistence.xml의 클래스 목록의 중복을 제거하고 싶습니다.

엔티티를 추가/제거 할 때 두 XML 파일을 모두 변경할 필요가 없도록 어떻게 동적으로 처리 할 수 ​​있습니까?

+0

Maven을 사용하고 있습니까? –

+0

이것은 레거시 프로젝트입니다. Ant가 붙어 있습니다. – elias

답변

1

테스트 지속성 단위를 프로그래밍 방식으로 구성하여 여러 persistence.xml 또는 여러 지속성 단위를 피할 것을 제안합니다. 이 경우는 파일 대체를 맵핑하는 것과 관련하여 여러 스키마 요구 사항에 의해 조금 더 복잡해졌습니다. EntityManagerFactory를 생성 할 때 표준 속성을 쉽게 전달할 수 있지만이 경우에는 MutablePersistenceUnitInfo을 사용하여 PersistenceUnitPostProcessor을 사용하여 매핑 파일 참조를 추가해야합니다.

구성 방법에 대한 좋은 예는 Programmatically loading Entity classes with JPA 2.0?을 참조하십시오. MutablePersistenceUnitInfo에있는 API를 사용하면 매핑 파일 참조를 추가 할 수 있습니다. 클래스 ref에 관해서는, 복사 문제를 해결하는 후 처리 (테스트 설정에서만)에서 수정할 원본 persistence.xml에서 자동으로 이것을 얻습니다.

public class ConfigureTestMappingFiles implements PersistenceUnitPostProcessor { 
    private List<String> mappingFiles; 
    @Override 
    public void postProcessPersistenceUnitInfo(MutablePersistenceUnitInfo pui) { 
     if (mappingFiles != null) { 
      pui.getMappingFileNames().addAll(mappingFiles); 
     } 
    } 
    // ... getter and setter for mappingFiles 
} 

을하고, 구성에이처럼 등록 할 것입니다 :

그래서, 어쩌면 당신은이 같은 PersistenceUnitPostProcessor으로 끝낼 수있는이 도움이

<bean id="entityManagerFactory" 
    class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean" 
    depends-on="hsqlFixes"> 
    <property name="persistenceUnitName" value="programasPlanosEnsino" /> 
    <property name="persistenceXmlLocation" value="META-INF/persistence.xml" /> 
      ... 
    <property name="persistenceUnitPostProcessors"> 
     <list> 
      <bean class="com.example.test.ConfigureTestMappingFiles"> 
       <property name="mappingFiles"> 
        <list> 
         <value>META-INF/orm-tests-db1.xml</value> 
         <value>META-INF/orm-tests-db2.xml</value> 
         ... add more as needed 
        </list> 
       </property> 
      </bean> 
     </list> 
    </property> 

희망을.

+0

고마워, 친구! 당신이 말했듯이 MutablePersistenceUnitInfo를 사용하는 PersistenceUnitPostProcessor와 함께 작업 할 수 있습니다. :) – elias

+0

은 이것에 비틀 거리는 다음 사람을 위해 몇 가지 코드를 답에 추가했습니다. – elias

+0

편집 해 주셔서 감사합니다. 다행 이었기 때문에 다행! –

관련 문제