我有一個實體類,其中包含生活在不同的表中的鍵值對的映射,並且對於給定的實體可能沒有這樣的對。下面是實體類的相關代碼。爲什麼在eclipselink中合併時,相關對象的「重複輸入」錯誤?
現在,當我插入這樣的實體persist()
,然後添加鍵值對,然後用merge()
保存它,我得到了存儲的鍵值對相關的表中重複輸入錯誤。我試圖阻止插入,直到鍵被添加,只有一個電話persist()
。這導致在外鍵列()中重複包含空(零)ID的輸入錯誤。
我在調試器中跟蹤了這個過程,發現eclipselink似乎對級聯感到困惑。在更新實體時,它會執行更新相關表的調用。儘管如此,它還會將這些操作添加到隨後處理的隊列中,即發生重複輸入錯誤時。我試過CascadeType.ALL
和MERGE
,沒有什麼區別。
我使用靜態編織,如果它很重要。
這裏的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;
}
}
}