我有嵌入了两个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.id
与id.id
混合。
答案 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)
来电以进行查询。我希望这会有所帮助。