Java Org.Hibernate.AnnotationException:没有为实体I指定标识符';我桌上没有身份证

Java Org.Hibernate.AnnotationException:没有为实体I指定标识符';我桌上没有身份证,java,hibernate,spring-mvc,jpa,spring-data,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

我正在处理数据库中的一个表,但该表没有主键或具有唯一值(可以用作主键)的适当列,我没有更改该表的权限

我该怎么办?我试着在一个随机列中添加一个@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;
}
@实体
@表(name=“my_表”)
公共类表格{
@列(name=“name”,nullable=false)
私有字符串名称;

@IdHibernate是寻址SQL数据库的中间层,由于SQL数据库中的每一行都应该有一个唯一的标识符,Hibernate强制您定义一个标识符

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


因为不允许重复,所以选择任意列是不可取的。

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

更多信息,JPA(不是Hibernate)要求所有实体都被唯一标识。遗憾的是,它不允许您想要什么

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

You can solve this using embedded id 
例:


我遇到了这个问题,并且对@id:

确保:

import javax.persistence.Id;
而不是:

import org.springframework.data.annotation.Id;

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

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

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

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

如果类映射用作
只读
映射,则使用
@embeddeble
注释而不是
@Entity
并且没有
PK
@EmbeddedKey

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

}

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

您不能做任何事情。Hibernate需要一种唯一标识行的方法。并且这个唯一值可能不会更改。@Hibernate中的jbnize没有实现
复合键的方法
确保您从
javax.persiste中注释“Id”nce
package?这是否需要一个名为“id”的实际列?此解决方案需要它,但如果您有一个只包含唯一值的列,则该列也可以是@id列。如果您决定自动生成一个列,那么您的数据库中也需要该列。好的,如果sto没有返回唯一值列,该如何处理红色过程?您可以尝试以下操作:
@Id\n@GeneratedValue\n private int Id;
如果要使用hibernate并因此使用SQL,您需要定义一个唯一的值列。提供的代码会自动创建此列并将其填充。有些替代存储系统不需要主键,但不需要主键在这个问题或答案的范围内。如果您不提供@Column注释,它将为您创建它。“sql数据库中的每一行都应该有一个唯一的标识符”-这不是真的。@Id需要是一个整数,或者可以转换为整数,或者我错了吗?我错了,我的问题在别处。我已经设法使用了@Enumerated(EnumType.STRING)列作为id。我返回的是一行一列,因此此枚举在默认情况下是唯一的。您确实保存了我的日期:)谢谢你,你救了我一天!!很简单,但是当你依赖你的ide时就会发生:/谢谢。什么是
JDO
,你能给我一个链接来学习它吗,因为我对它一无所知为什么不使用Internet搜索“Java数据对象”或JDO?
import javax.persistence.Id;
@Id
@Column(name="id")
@GeneratedValue 
private int id;
//@Entity
@Embeddable
@Table(name = "my_table")
public class MyTable implements Serializable {

}