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

Posted

技术标签:

【中文标题】Org.Hibernate.AnnotationException:没有为实体指定标识符我的表中没有 id【英文标题】:Org.Hibernate.AnnotationException: No Identifier Specified For Entity I don't have a id in my table 【发布时间】:2014-11-09 03:44:16 【问题描述】:

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

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

【问题讨论】:

你什么也做不了。 Hibernate 需要一种唯一标识行的方法。而且这个独特的价值可能不会改变。 @JBNizet 在休眠中没有办法实现composite keys 确保您从javax.persistence 包中注释“Id”? 【参考方案1】:

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

确保它是:

import javax.persistence.Id;

而不是:

import org.springframework.data.annotation.Id;

【讨论】:

@Id 需要是整数,或者可以转换为整数,还是我弄错了? 我错了,我的问题出在其他地方。我设法使用 @Enumerated(EnumType.STRING) 列作为 id。我返回的是单列的单行,所以这个枚举默认是唯一的。 你真的拯救了我的一天 :) 谢谢你,你拯救了我的一天! 如此简单,但当你依赖你的 ide 时就会发生这种情况:/ 谢谢。【参考方案2】:

Hibernate 是寻址 SQL 数据库的中间体,由于 sql 数据库中的每一行都应该有一个唯一的标识符,所以 hibernate 强制你定义一个。

这里是一个生成主键的例子,它会自动添加(不要忘记getter和setter)

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

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

【讨论】:

这是否需要一个名为“id”的实际列? 此解决方案需要它,但如果您有一个只有唯一值的列,那也可能是 @Id 列。如果您决定自动生成一个,您还需要数据库中的该列。 好的,如果存储过程没有返回唯一值列呢?您能否尝试以下方法:@Id \n @GeneratedValue \n private int id; 如果你想使用hibernate和SQL,你需要定义一个唯一值列。提供的代码会自动创建此列并填充它。有一些替代存储系统不需要主键,但这不在此问题或答案的范围内。如果您不提供 @Column 注释,它将为您创建它。 "sql 数据库中的每一行都应该有一个唯一的标识符" - 这是不正确的。【参考方案3】:

JPA(不是 Hibernate 本身)要求唯一标识所有实体。可悲的是,它不允许你想要什么。

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

【讨论】:

JDO 是什么,你能给我一个学习的链接吗,因为我对此一无所知 为什么不使用 Internet 搜索“Java 数据对象”或 JDO?【参考方案4】:
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】:

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

【讨论】:

【参考方案6】:

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

更多信息,here

【讨论】:

【参考方案7】:

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

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

【讨论】:

【参考方案8】:

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

【讨论】:

【参考方案9】:

如果您的类映射用作readOnly 映射并且没有PK@EmbeddedKey,则使用@Embeddable 注释而不是@Entity

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


【讨论】:

【参考方案10】:

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

【讨论】:

【参考方案11】:

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

【讨论】:

正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center。

以上是关于Org.Hibernate.AnnotationException:没有为实体指定标识符我的表中没有 id的主要内容,如果未能解决你的问题,请参考以下文章