NoPrimaryKeyException из DBUnit при загрузке набора данных в базу данных - PullRequest
3 голосов
/ 23 февраля 2010

Я получаю NoPrimaryKeyException, когда пытаюсь запустить один из моих модульных тестов, использующих DBUnit. Таблица данных создается с использованием 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 или DBUnit, и я в своем уме, поэтому любая помощь будет очень признательна.

1 Ответ

2 голосов
/ 23 февраля 2010

Нужно ли определять первичные ключи в аннотациях гибернации? Если да, то как мне это сделать?

Да, вы делаете, это одна из вещей, которую Hibernate / JPA не может угадать для вас. Для этого аннотируйте свойство, содержащее идентификатор (или получатель для этого свойства), с помощью аннотации @Id .

...