为什么我在eclipselink中合并后会出现相关对象的“重复条目”错误?

时间:2011-07-15 09:25:32

标签: jpa eclipselink

我有一个实体类,它包含一个键值对映射,它们位于不同的表中,并且给定实体可能没有这样的对。实体类的相关代码如下。

现在,当我用persist()插入这样的实体,然后添加键值对,然后用merge()保存它时,我得到存储密钥的相关表的重复输入错误 - 价值对。我试图阻止插入,直到添加了密钥,才能只调用persist()。这导致重复的条目错误在外键列(ixSource)中包含空(零)id。

我在调试器中跟踪了该过程,发现eclipselink似乎对级联感到困惑。在更新实体时,它会执行更新相关表的调用。尽管如此,它还将这些操作添加到之后处理的队列中,即发生重复条目错误时。我尝试了CascadeType.ALLMERGE,没有区别。

我正在使用静态编织,如果重要的话。

这是实体`代码,为简洁而缩短:

@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;
        }
    }
}

1 个答案:

答案 0 :(得分:0)

我看不出这些错误会如何发生。你能不能包含SQL和ful异常。

您使用的是哪个版本的EclipseLink,您是否尝试过最新版本?

你为什么要打电话给合并?您是通过序列化分离对象,如果它是同一个对象,则不需要调用merge。

这可能是@MapKey的一个问题,如果删除它会有效吗?