2010-02-23 2 views
3

DBUnit을 사용하는 단위 테스트 중 하나를 실행하려고하면 NoPrimaryKeyException이 발생합니다. 데이터 테이블은 Hibernate를 사용하여 생성되며 다 대다 관계를 매핑하는 두 클래스 사이의 조인 테이블입니다. 나는 데이터 집합을 정의하는 데 사용하고 XML 파일에서데이터 집합을 데이터베이스에로드 할 때 NoPrimaryKeyException이 발생 함

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

다른 항목이 잘 작동하는 것 같다하지만 테이블에 참여하지 : 다음과 같이 관계를 정의하는 주석입니다. 나는 다음과 같은 예외가 :

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 서버의 경우입니다 기본 키로 두 필드가 데이터베이스와 일치 즉, 해당 항목이 두 테이블은 다음 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> 

나 최대 절전 모드 주석의 기본 키를 정의해야합니까? 그렇다면 어떻게해야합니까? 두 열이 공동 기본 키임을 암시하기 위해 데이터 집합을 정의하는 방식을 변경해야합니까?

나는 그 문제에 대해 최대 절전 모드 나 DBUnit에 능숙하지 못하다. 그리고 나는 도움이 정말 감사 할 만하다.

답변

2

최대 절전 모드 주석에서 기본 키를 정의해야합니까? 그렇다면 어떻게해야합니까?

예, 당신은 Hibernate/JPA가 당신에게 추측 할 수없는 것들 중 하나입니다. 그렇게하려면 식별자 (또는이 속성에 대한 getter)가있는 속성에 @Id annotation으로 주석을 추가합니다.

관련 문제