2016-03-03 96 views
3

我們正在設計我們的Java應用程序支持HSQL數據庫,除了企業數據庫,如SQL Server和Oracle。我的任務是編寫一個全面的測試套件,涵蓋應用程序中的主要數據庫操作。測試套件運行成功地爲SQL Server,但是當我使用HSQLDB做同樣的測試中,我不斷收到一個失敗。這裏是堆棧跟蹤的一部分:神祕的完整性約束違反HSQLDB數據庫

Caused by: java.sql.SQLIntegrityConstraintViolationException: integrity constraint 
violation: foreign key no parent; FKREQKDHUAI8BYVMWC5RMTJ3UFA table: FAVORITE_FILE 
    at org.hsqldb.jdbc.JDBCUtil.sqlException(Unknown Source) 
    at org.hsqldb.jdbc.JDBCUtil.sqlException(Unknown Source) 
    at org.hsqldb.jdbc.JDBCPreparedStatement.fetchResult(Unknown Source) 
    at org.hsqldb.jdbc.JDBCPreparedStatement.executeUpdate(Unknown Source) 
    at com.mchange.v2.c3p0.impl.NewProxyPreparedStatement.executeUpdate(NewProxyPreparedStatement.java:384) 
    at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:204) 
    ... 91 more 
Caused by: org.hsqldb.HsqlException: integrity constraint violation: foreign key no parent; 
FKREQKDHUAI8BYVMWC5RMTJ3UFA table: FAVORITE_FILE 
    at org.hsqldb.error.Error.error(Unknown Source) 
    at org.hsqldb.Constraint.getException(Unknown Source) 
    at org.hsqldb.Constraint.checkInsert(Unknown Source) 
    at org.hsqldb.StatementDML.performIntegrityChecks(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) 
    ... 95 more 

這裏的真正神祕的是,失敗是在哪個無關與FAVORITE_FILE表中的測試點發生。相反,我已經觀察到了這種嘗試失敗時,在不同的表(OFFLINE_FILE)做一個INSERT,或試圖從不同的表中刪除記錄時發生。

我的希望是,專家會看到該堆棧跟蹤和使用情況,並能提供一些見解,以正在發生的事情。重申,在SQL Server上運行時,不會出現這些錯誤。我的直覺是,HSQLDB的持久層存在一些問題/錯誤,但我無法證實這一點。

+0

我還面臨着hsql的類似錯誤,你可以分享你的junit類的代碼嗎? –

+0

您需要在HSQLDB項目論壇發佈一個鏈接到這一點。使用SCRIPT命令獲取DDL並報告與表(父,外鍵和插入目標)相關的所有CREATE和ALTER行,包括任何索引。 https://sourceforge.net/p/hsqldb/discussion/73674/ – fredt

回答

2

更廣泛的測試後,我們發現,類似的問題也發生sproadically SQL Server和Oracle上。事實證明,我們並未在FAVORITE_FILE表上關閉交易。這個Hibernate漏洞是我們得到錯誤信息的根本原因。關閉交易導致錯誤消失。

這個問題對我們來說是一個很好的學習經驗,因爲我們意識到當面對Hibernate的錯誤時,我們應該在質疑數據庫之前質疑我們自己的代碼的正確性。

相關問題