2011-11-21 71 views
2

根據DBUnit文檔link,它應該支持在使用DatabaseSequenceFilter時使用CLEAN_INSERT。DBUnit Sybase無法執行CLEAN_INSERT

我嘗試此

com.sybase.jdbc2.jdbc.SybSQLException: Dependent foreign key constraint violation in a referential integrity constraint. dbname = 'my_db', table name = 'tbl_child', constraint name = 'fk_tbl_child_parentid'. 

我的表時出現以下情況例外是這樣的:

CREATE TABLE dbo.tbl_parent 
(
    parent_id   numeric(19,0) IDENTITY, 
    ... 
) 

CREATE TABLE dbo.tbl_child 
(
    child_id   numeric(19,0) IDENTITY, 
    parent_id   numeric(19,0) NOT NULL, 
    ... 
) 

ALTER TABLE dbo.tbl_child 
    ADD CONSTRAINT fk_tbl_child_parentid 
    FOREIGN KEY (parent_id) 
    REFERENCES dbo.tbl_parent (parent_id) 

而且我DBUnit的數據集是這樣的:

<dataset> 
    <tbl_parent parent_id="41" ... /> 

    <tbl_child child_id="1361" parent_id="41"/> 
</dataset> 

左右的時間內我測試類,我有這個代碼我得到錯誤,如果數據已經存在於數據庫中,它不能b E法除去,因爲外鍵約束

@Before 
public void setUp() throws Exception { 
    InsertIdentityOperation.CLEAN_INSERT.execute(getConnection(), getDataSet()); 
} 

有趣的一個解決辦法是使用REFRESH而不是CLEAN_INSERT但這是不太理想的,因爲垃圾數據可以駐留在數據庫中造成的副作用:

@Before 
public void setUp() throws Exception { 
    InsertIdentityOperation.REFRESH.execute(getConnection(), getDataSet()); 
} 

是否有人能夠獲得此CLEAN_INSERT以使用Sybase和外鍵?從閱讀其他職位的MySQL存在類似的問題,所以也許有一個共同的問題,在這裏(或我不理解的東西)

[編輯]

我現在已經運行到同一個後加了我自己的解決辦法回答問題再次。

我使用的Sybase ASE 15 + DBUnit的2.4.8

回答

2

我得出的結論是,這的確是打在另一項目同樣的問題(雖然我使用的是同一個JAR文件版本和數據庫服務器)後,與Sybase + DBUnit的一個問題。

解決方法我終於解決了以下

@Before 
public void setUp() throws Exception { 
    InsertIdentityOperation.TRUNCATE_TABLE.execute(getConnection(), getDataSet()); 
    InsertIdentityOperation.INSERT.execute(getConnection(), getDataSet()); 
} 

需要說明的是,TRUNCATE顯然會吹走所有數據庫中的數據表時,測試運行,但是這是我可以住在一起。至少我知道數據庫中的數據是什麼,並且由於在測試執行之間運行的其他開發人員插入了錯誤的記錄,所以我的測試不太可能失敗。可能是爲什麼你想要單元+集成測試專用數據庫的一個很好的理由。

0

只需使用INSERT操作通過XML或DataSet中插入值。 XML或插入腳本應按順序插入數據,即先將父數據和子數據按順序插入,使用DELETE_ALL按相反順序刪除表的操作。

protected DatabaseOperation getSetUpOperation() throws Exception 
    { 
     return DatabaseOperation.INSERT; 

    } 

    protected DatabaseOperation getTearDownOperation() throws Exception 
    { 
     return DatabaseOperation.DELETE_ALL; 
    } 
+1

從我的問題的底部,我特別感興趣的是*是否有人能夠讓這個CLEAN_INSERT與Sybase和外鍵一起工作?*。當測試用例第一次運行時,您的回答不會處理數據庫中存在的垃圾數據問題。如果DELETE_ALL沒有被調用,或者其他進程在我的測試運行之間將數據插入到表中,則會發生這種情況。 – Brad