【问题标题】:Entity class has no primary key specified实体类没有指定主键
【发布时间】:2017-01-17 19:55:17
【问题描述】:

我有一个实体类,它继承自四级继承,其中顶级父级定义了主键 (@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-> (Entity)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 中的这种错误,但他们都奇迹般地自行解决了。

【问题讨论】:

  • 实体没问题。您的 JPA 提供商似乎是有问题的那个,是哪一个?
  • 您发布的映射看起来不错,实际上我尝试在一个简单的应用程序中重现它,并且它适用于 Payara Server 162。您使用任何 ORM XML 映射文件吗?它是否可能包含可能导致问题的其他映射?
  • 我的 JPA 提供程序是 EclipseLink,EclipseLink 的 javax.persistence 版本是 2.1.0 不,我没有使用任何 ORM XML 映射文件。
  • 更新:我尝试使用 EclipseLink 的 JPA 的更新 2.1.1。仍然收到相同的错误消息。
  • @OndroMih 谢谢你的建议。你的建议解决了我的问题。由于复制和粘贴问题,我在 ORM.xml 中的映射不正确。

标签: java jpa payara javax


【解决方案1】:

配置似乎与规范建议的一样。

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

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

试试看。如果它仍然不起作用,请尝试注释标记为 @MappedSuperClass 的类中的所有字段。

另外,C 类的字段应该标记为受保护而不是私有?

【讨论】:

  • 感谢您的回答,但没有成功。 C 类现在将其字段标记为受保护而不是私有,谢谢
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2021-10-06
    • 2023-02-09
    • 2013-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-19
    • 2012-05-06
    • 1970-01-01
    相关资源
    最近更新 更多