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的主要内容,如果未能解决你的问题,请参考以下文章