我有一个实体类,它包含一个键值对映射,它们位于不同的表中,并且给定实体可能没有这样的对。实体类的相关代码如下。
现在,当我用persist()
插入这样的实体,然后添加键值对,然后用merge()
保存它时,我得到存储密钥的相关表的重复输入错误 - 价值对。我试图阻止插入,直到添加了密钥,才能只调用persist()
。这导致重复的条目错误在外键列(ixSource
)中包含空(零)id。
我在调试器中跟踪了该过程,发现eclipselink似乎对级联感到困惑。在更新实体时,它会执行更新相关表的调用。尽管如此,它还将这些操作添加到之后处理的队列中,即发生重复条目错误时。我尝试了CascadeType.ALL
和MERGE
,没有区别。
我正在使用静态编织,如果重要的话。
这是实体`代码,为简洁而缩短:
@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 :(得分:0)
我看不出这些错误会如何发生。你能不能包含SQL和ful异常。
您使用的是哪个版本的EclipseLink,您是否尝试过最新版本?
你为什么要打电话给合并?您是通过序列化分离对象,如果它是同一个对象,则不需要调用merge。
这可能是@MapKey的一个问题,如果删除它会有效吗?