2016-05-12 18 views
0

Ich habe zwei Entitäten, Testcase und TestCaseStep, wie folgt definiert:JPA - unidirektionale Beziehung enthält Liste mit doppelten Einträgen

Testcase

@Entity 
@Table(name = "TEST_CASE") 
public class TestCase implements Serializable, TestCase 
{ 
    @Id 
    @Column(name = "name") 
    private String name; 

    @OneToMany(fetch = FetchType.EAGER) 
    @JoinTable(name = "Testcase_Step_Association", joinColumns = { @JoinColumn(name = "TC_NAME", referencedColumnName = "NAME") }, inverseJoinColumns = { 
     @JoinColumn(name = "STEP_NAME", referencedColumnName = "NAME") }) 
    @OrderColumn(name = "STEP_NUMBER", nullable = false) 
    private List<TestCaseStep> testCaseSteps; 

    [...] 
} 

TestCaseStep

@Entity 
@Table(name = "TEST_CASE_STEPS") 
public class TestCaseStep implements Serializable, TestCaseStep 
{ 
    @Id 
    @Column(name = "name") 
    private String name; 

    [...] 
} 

Diese funktioniert gut, solange ich nicht versuche, das gleiche Objekt in die Liste von einzufügen Testfallschritte mehr als einmal. Sobald ich versuche, dass, erhalte ich eine primäre Schlüsselverletzung:

Caused by: org.h2.jdbc.JdbcSQLException: Eindeutiger Index oder Prim�rschl�ssel verletzt: "PRIMARY_KEY_9 ON PUBLIC.TESTCASE_STEP_ASSOCIATION(TC_NAME, TESTCASESTEPS_NAME) VALUES ('TESTCASE_1', 'OUT_STEP', 395)" 
Unique index or primary key violation: "PRIMARY_KEY_9 ON PUBLIC.TESTCASE_STEP_ASSOCIATION(TC_NAME, TESTCASESTEPS_NAME) VALUES ('TESTCASE_1', 'OUT_STEP', 395)"; SQL statement: 
INSERT INTO Testcase_Step_Association (testCaseSteps_NAME, TC_NAME, STEP_NUMBER) VALUES (?, ?, ?) [23505-191] 
at org.h2.message.DbException.getJdbcSQLException(DbException.java:345) 
at org.h2.message.DbException.get(DbException.java:179) 
at org.h2.message.DbException.get(DbException.java:155) 
at org.h2.index.BaseIndex.getDuplicateKeyException(BaseIndex.java:107) 
at org.h2.mvstore.db.MVSecondaryIndex.checkUnique(MVSecondaryIndex.java:230) 
at org.h2.mvstore.db.MVSecondaryIndex.add(MVSecondaryIndex.java:189) 
at org.h2.mvstore.db.MVTable.addRow(MVTable.java:704) 
at org.h2.command.dml.Insert.insertRows(Insert.java:156) 
at org.h2.command.dml.Insert.update(Insert.java:114) 
at org.h2.command.CommandContainer.update(CommandContainer.java:98) 
at org.h2.command.Command.executeUpdate(Command.java:258) 
at org.h2.jdbc.JdbcPreparedStatement.executeUpdateInternal(JdbcPreparedStatement.java:160) 
at org.h2.jdbc.JdbcPreparedStatement.executeUpdate(JdbcPreparedStatement.java:146) 
at com.sun.gjc.spi.base.PreparedStatementWrapper.executeUpdate(PreparedStatementWrapper.java:125) 
at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.executeDirectNoSelect(DatabaseAccessor.java:892) 
... 193 more 

Ich brauche meine Benutzer zu ermöglichen, den gleichen Testfall Schritt mehrmals zu wiederholen. Wie kann ich dies erreichen, ohne eine separate Entität zu verwenden, um die Beziehung selbst abzubilden?

+0

Ändern Sie das DDL-Skript so, dass die Bestellspalte Teil des PK für die Join-Tabelle ist, obwohl EclipseLink keine Duplikate gemäß http://stackoverflow.com/questions/15690347/persist-a-list-with unterstützt -order-and-duplikate-in-jpa-eclipselink – Chris

+0

Nun, das ist peinlich. Ich habe einige Recherchen vor dem Posten gemacht, bin aber nie auf diesen Posten gestoßen. Vielen Dank! Ich werde den Fehler sofort abstimmen. – Kubus

Antwort

0

Statt Name als Primärschlüssel in beiden Testcase und TestCaseSteps Entity definieren, versuchen, einen Ersatzschlüssel als Primärschlüssel zu definieren, wobei Sie die Erzeugungsstrategie des Surrogate Key zu AUTO halten

In Auf diese Weise erstellen Sie immer einen neuen Insert, wenn Sie Testfälle erneut ausführen.

+0

Das würde nicht helfen. Das Problem wird durch die Join-Tabelle verursacht, nicht durch die Art und Weise, wie die Schlüssel für die Entitäten selbst generiert werden. Dies ist tatsächlich ein uralter Fehler in EclipseLink, wie es der Beitrag in Chris 'Kommentar vorgeschlagen hat. – Kubus

Verwandte Themen