Общий первичный ключ между двумя объектами не работает

#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 on Detail.teacher на @MapsId .

2. Это не работает

Ответ №1:

Это работает не совсем так. Вам все еще нужно поле id в вашем Detail , поэтому добавьте:

 @Id
private long id;
  

для вашего Deatail класса.

И — как следует из комментария — замените @Id аннотацию в поле Teacher на @MapsId . Таким образом, идентификатор Teacher сопоставляется с идентификатором Detail , НО ТОЛЬКО в том случае, если вы также задаете для учителя значение detail — вам всегда нужно устанавливать обе стороны отношений, например:

 teacher.setDetail(detail);
detail.setTeacher(teacher);