#spring #hibernate #jpa #orm #hibernate-mapping
#spring #переход в спящий режим #jpa #orm #переход в спящий режим-сопоставление
Вопрос:
Я создал две сущности, а именно Teacher и Detail, фрагмент кода показан ниже
Teacher.java
@Entity
@Table(name = "teacher")
public class Teacher implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private long id;
@Column(name = "name")
private String name;
@Column(name = "age")
private int age;
@OneToOne(mappedBy = "teacher", cascade = CascadeType.ALL)
private Detail detail;
public Teacher() {
}
public Teacher(String name, int age) {
this.name = name;
this.age = age;
}
//getter and setter
}
Detail.java
@Entity
@Table(name = "detail")
public class Detail implements Serializable {
@Id
@OneToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "id")
private Teacher teacher;
@Column(name = "subjects")
private String subjects;
public Detail() {
}
public Detail(String subjects) {
this.subjects = subjects;
}
//getter and setter
}
Я пытаюсь добиться однозначного сопоставления с концепцией общего первичного ключа
но когда я запускаю контроллер, только таблица Teacher обновляется значением
try {
Teacher teacher=new Teacher("xyz",23);
Detail detail=new Detail("Java,c,c ");
teacher.setDetail(detail);
session.beginTransaction();
session.save(teacher);
session.getTransaction().commit();
model.addAttribute("added", "data inserted");
session.close();
}
После выполнения только таблица Teacher обновляется указанными значениями.Подробная таблица по-прежнему отображается пустой
Комментарии:
1. Попробуйте следующее: (a) Добавьте
@PrimaryKeyJoinColumn
вTeacher.id
поле. (b) Замените поле@Id
onDetail.teacher
на@MapsId
.2. Это не работает
Ответ №1:
Это работает не совсем так. Вам все еще нужно поле id в вашем Detail
, поэтому добавьте:
@Id
private long id;
для вашего Deatail
класса.
И — как следует из комментария — замените @Id
аннотацию в поле Teacher
на @MapsId
. Таким образом, идентификатор Teacher
сопоставляется с идентификатором Detail
, НО ТОЛЬКО в том случае, если вы также задаете для учителя значение detail — вам всегда нужно устанавливать обе стороны отношений, например:
teacher.setDetail(detail);
detail.setTeacher(teacher);