2016-05-12 151 views
0

我有兩個實體,測試用例和TestCaseStep,定義如下包含列表單向關係:JPA - 有重複的條目

的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; 

    [...] 
} 

這隻要我不嘗試將相同的對象插入到列表中,就可以正常工作測試用例不止一次地執行。一旦我嘗試,我得到一個主鍵違規:

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 

我需要允許我的用戶多次重複相同的測試用例步驟。我怎樣才能做到這一點,而無需使用單獨的實體來映射我自己的關係?

+0

更改DDL腳本以使訂單列成爲連接表的pk的一部分,儘管EclipseLink不支持重複項按照http://stackoverflow.com/questions/15690347/persist-a-list-with順序和重複在jpa-eclipselink – Chris

+0

那麼,這是令人尷尬的。在發佈之前,我做了一些研究,但從未偶然發現過這篇文章。謝謝!我會立即投票。 – Kubus

回答

0

而不是定義在雙方的TestCase和TestCaseSteps實體主鍵,試圖定義一個代理鍵作爲主鍵,其中你保持這個代理鍵的生成策略,以AUTO

在這樣,當您重新運行測試用例時,您總是會創建一個新的Insert。

+0

這沒有幫助。這個問題是由連接表引起的,而不是爲實體本身生成密鑰的方式。這實際上是EclipseLink中的一個古老的錯誤,正如克里斯評論中鏈接的文章所建議的。 – Kubus