2014-10-04 10 views
0

DbUnit 프레임 워크를 사용하여 JPA 엔티티 bean을 단위 테스트하고 있습니다. DB 테이블에서 엔티티를 생성했습니다. 또한 DbUnit이 테스트를 실행하는 동안 사용할 수있는 XML 파일로 DB 데이터를 내 보냅니다. DbUnit + HSQLDB + JPA 엔티티 : 무결성 제약 조건 위반 : 고유 제한 조건 또는 인덱스 위반. UK_25T4P9GXGVRCC8R3VL93JKAJE 표 : NEW_TAB

그러나으로 모든 테스트를 위해 나는 오류가 발생 :

Caused by: org.hsqldb.HsqlException: integrity constraint violation: unique constraint or index violation; UK_25T4P9GXGVRCC8R3VL93JKAJE table: NEW_TAB 
    at org.hsqldb.error.Error.error(Unknown Source) 
    at org.hsqldb.Constraint.getException(Unknown Source) 
    at org.hsqldb.index.IndexAVLMemory.insert(Unknown Source) 
    at org.hsqldb.persist.RowStoreAVL.indexRow(Unknown Source) 
    at org.hsqldb.TransactionManager2PL.addInsertAction(Unknown Source) 
    at org.hsqldb.Session.addInsertAction(Unknown Source) 
    at org.hsqldb.Table.insertSingleRow(Unknown Source) 
    at org.hsqldb.StatementDML.insertSingleRow(Unknown Source) 
    at org.hsqldb.StatementInsert.getResult(Unknown Source) 
    at org.hsqldb.StatementDMQL.execute(Unknown Source) 
    at org.hsqldb.Session.executeCompiledStatement(Unknown Source) 
    at org.hsqldb.Session.execute(Unknown Source) 

내 시험의 persistence.xml이 그대로 : 모든 들어

try { 
    final DatabaseConnection connection = new DatabaseConnection(jdbcConnection); 
    //connection.getConnection().prepareStatement("SET DATABASE REFERENTIAL INTEGRITY FALSE").execute(); 
    final DatabaseConfig config = connection.getConfig(); 
    // config.setProperty(FEATURE_QUALIFIED_TABLE_NAMES, true); 
    config.setProperty(PROPERTY_ESCAPE_PATTERN, "\"?\""); 
    config.setProperty(PROPERTY_DATATYPE_FACTORY, new HsqldbDataTypeFactory()); 

    final List<IDataSet> dataSets = getDataSets(); 
    if (dataSets != null) { 
     for (IDataSet dataSet : dataSets) { 
      dbOperation.execute(connection, dataSet); 
     } 
    } 
} catch (Exception e) { 
    throw new RuntimeException(e); 
} 

:

<?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="testPU" transaction-type="RESOURCE_LOCAL"> 
     <provider>org.hibernate.ejb.HibernatePersistence</provider> 
     <class>com.dummy.entity.NewTab</class> 
     <properties> 
      <property name="javax.persistence.jdbc.driver" value="org.hsqldb.jdbcDriver"/> 
      <property name="javax.persistence.jdbc.url" value="jdbc:hsqldb:mem:UNITTEST"/> 
      <property name="hibernate.dialect" value="org.hibernate.dialect.HSQLDialect"/> 
      <property name="javax.persistence.jdbc.user" value="sa"/> 
      <property name="javax.persistence.jdbc.password" value=""/> 
      <property name="hibernate.hbm2ddl.auto" value="create-drop"/> 
      <property name="hibernate.show_sql" value="true"/> 
      <property name="hibernate.format_sql" value="true"/> 
     </properties> 
    </persistence-unit> 
</persistence> 

모든 테스트 케이스를 사용하여 실행됩니다 여러 엔터티 테스트이 오류가 나타납니다. 그래서 나는 어떻게 든 내 구성에 문제가 있다고 생각합니다. 어떤 생각이 든다면 알려주세요.

+1

그래서 NEW_TAB에는 고유 한 제한이 있으며 INSERT를 시도하면이 문제가 있습니다. 그렇다면 엔티티를 포함하지 않는 이유는 무엇입니까? UNIQUE 제약 조건이란 무엇입니까? –

+0

나는 왜이 질문이 downvoted인지 잘 모르겠다. (DbUnit에 심각한 문제가있는 것 같다. 데이터베이스 제약을 존중하지 않는다. 그래서 질문은 합법적이다! – user613114

답변

1

모든 JPA 엔티티 필드의 @Column 주석에 대해 attribure unique = true를 제거하여이 문제를 해결했습니다. DBUnit이 JPA enity에 대한 복합 키가 있다는 것을 이해하지 못하는 이유를 잘 모릅니다.

DB에서 생성/업데이트/취소 트랜잭션을 수행하지 않으므로 unique = true를 삭제해도 영향을주지 않습니다. 읽기 작업 만하고 있습니다.