问题描述
我想用 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