【问题标题】:Org.Hibernate.AnnotationException: No Identifier Specified For Entity I don't have a id in my tableOrg.Hibernate.AnnotationException:没有为实体指定标识符我的表中没有 id
【发布时间】: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”?

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


【解决方案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
                猜你喜欢
                • 2014-04-06
                • 2015-07-25
                • 2016-01-31
                • 2020-05-02
                • 1970-01-01
                • 2013-02-25
                • 2021-05-19
                • 2011-05-21
                相关资源
                最近更新 更多