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是寻址SQL数据库的中间层,并且由于SQL数据库中的每一行都应该有一个唯一的标识符,Hibernate强制您定义一个

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


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

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


要了解更多信息,

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

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

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

JPA(不是Hibernate本身)要求所有实体都被唯一标识。遗憾的是,它不允许您需要什么

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

You can solve this using embedded id 
例:

例:


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

确保:

import javax.persistence.Id;
而不是:

import org.springframework.data.annotation.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;

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

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

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

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

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

指定一个用@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 {

}

如果类映射用作
只读
映射,并且没有
主键
@EmbeddedKey

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

}


基本上确保您的
注释字段与有问题的数据库表匹配

基本上确保您的
注释字段与有问题的数据库表匹配

您不能做任何事情。Hibernate需要一种唯一标识行的方法。并且此唯一值可能不会更改。@Hibernate中的JBNizet不可用有没有一种方法可以实现
复合键
确保从
javax.persistence
包中注释“Id”?你什么都做不了。Hibernate需要一种方法来唯一标识一行。而且这个唯一值可能不会更改。@jbnite在Hibernate中没有一种方法可以实现
复合键
确保从中注释“Id”
javax.persistence
package?这需要一个名为“id”的实际列吗?这个解决方案需要它,但是如果您有一个列,其中只有唯一值,那么它也可能是@id列。如果您决定自动生成一个列,那么您的数据库中也需要该列。好的,没有唯一值列的位置如何从存储过程返回?您是否可以尝试以下操作:
@Id\n@GeneratedValue\n private int Id;
如果要使用hibernate并因此使用SQL,您需要定义一个唯一的值列。提供的代码会自动创建该列并填充该列。有些替代存储系统不需要主键ired,但这不在本问题或答案的范围内。如果您不提供@Column注释,它将为您创建它。“sql数据库中的每一行都应具有唯一标识符”-这不是真的