DBUnit/HSQL 如何用具有自外键的表初始化数据库?

问题描述

我想用 DBUnit 初始化 Hsql 数据库我有一张这样的桌子:

table EMPLOYEE( id,name,manager_id) // manager_id is nullable
     CONSTRAINT "fk_manager" FOREIGN KEY ("manager_id")
     REFERENCES EMPLOYEE("id)

问题是当我尝试用这个数据集初始化时:

<dataset>
  <EMPLOYEE id="2" name="John" manager_id="5"/> <!--Doe is the John's manager-->
  <EMPLOYEE id="3" name="Doe" manager_id="4"/> <!--Kong is the Does's manager-->
  <EMPLOYEE id="4" name="Kong" manager_id="2"/> <!-- John is the Kong's manager-->
</dataset>

我有这个例外:

Caused by: org.hsqldb.HsqlException: integrity constraint violation: foreign key no parent; fk_manager table: EMPLOYEE

如何解决错误?谢谢

解决方法

您需要插入不带 managerId 的第一行,并在插入包含其 managerId 的行后添加此值

INSERT INTO EMPLOYEE (id,name,managerId) VALUES (2,'John',null)
INSERT INTO EMPLOYEE (id,managerId) (VALUES 4,'Kong',2)
INSERT INTO EMPLOYEE (id,managerId) (VALUES 3,'Doe',4)
UPDATE EMPLOYEE SET managerId = 3 WHERE id = 2 

也可以在插入过程中关闭外键约束检查。您的数据集应该是一致的,并且不应包含对不存在的行的外键引用。

http://hsqldb.org/doc/2.0/guide/management-chapt.html#mtc_database_settings

SET DATABASE REFERENTIAL INTEGRITY FALSE
-- perform the inserts
SET DATABASE REFERENTIAL INTEGRITY TRUE