Общий первичный ключ между двумя объектами не работает - PullRequest
0 голосов
/ 20 марта 2019

Я создал две сущности, а именно 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
}

Я пытаюсь достичь однозначного сопоставления с концепцией общего первичного ключа но когда я выполняю контроллер, обновляется только таблица учителя со значением

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();
}

После выполнения только таблица учителя обновляется с указанными значениями. Подробная таблица по-прежнему отображается пустой

1 Ответ

0 голосов
/ 20 марта 2019

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

@Id
private long id;

к вашему Deatail классу.

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

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