Ant*_*ers 5 java jpa payara javax
我有一个实体类,它从四级继承继承,其中顶级父级定义主键(@Id),当我收到此错误时,我无法弄清楚我做错了什么:
实体类 [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;
}
}
Run Code Online (Sandbox Code Playgroud)
这是它的孩子之一:
@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;
}
}
Run Code Online (Sandbox Code Playgroud)
最后 C->(实体)D
@Entity
public class D extends C{
private String codeD;
public String getCodeD(){return codeD;}
public String setCodeD(String codeD) {this.codeD = codeD;}
}
Run Code Online (Sandbox Code Playgroud)
根据我找到的每个来源,通常使用 @MappedSuperclass 并实现 Serialized 它应该可以工作。我以为我已经尝试实现可序列化,甚至层次结构的每个步骤,但我收到了相同的错误消息。
我目前使用的是 Payara 4.1.1.1621。我不知道这是否是问题所在,因为我在 Payara 的某个线程上看到过这种错误,但它们都奇迹般地自行解决了。
配置似乎与规范建议的一样。
我想到的唯一可以添加的是 @Column 注释来显式声明数据库列名称:
@Id
@GeneratedValue
@Column(name = "id")
protected Long id;
@Temporal(javax.persistence.TemporalType.TIMESTAMP)
@Column(name = "deleted")
protected Date deleted;
Run Code Online (Sandbox Code Playgroud)
试试看。如果仍然不起作用,请尝试注释标记为 @MappedSuperClass 的类中的所有字段。
另外,C 类应该将其字段标记为受保护而不是私有?