gpt4 book ai didi

java - JUnit 测试中的 HSQLDB 主键冲突错误

转载 作者:搜寻专家 更新时间:2023-10-31 08:04:06 27 4
gpt4 key购买 nike

我们有一个使用 JUnit、OpenEJB、Eclipselink 和 HSQLDB 的测试框架。到目前为止一切正常,测试服务层是一件轻而易举的事。然而,现在我们在对表进行大量导入(使用服务层、entitymanager)时遇到了问题,或者例如在服务方法中多次将实体持久化到列表中。

这是奇怪的部分:我们的测试似乎只有在足够快的工作站上从命令行使用 Maven 运行测试时才会中断。当我通过 Eclipse IDE 运行测试时,一切都很好,但有时,随机地,它也会失败。我们怀疑这可能与测试运行的速度有关,这听起来很奇怪。这个异常很简单,因为它基本上告诉我们我们正在尝试添加一个已经存在 id 的实体。我们多次检查了我们的测试数据和 hsqldb 数据库。没有我们正在尝试使用的带有 id 的预先存在的行。仍然 hsqldb 在某些时候抛出主键异常。从我们的日志中我们可以看到冲突的 ID 并不总是相同的,它可能是 300015 或 300008。

我们已经无计可施了。它可能与 HSQLDB 的事务或其他导致陈旧数据的原因有关吗?

我们使用的是 HSQLDB 2.2.8、Eclipselink 2.3.0 和 OpenEJB 4.0.0-beta2。

我们尝试添加实体的关系映射如下:

@OneToMany(mappedBy = "invoice", cascade = CascadeType.PERSIST)
private List<InvoiceBalance> getInvoiceBalanceHistory() {
if (invoiceBalanceHistory == null) {
this.invoiceBalanceHistory = new ArrayList<InvoiceBalance>();
}
return invoiceBalanceHistory;
}

根异常是:

Caused by: java.sql.SQLIntegrityConstraintViolationException: integrity constraint violation: unique constraint or index violation; SYS_PK_10492 table: INVOICEBALANCE
at org.hsqldb.jdbc.Util.sqlException(Unknown Source)
at org.hsqldb.jdbc.Util.sqlException(Unknown Source)
at org.hsqldb.jdbc.JDBCPreparedStatement.fetchResult(Unknown Source)
at org.hsqldb.jdbc.JDBCPreparedStatement.executeUpdate(Unknown Source)
at org.apache.commons.dbcp.DelegatingPreparedStatement.executeUpdate(DelegatingPreparedStatement.java:105)
at org.apache.commons.dbcp.DelegatingPreparedStatement.executeUpdate(DelegatingPreparedStatement.java:105)
at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.executeDirectNoSelect(DatabaseAccessor.java:831)
... 82 more
Caused by: org.hsqldb.HsqlException: integrity constraint violation: unique constraint or index violation; SYS_PK_10492 table: INVOICEBALANCE
at org.hsqldb.error.Error.error(Unknown Source)
at org.hsqldb.Constraint.getException(Unknown Source)
at org.hsqldb.index.IndexAVLMemory.insert(Unknown Source)
at org.hsqldb.persist.RowStoreAVL.indexRow(Unknown Source)
at org.hsqldb.TransactionManager2PL.addInsertAction(Unknown Source)
at org.hsqldb.Session.addInsertAction(Unknown Source)
at org.hsqldb.Table.insertSingleRow(Unknown Source)
at org.hsqldb.StatementDML.insertSingleRow(Unknown Source)
at org.hsqldb.StatementInsert.getResult(Unknown Source)
at org.hsqldb.StatementDMQL.execute(Unknown Source)
at org.hsqldb.Session.executeCompiledStatement(Unknown Source)
at org.hsqldb.Session.execute(Unknown Source)

编辑:

我将主键生成策略从 GenerationType.AUTO(似乎默认使用 TABLE 策略)更改为 IDENTITY。在此之后,我们的质量坚持似乎一直在工作。我仍然不知道为什么 HSQLDB 与 TABLE 策略“不同步”。我不想仅仅因为我们的测试框架有问题就更改我们的 jpa 实体:)

最佳答案

您的 allocationSize 可能会在相对较快的平台上或偶尔定义瓶颈。IE。当默认为 GenerationType.AUTO 时,默认表 EclipseLink 会将 ID 缓存到分配的值。然后它将查找生成器以确认其最后分配的值。如果在缓存下一组 ID 之前在 allocationSize 的边缘发生查找,那么您可能会遇到竞争条件,其中 Eclipse 链接在更新缓存之前两次分配缓存中的最后一个 ID 并尝试将两者都用于插入并且两个插入都失败并被回滚。如果可以的话,你应该检查一下这是否发生在你的分配缓存应该增加的时候,但也许这种检查可能会改变行为

关于java - JUnit 测试中的 HSQLDB 主键冲突错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10171328/

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