我想在 Java+DBUnit/ 中的每次测试后重置数据库 AND 序列。
我已经看到这个问题,但没有我正在努力获得的代码解决方案。如何在DBUnit中使用Oracle序列号? https://stackoverflow.com/questions/16697740/how-to-use-oracle-sequence-numbers-in-dbunit
我找到了答案,就在官方文档 http://search.cpan.org/~adrianwit/Test-DBUnit-0.20/lib/Test/DBUnit.pm#Working_with_sequences。这就像在您用来准备数据库的数据集中一样简单,添加一个重置序列属性,其中包含要重置的列表。
<?xml version='1.0' encoding='UTF-8'?>
<dataset reset_sequences="emp_seq, dept_seq">
<emp empno="1" ename="Scott" deptno="10" job="project manager" />
....
</dataset>
该解决方案并不完美,因为它并没有真正重置序列,仅模拟插入行的重置。如果你想有效地重置它,你应该执行一些命令。为此,我使用此类扩展了 DatabaseOperation。
public static final DatabaseOperation SEQUENCE_RESETTER_POSTGRES = new DatabaseOperation() {
@Override
public void execute(IDatabaseConnection connection, IDataSet dataSet)
throws DatabaseUnitException, SQLException {
String[] tables = dataSet.getTableNames();
Statement statement = connection.getConnection().createStatement();
for (String table : tables) {
int startWith = dataSet.getTable(table).getRowCount() + 1;
statement.execute("alter sequence " + table + "_PK_SEQ RESTART WITH "+ startWith);
}
}
};
public static final DatabaseOperation SEQUENCE_RESETTER_ORACLE = new DatabaseOperation() {
@Override
public void execute(IDatabaseConnection connection, IDataSet dataSet)
throws DatabaseUnitException, SQLException {
String[] tables = dataSet.getTableNames();
Statement statement = connection.getConnection().createStatement();
for (String table : tables) {
int startWith = dataSet.getTable(table).getRowCount() + 1;
statement.execute("drop sequence " + table + "_PK_SEQ if exists");
statement.execute("create sequence " + table + "_PK_SEQ START WITH " + startWith);
}
}
};
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)