我正在使用数据库中的一个表,并且该表没有主键或具有唯一值的适当列(可以充当主键),我无权更改该表。
我该怎么办?我尝试将 @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;
}
我遇到了这个问题,并且使用了错误的 @id 导入:
确保它是:
import javax.persistence.Id;
而不是:
import org.springframework.data.annotation.Id;
Hibernate 是处理 SQL 数据库的中间体,并且由于 sql 数据库中的每一行都应该有一个唯一的标识符,因此 hibernate 强制您定义一个标识符。
这是生成主键的示例,它将自动添加(不要忘记 getter 和 setter)
@Id
@GeneratedValue
@Column(name = "id")
private int id;
由于不允许重复,因此选择任意列并不是正确的方法。
也有同样的问题。问题是@Id注释导入错误。因此,请确保您不仅注释了 id,而且还使用 javax.persistence.Id 进行注释。
JPA(不是 Hibernate)要求所有实体都被唯一标识。可悲的是它不允许你想要的。
另一方面,JDO 确实允许持久类映射到没有 PK 的表,并且可以处理您需要的内容。
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
它不是突出
Hibernate
- 关系 datamodel
需要 primary keys
。所以你得到的是一个损坏的数据模型,因为没有主键它就不能是关系的,这就是为什么它很难与 ORM 一起使用。
欲了解更多信息,这里
确保为每个实体定义了 p.k 约束,并检查 Id Annotation 的导入语句。 检查进口声明:
import javax.persistence.Id;
@Id
@Column(name="id")
@GeneratedValue
private int id;
指定用@Id注释的字段。每个@Entity都需要一个@Id(这是表中的主键)。 适合您的解决方案是使用 @Embeddable 而不是 @Entity,然后您不需要使用 @Id 注释任何列。更改 javax.persistence.Entity 的导入语句;到 javax.persistence.Embeddable;
如果您的类映射用作
@Embeddable
映射并且没有 @Entity
或 readOnly
,请使用
PK
注释而不是
@EmbeddedKey
//@Entity
@Embeddable
@Table(name = "my_table")
public class MyTable implements Serializable {
}
基本上确保您的
Column
注释字段与相关数据库表匹配
要求:表没有主键或具有唯一值的适当列 解决方案:只需为您的 id 添加一个虚拟列,并在其余的 select 语句中忽略它。想象一下,这样的列并不满足您不需要主键的所有要求。为此列设置一些自动增量机制或基于顺序的机制。 您需要:不过,根据需要更改表的权限。
使用
@id
注释作为主键