Org.Hibernate.AnnotationException:没有为实体指定标识符我的表中没有 id

问题描述 投票:0回答:12

我正在使用数据库中的一个表,并且该表没有主键或具有唯一值的适当列(可以充当主键),我无权更改该表。

我该怎么办?我尝试将 @id 注释放在随机列中并且它有效,但我不知道这是否会在以后带来任何麻烦。我能做什么?

我的班级

@Entity
@Table(name="my_table")
public class TheTable {
@Column (name="name", nullable=false)
    private String name;

    @Id <--- I just put this id in this random column but this column should not be a id column
    @Column (name="anyfield", nullable=false)
    private String anyfield;
}
java hibernate spring-mvc jpa spring-data
12个回答
186
投票

我遇到了这个问题,并且使用了错误的 @id 导入:

确保它是:

import javax.persistence.Id;

而不是:

import org.springframework.data.annotation.Id;

11
投票

Hibernate 是处理 SQL 数据库的中间体,并且由于 sql 数据库中的每一行都应该有一个唯一的标识符,因此 hibernate 强制您定义一个标识符。

这是生成主键的示例,它将自动添加(不要忘记 getter 和 setter)

@Id 
@GeneratedValue
@Column(name = "id")
private int id;

由于不允许重复,因此选择任意列并不是正确的方法。


4
投票

也有同样的问题。问题是@Id注释导入错误。因此,请确保您不仅注释了 id,而且还使用 javax.persistence.Id 进行注释。


3
投票

JPA(不是 Hibernate)要求所有实体都被唯一标识。可悲的是它不允许你想要的。

另一方面,JDO 确实允许持久类映射到没有 PK 的表,并且可以处理您需要的内容。


3
投票
You can solve this using embedded id 

例如:

@Entity
@Table(name = "my_table")
public class MyTable implements Serializable {

    private static final long serialVersionUID = 1L;

    // @Id
    @Column(name = "id", insertable = false, updatable = false)
    private String id;

    @EmbeddedId
    MYtablePK pk;

    public MYtablePK getPk() {
        return pk;
    }

    public void setPk(MYtablePK pk) {
        this.pk = pk;
    }

    @Column(name = "my_table_FirstName", insertable = false, updatable = false)
    private String name;

    @Transient
    public String getName() {
        return pk.getName();
    }

    public void setName(String mrn) {
        pk.setName(name);
    }
    @Transient
        public String getSeverity() {
        return pk.getSeverity();
    }
    public void setSeverity(String severity) {
        pk.setName(name);
    }

    public String getId() {
        return pk.getId();
    }
    public void setId(String id) {
        this.id = id;
    }
    public String getName() {
        return pk.getName();
    }
    public void setName(String name) {
        tpk.setName(name);
    }
}

@Embeddable
public class MyTablePK implements Serializable{

    /**
     * 
     */
    private static final long serialVersionUID = -1257821517891392898L;
    @Column(name = "id")
    private String id;
    @Column(name = "name")
    private String name;
    @Column(name = "dob")
    private Date dob;
    public Date getdob() {
        return dob;
    }
    public void setdob(Date dob) {
        this.pk.setdob(dob);
    }
    @Column(name = "severity")
    private String severity;
    public String getSeverity() {
        return severity;
    }
    public void setSeverity(String severity) {
        this.severity = severity;
    }

    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name

1
投票

它不是突出

Hibernate
- 关系
datamodel
需要
primary keys
。所以你得到的是一个损坏的数据模型,因为没有主键它就不能是关系的,这就是为什么它很难与 ORM 一起使用。

欲了解更多信息,这里


0
投票

确保为每个实体定义了 p.k 约束,并检查 Id Annotation 的导入语句。 检查进口声明:

import javax.persistence.Id;
@Id
@Column(name="id")
@GeneratedValue 
private int id;

0
投票

指定用@Id注释的字段。每个@Entity都需要一个@Id(这是表中的主键)。 适合您的解决方案是使用 @Embeddable 而不是 @Entity,然后您不需要使用 @Id 注释任何列。更改 javax.persistence.Entity 的导入语句;到 javax.persistence.Embeddable;


0
投票

如果您的类映射用作

@Embeddable
映射并且没有
@Entity
readOnly
,请使用 
PK
 注释而不是 
@EmbeddedKey

//@Entity
@Embeddable
@Table(name = "my_table")
public class MyTable implements Serializable {

}

0
投票

基本上确保您的

Column
注释字段与相关数据库表匹配


0
投票

要求:表没有主键或具有唯一值的适当列 解决方案:只需为您的 id 添加一个虚拟列,并在其余的 select 语句中忽略它。想象一下,这样的列并不满足您不需要主键的所有要求。为此列设置一些自动增量机制或基于顺序的机制。 您需要:不过,根据需要更改表的权限。


0
投票

使用

@id
注释作为主键

© www.soinside.com 2019 - 2024. All rights reserved.