我有一个实体类,继承了四级继承关系,其中最高级别的父类定义了主键(@Id),但我遇到了问题,出现了以下错误:
实体类[class D]未指定主键。它应该定义@Id、@EmbeddedId或@IdClass之一。如果您已经使用这些注解中的任何一个定义了PK,请确保您的实体类层次结构中没有混合访问类型(既有字段又有属性被注释)。
这是我的继承体系:
A->B->C->(实体)D
这是我的非实体类,它为它的子类提供值:
import javax.persistence.*;
import java.io.Serializable;
import java.util.Date;
@MappedSuperclass
public class A implements Serializable {
@Id
@GeneratedValue
protected Long id;
@Temporal(javax.persistence.TemporalType.TIMESTAMP)
protected Date deleted;
public Date getDeleted() {
return deleted;
}
public void setDeleted(Date deleted) {
this.deleted = deleted;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
}
这是它的一个子元素:
@MappedSuperclass
public abstract class B extends A implements Serializable {
}
B->C
import javax.persistence.Entity;
import javax.persistence.Transient;
@MappedSuperclass
public class C extends B{
protected String name;
protected String description;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
}
最后是C->(实体)D
@Entity
public class D extends C{
private String codeD;
public String getCodeD(){return codeD;}
public String setCodeD(String codeD) {this.codeD = codeD;}
}
根据我找到的每个来源,通常使用@MappedSuperclass并实现Serializable应该可以解决问题。虽然我已经尝试了在层次结构的每一步实现Serializable,但是我收到了相同的错误消息。
我目前正在使用Payara 4.1.1.1621。我不知道这可能是问题所在,因为我在某些线程中看到过这种Payara错误,但它们都神奇地自己解决了。