Java Eclipselink验证异常
我正在尝试调整我的数据模型以使用BaseEntity基类。以下代码代表了总体思路: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
@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,已修复。是的,我尝试了这两种建议。我已经找到了解决办法,但我忘了我的问题!我将很快发布解决方案。