2014-10-04 37 views
0

我使用DbUnit框架測試我的JPA實體bean。我從數據庫表中生成實體。並且還將DB數據導出到DbUnit在執行測試時可以使用的xml文件中。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約束? – 2014-10-04 07:07:45

+0

我不知道爲什麼這個問題是downvoted :(這似乎有一些嚴重的問題與DbUnit。它不尊重數據庫的約束。所以問題是合法的! – user613114 2014-10-06 04:58:02

回答

1

我通過爲每個JPA實體字段的@Column註釋移除attribure unique = true來解決了此問題。不知道爲什麼DBUnit不明白爲那個JPA enity有一個組合鍵。

刪除unique = true,不會影響我,因爲我沒有在數據庫上執行任何創建/更新/取消事務。我正在執行只讀操作。