2014-09-30 1 views
5

DbUnit의 공통적 인 문제에 대해 적절한 해결책을 찾았 기 때문에이 질문을 나중에 참조 할 때 묻고 답할 것입니다. 누군가가 어딘가에 도움이되기를 바랍니다.DbUnit이 클린 삽입하지 못함 : 외래 키 제약

나는 DbUnit 2.5.0TestNG 6.8.8을 사용하고 있습니다. 나의 유스 케이스는 3 개의 엔티티로 구성된 데이터베이스의 일부분이다. AdministrableUserGroup에 대한 외래 키를 보유하는 ServiceUser이 있습니다.

는 이런 결과는 XMLDataSet (생략 된 데이터)에 따르는 http://city81.blogspot.com/2011/03/testing-jpa-entities-using-dbunit.html

public abstract class AbstractDatabaseTest { 
    protected EntityManager em; // initialized elsewhere 
    private IDatabaseConnection connection; 
    private IDataSet dataset; 

    @BeforeClass 
    private void setupDatabaseResource() throws Exception { 
     // using Hibernate 
     connection = new DatabaseConnection(((SessionImpl) (em.getDelegate())).connection()); 
     connection.getConfig().setProperty(DatabaseConfig.PROPERTY_DATATYPE_FACTORY, new HsqldbDataTypeFactory()); 

     // full database export 
     IDataSet fullDataSet = connection.createDataSet(); 

     final String datasetPath = String.format("%s%s", RESOURCE_FOLDER, "Testing.xml"); 
     FlatXmlDataSet.write(fullDataSet, new FileOutputStream(datasetPath)); 

     FlatXmlDataSetBuilder flatXmlDataSetBuilder = new FlatXmlDataSetBuilder(); 
     flatXmlDataSetBuilder.setColumnSensing(true); 
     dataset = flatXmlDataSetBuilder.build(new FileInputStream(datasetPath)); 
    } 

    @AfterMethod 
    public void cleanDB() throws Exception { 
     em.getTransaction().begin(); 
     DatabaseOperation.CLEAN_INSERT.execute(connection, dataset); 
     em.getTransaction().commit(); 
    } 
} 

에서 코드 예의 대부분 따랐다

<dataset> 
    <administrable/> 
    <serviceuser/> 
    <usergroup/> 
</dataset> 

TestNG@AfterMethod을 실행하면, I는 다음을 얻을 예외 :

com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException 
Cannot delete or update a parent row: a foreign key constraint fails (`testing_db`.`serviceuser`, CONSTRAINT `FK_gyylcfbhpl2ukqs5rm7sq0uy8` FOREIGN KEY (`userGroup_id`) REFERENCES `usergroup` (`id`)) 

답변

11

위에서 만든 XMLDataSet은 테이블의 외래 키 제약 조건을 알지 못하며 알파벳순으로 테이블 목록을 만듭니다. 그러나 CLEAN_INSERT 연산은 테이블 목록을 가져 와서 역순으로 트래버스하고 참조 된 엔터티 (여기서는 UserGroup)보다 먼저 외부 키 참조 (여기서는 ServiceUser.userGroup_id)를 삭제해야합니다.

:

가 나는 DbUnit을 문서에 약간의 파고가 외래 키 종속성을 확인하고 적절하게 실체 주문하려고 데이터 세트를 만들기 위해 수정 된 접근 방식을 주도 Unitils doesn't workhttp://forum.spring.io/forum/spring-projects/data/12868-dbunit-test-fails-mysql-server-hates-me?p=337672#post337672

을 통해이 정보를 발견

IDataSet fullDataSet = new FilteredDataSet(new DatabaseSequenceFilter(connection), connection.createDataSet()); 

결과 :

<dataset> 
    <administrable/> 
    <usergroup/> 
    <serviceuser/> 
</dataset> 

이 의지 CLEAN_INSERT.

면책 조항 : 순환 종속성 또는 자체 참조 외래 키를 발견하지 못했으며이 수정 프로그램을 처리 할 수 ​​있는지 테스트하지 않았습니다.

+0

어디에서 코드 스 니펫을 넣었습니까? –

+0

나는 당신이 무엇을 요구하고 있는지 잘 모르겠습니다. 코드 스 니펫에 대해서는 아무 것도 말하지 않고 모든 관련 코드는 질문 또는 답변에서 사용할 수 있습니다. – blagae

+0

사용중인 코드 IDataSet 스 니펫. 그 파일은 어떤 파일에 있었습니까? –