首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Eclipselink链接ValidationException

Eclipselink链接ValidationException
EN

Stack Overflow用户
提问于 2011-07-25 18:54:29
回答 2查看 2.3K关注 0票数 3

我正在尝试调整我的数据模型以使用BaseEntity基类。以下代码代表了一般的想法:

代码语言:javascript
复制
    @MappedSuperclass
    public abstract class BaseEntity implements HasAuditInfo {
        @Id
        @GeneratedValue
        private Long id;
        @Column(unique = true, nullable = false)
        private String uuid;
        private Long createdById;
        @Temporal(value = TemporalType.TIMESTAMP)
        @Column(nullable = false)
        private Date createdOn;
        private Long changedById;
        @Temporal(value = TemporalType.TIMESTAMP)
        @Column(nullable = false)
        private Date changedOn;
        @Column(nullable = false)
        private Long changedOnValue;
        private Boolean active;
        private Long deactivatedById;
        @Temporal(value = TemporalType.TIMESTAMP)
        private Date deactivatedOn;
        @NotNull
        @DecimalMin("0")
        private Integer version = 0;
        private Long domainId;

        [... Getters/Setters etc ...]
}

以下是派生实体的示例:

代码语言:javascript
复制
@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public class Address extends BaseEntity implements Serializable, Comparable<Address> {
    private static final long serialVersionUID = 6301090657382674578L;
    // Address Fields
    @NotBlank(message = "Address Line 1 is a mandatory field.")
    private String addressLine1;
    private String addressLine2;
    private String country;
    @NotBlank(message = "Region is a mandatory field.")
    private String region;
    @NotBlank(message = "City is a mandatory field.")
    private String city;
    @NotBlank(message = "Zipcode is a mandatory field.")
    private String zipcode;

    [... Getters/Setters etc ...]
}

如果我正确地理解了JPA文档,这应该是完全有效的,但是在部署我的代码时,我从EclipseLink得到了以下错误:

实体类com.x.y.z.Address没有指定主键。它应该定义一个@Id、@EmbeddedId或一个@IdClass。如果您使用这些注释中的任何一个定义了PK,那么确保在实体类层次结构中没有混合访问类型(字段和属性注释)。

我尝试过一些方法来解决这个问题:

Address

  • Annotating

  • 升级到EclipseLink 2.3 (我目前使用的是2.2),

  • 使BaseEntity

  • 成为@Id注释,并将字段直接输入到

  • getId()方法中,而不是在BaseEntity和instead中的字段。

除了将我的代码迁移到Hibernate (或者其他一些更好的JPA实现)之外,这些方法都没有任何效果,我还能做些什么吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-08-04 16:30:13

解决方案是显式地命名BaseEntity中的每一列,如下所示:

代码语言:javascript
复制
@MappedSuperclass
public abstract class BaseEntity {
       @Id
       @GeneratedValue
       @Column(name = "id")
       @SearchableId
       protected Long id;
       @Column(name = "uuid", unique = true, nullable = false)
       protected String uuid;
       @Column(name = "createdById")
       protected Long createdById;
       @Temporal(value = TemporalType.TIMESTAMP)
       @Column(name = "createdOn", nullable = false)
       protected Date createdOn;
       @Column(name = "changedById")
       protected Long changedById;
       @Temporal(value = TemporalType.TIMESTAMP)
       @Column(name = "changedOn", nullable = false)
       protected Date changedOn;
       @Column(name = "changedOnValue", nullable = false)
       protected Long changedOnValue;
       @Column(name = "active")
       protected Boolean active;
       @Column(name = "deactivatedById")
       protected Long deactivatedById;
       @Temporal(value = TemporalType.TIMESTAMP)
       @Column(name = "deactivatedOn")
       protected Date deactivatedOn;
       @Version
       @Column(name = "version")
       protected Integer version = 0;
       @Column(name = "domainId")
       protected Long domainId;
票数 1
EN

Stack Overflow用户

发布于 2011-07-26 13:08:54

您不应该得到这个错误。如果您将@Id移到地址中,则绝对不会。

您确定在进行更改后重新编译/部署了代码吗?

如果您移除TABLE_PER_CLASS继承,它是否有效?( Address有子类吗?)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6820898

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档