java - 将数据集加载到数据库时来自 DBUnit 的 NoPrimaryKeyException

标签 java hibernate orm dbunit

当我尝试运行我的一个使用 DBUnit 的单元测试时,我得到了 NoPrimaryKeyException。数据表是使用 Hibernate 创建的,是映射多对多关系的两个类之间的连接表。定义关系的注解如下:

@Override
@ManyToMany
@JoinTable(name="offset_file_offset_entries", joinColumns={@JoinColumn(name="offset_entry_id")},inverseJoinColumns={@JoinColumn(name="file_description_id")})
public List<OffsetEntry> getOffsets() {

我用来定义数据集的 XML 文件中的其他条目似乎工作正常,但连接表不行。我得到以下异常:

org.dbunit.dataset.NoPrimaryKeyException: offset_file_offset_entries
    at org.dbunit.operation.UpdateOperation.getOperationData(UpdateOperation.java:72)
    at org.dbunit.operation.RefreshOperation$UpdateRowOperation.<init>(RefreshOperation.java:266)
    at org.dbunit.operation.RefreshOperation.createUpdateOperation(RefreshOperation.java:142)
    at org.dbunit.operation.RefreshOperation.execute(RefreshOperation.java:100)
    at org.dbunit.ext.mssql.InsertIdentityOperation.execute(InsertIdentityOperation.java:217)
    at uk.co.sabio.obscheduler.application.dao.AbstractBaseDatabaseTest.setUp(AbstractBaseDatabaseTest.java:57)
    at org.springframework.test.context.junit38.AbstractJUnit38SpringContextTests.runManaged(AbstractJUnit38SpringContextTests.java:332)
    at org.springframework.test.context.junit38.AbstractJUnit38SpringContextTests.access$0(AbstractJUnit38SpringContextTests.java:326)
    at org.springframework.test.context.junit38.AbstractJUnit38SpringContextTests$1.run(AbstractJUnit38SpringContextTests.java:216)
    at org.springframework.test.context.junit38.AbstractJUnit38SpringContextTests.runTest(AbstractJUnit38SpringContextTests.java:296)
    at org.springframework.test.context.junit38.AbstractJUnit38SpringContextTests.runTestTimed(AbstractJUnit38SpringContextTests.java:253)
    at org.springframework.test.context.junit38.AbstractJUnit38SpringContextTests.runBare(AbstractJUnit38SpringContextTests.java:213)
    at junit.framework.TestResult$1.protect(TestResult.java:110)
    at junit.framework.TestResult.runProtected(TestResult.java:128)
    at junit.framework.TestResult.run(TestResult.java:113)
    at junit.framework.TestCase.run(TestCase.java:124)
    at junit.framework.TestSuite.runTest(TestSuite.java:232)
    at junit.framework.TestSuite.run(TestSuite.java:227)
    at org.junit.internal.runners.JUnit38ClassRunner.run(JUnit38ClassRunner.java:83)
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:46)
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)

有问题的数据集条目如下所示:

<offset_file_offset_entries offset_entry_id="1" file_description_id="1" />

并与将两个字段作为主键的数据库匹配(如果有帮助,数据库是 MS SQL Server)在以下 xml 中定义的两个表中有相应的条目:

<dataset>
    <file_description file_path="src/test/resources/" file_pattern=".txt" file_description_id="1"/>
    <offset_file_description file_description_id="1"/>
    <offset_entries offset_entry_id="1" field_name="Field1" field_length="10" start_index="0"/>
    <offset_file_offset_entries offset_entry_id="1" file_description_id="1" />  
</dataset>

我必须在 hibernate 注释中定义主键吗?如果是这样,我该怎么做?我是否必须更改定义数据集的方式以暗示两列是联合主键?

在这方面,我对 hibernate 或 DBUnit 不是很精通,而且我无能为力,因此非常感谢任何帮助。

最佳答案

Do I have to define the primary keys in the hibernate annotations? If so, how do I do so?

是的,你知道,这是 Hibernate/JPA 无法为你猜测的事情之一。为此,请使用 @Id annotation 注释持有标识符(或此属性的 getter)的属性。 .

关于java - 将数据集加载到数据库时来自 DBUnit 的 NoPrimaryKeyException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2318037/

相关文章:

java - fileChannel.lock 未按预期工作

java - Mybatis中如何映射多个bean?

java - 如何从可用作自定义实体 ID 生成器中实体 ID 的对象属性生成 UID?

mysql - Laravel ORM 列表 groupBy 相关记录

java - JPA中的mappedBy或Hibernate中的inverse ="true"有何作用?

C# 动态映射输入文件的方法

java - 无法找出缺少返回语句的错误

java - CardLayout 约束适用于 Windows,但不适用于 OS X

java - Spring - hibernate 错误

java - Envers 查询返回惰性结果而不是急切结果