实体类没有指定主键

时间:2017-01-17 19:55:18

标签: java jpa payara javax

我有一个继承自四级继承的实体类,其中顶级父级定义了主键(@Id),并且我在查看错误时无法弄清楚我做错了什么:< / p>

实体类[D类]没有指定主键。它应该定义@ Id,@ EmbeddedId或@IdClass。如果已使用任何这些注释定义了PK,请确保在实体类层次结构中没有混合访问类型(注释的字段和属性)。

这是层次结构:

A-&GT; B-&GT; C-&GT;(实体)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-&gt; (实体)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上看到过某种线索中的这种错误,但他们都奇迹般地解决了自己。

2 个答案:

答案 0 :(得分:0)

配置似乎符合规范建议。

我想到的唯一可以添加的是@Column注释来显式声明数据库列名:

@Id
@GeneratedValue
@Column(name = "id")
protected Long id;
@Temporal(javax.persistence.TemporalType.TIMESTAMP)
@Column(name = "deleted")
protected Date deleted;

试一试。如果它仍然无法工作,请尝试注释标记为@MappedSuperClass的类中的所有字段。

此外,C类的字段应标记为受保护而非私有?

答案 1 :(得分:0)

我通过将我的基类添加到persistence.xml中解决了该错误。