Tim*_*sen 3 java sql sql-server hibernate hsqldb
除了企业数据库(例如SQL Server和Oracle)之外,我们还在设计Java应用程序以支持HSQL数据库。我的任务是编写一个全面的测试套件,其中涵盖了应用程序中的主要数据库操作。该测试套件可以在SQL Server上成功运行,但是当我使用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
Run Code Online (Sandbox Code Playgroud)
这里真正神秘的是,故障发生在测试中与FAVORITE_FILE表无关的一点。相反,我已经观察到尝试INSERT在其他表(OFFLINE_FILE)上执行尝试,或尝试从其他表中删除记录时发生的这种失败。
我希望专家可以看到此堆栈跟踪和用例,并可以对正在发生的事情提供一些见解。重申一下,这些错误在SQL Server上运行时不会出现。我的直觉是HSQLDB的持久层中存在一些问题/错误,但是我无法确认这一点。
经过更广泛的测试后,我们发现SQL Server和Oracle上也频繁发生类似的问题。事实证明,我们没有关闭FAVORITE_FILE桌上的交易。这个Hibernate错误是我们收到错误消息的根本原因。关闭事务导致错误消失。
这个问题对我们来说是一次很好的学习经历,因为我们意识到,面对Hibernate错误时,我们应该在质疑数据库之前先质疑自己代码的正确性。