2017-11-06 25 views
0

Arquillian을 사용하여 WildFly10/H2 데이터베이스에 대해 JPA/EJB 클래스를 테스트하고 있습니다. 엔티티 클래스의 기본 키는 GenerationType.TABLE입니다. /META-INF/persistence.xml의 지속성 단위 :WildFly10/Hibernate : 미리로드 된 테스트 데이터가 지속되지 않음

<persistence-unit name="test"> 
     <provider>org.hibernate.ejb.HibernatePersistence</provider> 
     <jta-data-source>java:/H2DS</jta-data-source> 
     <properties> 
      <property name="hibernate.dialect" value="org.hibernate.dialect.HSQLDialect" /> 

      <property name="javax.persistence.schema-generation.database.action" value="drop-and-create" /> 
      <property name="javax.persistence.schema-generation.create-source" value="script" /> 

      <property name="javax.persistence.schema-generation.create-script-source" value="META-INF/sql/create.sql" /> 
      <property name="javax.persistence.sql-load-script-source" value="META-INF/sql/load_script.sql" /> 

      <property name="javax.persistence.schema-generation.drop-source" value="script" /> 
      <property name="javax.persistence.schema-generation.drop-script-source" value="META-INF/sql/drop.sql" /> 
     </properties> 

    </persistence-unit> 

문제는, 가정 된 데이터가 load_script.sql에서 미리로드 할 수는 시험이 시작되는 시간에 최선을 다하고되지 않습니다. 로그에서 SQL 문을 테스트 데이터를 미리로드하여 "생성기 테이블"을 업데이트 할 수 있지만 기본 키 배치를 얻기 위해 "생성기 테이블"에 대한 쿼리를 볼 수 없습니다. 그러면 엔티티를 추가하려는 시도가 제약 조건 위반으로 끝납니다.

질문 : 테스트가 수행되기 전에 스크립트에서 미리로드 된 데이터가 지속되도록 Hibernate에서 확인하는 방법은 무엇입니까?

주 1 : 나는 EclipseLink가/Glassfish4이 문제를했다,하지만 모두가 (이전 스키마는 엔티티 클래스에서 생성 된) 스크립트의 스키마 및로드 데이터를 생성하여 해결할되었다.

참고 2 : 데이터를 미리로드하지 않고 테스트를 Glassgish4 및 WildFly10에서 모두 올바르게 실행할 수 있습니다.

+0

수행 할 수 있습니다 아마 더 정확하게 문제를 해결 또 다른 질문을 게시 한

<property name="hibernate.id.new_generator_mappings" value="false"/> 

을 ShrinkWrap 정의를 우리와 함께 나눌 수 있습니까? 아마 당신은 SQL 파일을 번들하지 않습니다. – lordofthejars

+0

@lordofthejars : 아니, 그건 분명히 사실이 아닙니다. 로그에서 스크립트의 삽입을 볼 수 있습니다. 문제는 JPA 제공자에게 다음과 같이 지시하는 방법입니다. 1) 데이터를 생성기 테이블로 플러시 한 다음 2) ID를 새로 할당하고 테이블을 업데이트합니다. 3) 테스트에서 엔티티를 지속합니다. 현재는 동일한 트랜잭션 내에서 3 단계를 모두 수행하려고 시도하지만 미리 할당 된 일부 ID가 스크립트의 엔터티에 이미 사용되었다는 사실을 무시합니다. – badbishop

답변

0

OK, 다소 최적 솔루션이 구현 고유의 옵션을 추가하는 것은 지속성 단위합니다 구성 : JPA 2.1 testing: persisting the pre-loaded data

+0

http://docs.jboss.org/hibernate/orm/5.2/userguide/html_single/Hibernate_User_Guide.html#configurations-hbmddl에서'javax.persistence.hibernate.hbm2ddl.import_files'를보십시오. "이 문은 스키마가 생성 된 경우에만 실행됩니다. 즉, hibernate.hbm2ddl.auto가 create, create-drop 또는 update로 설정되었음을 의미합니다." –

+0

@ JamesR.Perkins : 예, 감사합니다. 그 질문에 어떻게 관련이 있니? – badbishop

+0

사과드립니다. 내가 설정 한'javax.persistence.schema-generation.database.action' 속성을 놓쳤습니다. –