我正在使用数据库中的表格,并且该表格没有主键或适当的列,这些列具有可作为主键的唯一值,我没有修改该表的权限。
我该怎么办?我尝试将@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;
}
答案 0 :(得分:134)
我遇到了这个问题并使用了错误的导入@id:
确定它:
import javax.persistence.Id;
而不是:
import org.springframework.data.annotation.Id;
答案 1 :(得分:12)
Hibernate是解决SQL数据库的中间件,因为sql数据库中的每一行都应该有一个唯一的标识符,所以hibernate会强制你定义一个。
以下是生成的主键示例,它将自动添加(不要忘记getter和setter)
@Id
@GeneratedValue
@Column(name = "id")
private int id;
由于不允许重复,因此无法选择任意列。
答案 2 :(得分:3)
JPA(不是Hibernate)要求所有实体都是唯一标识的。可悲的是,它并不能满足您的需求。
另一方面,JDO允许一个可持久的类映射到没有PK的表,并且可以处理你需要的东西。答案 3 :(得分:1)
它不是juts Hibernate
- 关系datamodel
需要primary keys
。所以你所拥有的是一个破碎的数据模型,因为没有主键它就不能成为关系,这就是为什么它难以与ORM一起使用。
了解更多信息,here
答案 4 :(得分:1)
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 :(得分:1)
也有同样的问题。问题是导入@Id注释错误。因此,请确保您不仅要注释id,还要使用javax.persistence.Id进行注释。
答案 6 :(得分:0)
确保为每个实体定义了p.k约束,并检查Id Annotation的import语句。 检查Import语句:
import javax.persistence.Id;
@Id
@Column(name="id")
@GeneratedValue
private int id;
答案 7 :(得分:0)
指定一个用@Id注释的字段。每个@Entity都需要一个@Id(这是表中的主键)。 为您提供的解决方案是使用@Embeddable而不是@Entity,那么您将不需要使用@Id注释任何列。从javax.persistence.Entity更改import语句;到javax.persistence.Embeddable;
答案 8 :(得分:0)
如果您的类映射用作@Embeddable
映射并且没有@Entity
或readOnly
PK
注释代替@EmbeddedKey
//@Entity
@Embeddable
@Table(name = "my_table")
public class MyTable implements Serializable {
}
答案 9 :(得分:0)
基本上确保您的 Column
注释字段与相关数据库表相匹配