Ответ 1
У меня была эта проблема и я использовал неправильный импорт для @id:
Убедитесь, что это:
import javax.persistence.Id;
и не:
import org.springframework.data.annotation.Id;
Я работаю с таблицей в базе данных, и в этой таблице нет первичного ключа или соответствующего столбца с уникальным значением, которое может выступать в качестве первичного ключа, у меня нет прав на изменение этой таблицы.
Что мне делать? Я попытался помещать аннотацию @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 должна иметь уникальный идентификатор, спящий режим заставляет вас определять его.
Вот пример сгенерированного первичного ключа, который будет добавлен автоматически (не забудьте getter и setter)
@Id
@GeneratedValue
@Column(name = "id")
private int id;
Так как дубликаты не разрешены, выбор произвольного столбца не подходит.
JPA (а не Hibernate как таковой) требует, чтобы все объекты были идентифицированы однозначно. К сожалению, это не позволяет делать то, что вы хотите.
JDO, с другой стороны, позволяет устойчивому классу сопоставлять таблицу без PK и обрабатывать то, что вам нужно.
Не для него Hibernate
- реляционный datamodel
требуется primary keys
. Итак, у вас есть сломанная модель данных, потому что без первичного ключа она не может быть реляционной, и поэтому ее трудно использовать с ORM.
для получения дополнительной информации, здесь
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
Также была проблема. Проблема заключалась в неправильном вводе аннотации @Id. Поэтому, пожалуйста, убедитесь, что вы не только аннотируете идентификатор, но и выполняете его с помощью javax.persistence.Id.
Убедитесь, что для каждой сущности определено ограничение p.k, и проверьте оператор импорта для Id Annotation. Проверьте операцию импорта:
import javax.persistence.Id;
@Id
@Column(name="id")
@GeneratedValue
private int id;