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

时间:2014-09-15 14:59:43

标签: java hibernate spring-mvc jpa spring-data

我正在使用数据库中的表格,并且该表格没有主键或适当的列,这些列具有可作为主键的唯一值,我没有修改该表的权限。

我该怎么办?我尝试将@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;
}

10 个答案:

答案 0 :(得分:134)

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

确定它:

import javax.persistence.Id;

而不是:

import org.springframework.data.annotation.Id;

答案 1 :(得分:12)

Hibernate是解决SQL数据库的中间件,因为sql数据库中的每一行都应该有一个唯一的标识符,所以hibernate会强制你定义一个。

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

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

由于不允许重复,因此无法选择任意列。

答案 2 :(得分:3)

JPA(不是Hibernate)要求所有实体都是唯一标识的。可悲的是,它并不能满足您的需求。

另一方面,JDO允许一个可持久的类映射到没有PK的表,并且可以处理你需要的东西。

答案 3 :(得分:1)

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

了解更多信息,here

答案 4 :(得分:1)

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

答案 5 :(得分:1)

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

答案 6 :(得分:0)

确保为每个实体定义了p.k约束,并检查Id Annotation的import语句。 检查Import语句:

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

答案 7 :(得分:0)

指定一个用@Id注释的字段。每个@Entity都需要一个@Id(这是表中的主键)。 为您提供的解决方案是使用@Embeddable而不是@Entity,那么您将不需要使用@Id注释任何列。从javax.persistence.Entity更改import语句;到javax.persistence.Embeddable;

答案 8 :(得分:0)

如果您的类映射用作@Embeddable映射并且没有@EntityreadOnly

,请使用PK注释代替@EmbeddedKey
//@Entity
@Embeddable
@Table(name = "my_table")
public class MyTable implements Serializable {

}

答案 9 :(得分:0)

基本上确保您的 Column 注释字段与相关数据库表相匹配