gpt4 book ai didi

java - DbUnit 无法清理插入 : foreign key constraint

转载 作者:可可西里 更新时间:2023-11-01 06:40:29 24 4
gpt4 key购买 nike

我提出并回答这个问题以供将来引用,因为我认为我已经找到了解决 DbUnit 常见问题的合适方法。我希望它能帮助某个人,在某个地方。

我正在使用 DbUnit 2.5.0TestNG 6.8.8。我的用例是针对包含 3 个实体的数据库的一部分。有一个 ServiceUser,它持有 AdministrableUserGroup 的外键。

我遵循了 http://city81.blogspot.com/2011/03/testing-jpa-entities-using-dbunit.html 中的大部分代码示例

public abstract class AbstractDatabaseTest {
protected EntityManager em; // initialized elsewhere
private IDatabaseConnection connection;
private IDataSet dataset;

@BeforeClass
private void setupDatabaseResource() throws Exception {
// using Hibernate
connection = new DatabaseConnection(((SessionImpl) (em.getDelegate())).connection());
connection.getConfig().setProperty(DatabaseConfig.PROPERTY_DATATYPE_FACTORY, new HsqldbDataTypeFactory());

// full database export
IDataSet fullDataSet = connection.createDataSet();

final String datasetPath = String.format("%s%s", RESOURCE_FOLDER, "Testing.xml");
FlatXmlDataSet.write(fullDataSet, new FileOutputStream(datasetPath));

FlatXmlDataSetBuilder flatXmlDataSetBuilder = new FlatXmlDataSetBuilder();
flatXmlDataSetBuilder.setColumnSensing(true);
dataset = flatXmlDataSetBuilder.build(new FileInputStream(datasetPath));
}

@AfterMethod
public void cleanDB() throws Exception {
em.getTransaction().begin();
DatabaseOperation.CLEAN_INSERT.execute(connection, dataset);
em.getTransaction().commit();
}
}

此操作的结果是以下 XMLDataSet(省略数据):

<dataset>
<administrable/>
<serviceuser/>
<usergroup/>
</dataset>

TestNG 执行 @AfterMethod 时,我得到以下异常:

com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException
Cannot delete or update a parent row: a foreign key constraint fails (`testing_db`.`serviceuser`, CONSTRAINT `FK_gyylcfbhpl2ukqs5rm7sq0uy8` FOREIGN KEY (`userGroup_id`) REFERENCES `usergroup` (`id`))

最佳答案

问题是我上面创建的 XMLDataSet 不知道表中的外键约束,而是按字母顺序创建表列表。然而,CLEAN_INSERT 操作获取表列表并以相反的顺序遍历它,并且它要求在执行之前删除外键引用(此处:ServiceUser.userGroup_id)引用的实体(此处:UserGroup)。

我通过 Unitils doesn't work 找到了这个信息和 http://forum.spring.io/forum/spring-projects/data/12868-dbunit-test-fails-mysql-server-hates-me?p=337672#post337672

对 DbUnit 文档的一些细微挖掘导致了一种创建数据集的更正方法,该方法检查外键依赖性并尝试适本地对实体进行排序:

IDataSet fullDataSet = new FilteredDataSet(new DatabaseSequenceFilter(connection), connection.createDataSet());

结果:

<dataset>
<administrable/>
<usergroup/>
<serviceuser/>
</dataset>

这将CLEAN_INSERT正确。

免责声明:我没有遇到过循环依赖或自引用外键,我也没有测试过这个修复可以处理它们。

关于java - DbUnit 无法清理插入 : foreign key constraint,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26118271/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com