更新时嵌入的AttributeOverride不起作用

时间:2015-01-14 09:56:27

标签: java jpa eclipselink

我有嵌入了两个ModelId类的实体,其中一个是EmbeddedId,另一个是另一个实体。

@Entity
public class Report implements Serializable {

    @EmbeddedId
    private final ModelId id;

    @AttributeOverride(name = "id", column = @Column(name = "scheme_id")
    @Embedded
    private ModelId schemeId;

    public void changeScheme(ModelId schemeId) {
        this.schemeId = schemeId;
    }
}

@Embeddable
public class ModelId implements Serializable {

    private Integer id;
}

我可以插入选择 Report,但当我更新字段schemeId时,我得到:

org.eclipse.persistence.exceptions.ValidationException
Exception Description: The attribute [id] of class [mypackage.ModelId] is mapped
to a primary key column in the database. Updates are not allowed.

我将GlassFish 4.1与EclipseLink 2.5一起使用。

我错过了什么或者是EclipseLink错误吗?


问题是只有id生成主键,schemeId是外键。当我将schemeId更改为关联时,正常运行

@ManyToOne
@JoinColumn(name = "scheme_id", referencedColumnName = "id")
private Scheme scheme;

public void changeScheme(Scheme scheme) {
    this.scheme = scheme;
}

我已经使用许多注释组合进行了测试,并且在GF4.0和EclipseLink 2.6中也进行了相同的测试。

似乎EclipseLink在更新期间忽略@AttributeOverride并将内部schemeId.idid.id混合。

2 个答案:

答案 0 :(得分:0)

由于异常声明您正在修改主键,因此Eclipselink不允许这样做。 两种可能的选择是: 1)删除旧实体并使用新主键创建新实体。 2)引入不同的属性并将其定义为主键,并在这两个字段上提供唯一约束。

答案 1 :(得分:0)

我们遇到了同样的问题。 eclipselink的现有错误似乎已经涵盖了此缺陷(针对2.6.0版本,我仍然在2.6.3中看到此问题):

https://bugs.eclipse.org/bugs/show_bug.cgi?id=477638

此时似乎没有任何活动,所以在此期间我将@EmbeddedId更改为@Embedded并添加了私有主键,如下所示:

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private int privateId;

我还为以前属于主键的属性添加了复合唯一约束。我不得不更改我的EntityManager.find(dataType, id)来电以进行查询。我希望这会有所帮助。