java–DbUnit无法清理插入:外键约束

java–DbUnit无法清理插入:外键约束,第1张

概述我正在询问并回答这个问题以供将来参考,因为我认为我找到了一个解决DbUnit常见问题的合适解决方案.我希望它能帮到某个人,某个地方.我正在使用DbUnit 2.5.0和TestNG 6.8.8.我的用例是包含3个实体的数据库的一部分.有一个ServiceUser,它为Administrable和UserGroup保存一个外键.我跟随了http://city8

我正在询问并回答这个问题以供将来参考,因为我认为我找到了一个解决DbUnit常见问题的合适解决方案.我希望它能帮到某个人,某个地方.

我正在使用DbUnit 2.5.0和TestNG 6.8.8.我的用例是包含3个实体的数据库的一部分.有一个ServiceUser,它为administrable和UserGroup保存一个外键.

我跟随了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(省略数据):

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

com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationExceptionCannot 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 *** 作获取表的列表并以相反的顺序遍历它,并且它要求在引用的实体(此处为:UserGroup)之前删除外键引用(此处为:ServiceUser.userGroup_id).

我通过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());

结果:

这将正确CLEAN_INSERT.

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

总结

以上是内存溢出为你收集整理的java – DbUnit无法清理插入:外键约束全部内容,希望文章能够帮你解决java – DbUnit无法清理插入:外键约束所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/1166408.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-01
下一篇 2022-06-01

发表评论

登录后才能评论

评论列表(0条)