2011-07-15 35 views
0

我有一個實體類,其中包含生活在不同的表中的鍵值對的映射,並且對於給定的實體可能沒有這樣的對。下面是實體類的相關代碼。爲什麼在eclipselink中合併時,相關對象的「重複輸入」錯誤?

現在,當我插入這樣的實體persist(),然後添加鍵值對,然後用merge()保存它,我得到了存儲的鍵值對相關的表中重複輸入錯誤。我試圖阻止插入,直到鍵被添加,只有一個電話persist()。這導致在外鍵列(​​)中重複包含空(零)ID的輸入錯誤。

我在調試器中跟蹤了這個過程,發現eclipselink似乎對級聯感到困惑。在更新實體時,它會執行更新相關表的調用。儘管如此,它還會將這些操作添加到隨後處理的隊列中,即發生重複輸入錯誤時。我試過CascadeType.ALLMERGE,沒有什麼區別。

我使用靜態編織,如果它很重要。

這裏的entities`code,縮短爲簡潔:

@Entity 
@Inheritance(strategy = InheritanceType.JOINED) 
@DiscriminatorColumn(name = "sType") 
@Table(name = "BaseEntity") 
public abstract class BaseEntity extends AbstractModel 
{ 
    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Column(name = "ix") 
    private long _ix; 
} 

@Entity 
@Table(name = "Source") 
public class Source extends BaseEntity 
{ 
    @OneToMany(cascade = CascadeType.MERGE) 
    @JoinTable(name = "SourceProperty", joinColumns = { @JoinColumn(name = "ixSource")  }) 
    @MapKey(name = "sKey") 
    private Map<String, SourceProperty> _mpKeys; 

    // ... there's more columns that probably don't matter ... 
} 

@Entity 
@Table(name = "SourceProperty") 
@IdClass(SourcePropertyKey.class) 
public class SourceProperty 
{ 
    @Id 
    @Column(name = "sKey", nullable = false) 
    public String sKey; 

    @Id 
    @Column(name = "ixSource", nullable = false) 
    public long ixSource; 

    @Column(name = "sValue", nullable = true) 
    public String sValue; 
} 

public class SourcePropertyKey implements Serializable 
{ 
    private final static long serialVersionUID = 1L; 
    public String    sKey; 
    public long    ixSource; 

    @Override 
    public boolean equals(Object obj) 
    { 
     if (obj instanceof SourcePropertyKey) { 
      return this.sKey.equals(((SourcePropertyKey) obj).sKey) 
        && this.ixSource == ((SourcePropertyKey) obj).ixSource; 
     } else { 
      return false; 
     } 
    } 
} 

回答

0

我看不出怎麼會出現這些錯誤。你可以包括SQL和例外。

您使用的是什麼版本的EclipseLink,您是否嘗試過最新版本?

你爲什麼要調用合併?你是否通過序列化來分離對象,如果它是同一個對象,則不需要調用合併。

這可能是@MapKey的問題,它是否工作,如果你刪除它?

相關問題