Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/397.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Eclipselink验证异常_Java_Inheritance_Jpa_Eclipselink - Fatal编程技术网

Java Eclipselink验证异常

Java Eclipselink验证异常,java,inheritance,jpa,eclipselink,Java,Inheritance,Jpa,Eclipselink,我正在尝试调整我的数据模型以使用BaseEntity基类。以下代码代表了总体思路: @MappedSuperclass public abstract class BaseEntity implements HasAuditInfo { @Id @GeneratedValue private Long id; @Column(unique = true, nullable = false) priva

我正在尝试调整我的数据模型以使用BaseEntity基类。以下代码代表了总体思路:

    @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 ...]
}
以下是衍生实体的示例:

@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 ...]
}
@实体
@继承(策略=继承类型。每个类的表)
公共类地址扩展BaseEntity实现可序列化、可比较{
私有静态最终长serialVersionUID=6301090657382674578L;
//地址字段
@NotBlank(message=“地址行1是必填字段。”)
私有字符串地址行1;
私有字符串地址行2;
私人国家;
@NotBlank(message=“Region是必填字段。”)
私有字符串区域;
@NotBlank(message=“城市是必填字段。”)
私人城市;
@NotBlank(message=“Zipcode是必填字段。”)
私有字符串zipcode;
[…接受者/接受者等…]
}
如果我正确理解JPA文档,这应该是完全有效的,但是在部署代码时,我从EclipseLink中得到以下错误:

实体类[类] com.x.y.z.Address]未指定主键。 它应该定义@Id、@EmbeddedId或@IdClass。如果你 使用这些注释定义了PK,然后确保 不具有混合访问类型(带注释的字段和属性) 在实体类层次结构中

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

  • 升级到EclipseLink 2.3(我目前正在使用2.2)
  • 使基本实体非抽象
  • 将@Id注释和字段直接移动到地址中
  • 在BaseEntity和Address中注释getId()方法而不是字段

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

您不应该看到这个错误。如果你把@Id移到地址中,肯定不会

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


如果删除每个类的表继承,它是否有效?(Address是否有子类?

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

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

BaseEntity
TestAuditInfo
有何关联?TestAuditInfo应该是BaseEntity,已修复。是的,我尝试了这两种建议。我已经找到了解决办法,但我忘了我的问题!我将很快发布解决方案。