Многие к одному отношения с условием

#java #spring-boot #hibernate #many-to-one

#Ява #пружинный ботинок #зимовать #многие к одному

Вопрос:

У меня есть два стола, ученик и учитель, с множеством отношений. Структура таблицы выглядит следующим образом

 student(  id long,  student_id string,  ....  teacher_id string,  active boolean )  teacher(  id long,  teacher_id string,  ....  active boolean )  

Я использую весеннюю загрузку и спящий режим. Здесь при обновлении сущности активному столбцу существующей строки в таблице будет присвоено значение false, а новая строка будет добавлена с новым идентификатором(длинным) и активной как true. Вот почему в каждой таблице есть два значения идентификатора. Проблема здесь в том, что я указал отношение ученик-учитель как много к одному в моей сущности с внешним ключом, как teacher_id.

 @Entity @Table(name = "student") public class Student {  @Id  @GeneratedValue(strategy = GenerationType.IDENTITY)  private Long id;   @Column(name = "student_id")  private String studentId;   @ManyToOne  @JoinColumn(name = "teacher_id", referencedColumnName = "teacher_id")  private Teacher teacher;   @Column(name = "active")  @JsonIgnore  private Boolean active = true; }  @Entity @Table(name = "teacher") public class Teacher {   @Id  @GeneratedValue(strategy = GenerationType.IDENTITY)  private Long id;   @Column(name = "teacher_id")  private String teacherId;   @OneToMany(mappedBy = "teacher")  private Setlt;Studentgt; students = new HashSetlt;gt;();   @Column(name = "active")  @JsonIgnore  private Boolean active = true; }  

Но так как несколько учителей могут встречаться с одним и тем же идентификатором teacher_id, это не удается. Есть ли какой-либо способ дать условие отношениям, чтобы получить учителя с активным как истинным? В таблице будет только один учитель с заданным идентификатором и активным как true.

Комментарии:

1. Вероятно, вам также следует включить класс сущностей для Teacher .

2. Добавлена сущность учителя @TimBiegeleisen

3. «несколько учителей могут встречаться с одним и тем же идентификатором teacher_id» -gt; это не должно быть возможным. это противоречит всей цели удостоверения личности.

4. Первичным ключом сущности Teacher является идентификатор, а не идентификатор teacher_id. Идентификатор изменится, когда объект будет обновлен. И сущность student сопоставляется с идентификатором teacher_id, а не с идентификатором.

5. @Nipun, что не имеет смысла, поскольку для этого «идентификатора» есть/могут быть дубликаты, вы никогда не узнаете, с каким учителем на самом деле сопоставлен ваш ученик

Ответ №1:

В сущности не должно быть teacher_id поля внешнего ключа Teacher . Вместо этого просто используйте столбец первичного ключа id . Рассмотрите эту версию ваших сущностей:

 @Entity @Table(name = "student") public class Student {  @Id  @GeneratedValue(strategy = GenerationType.IDENTITY)  private Long id;   @Column(name = "student_id")  private String studentId;   @ManyToOne  @JoinColumn(name = "teacher_id", referencedColumnName = "id")  private Teacher teacher;   @Column(name = "active")  @JsonIgnore  private Boolean active = true; }  @Entity @Table(name = "teacher") public class Teacher {  @Id  @GeneratedValue(strategy = GenerationType.IDENTITY)  private Long id;   @OneToMany(mappedBy = "teacher")  private Setlt;Studentgt; students = new HashSetlt;gt;();   @Column(name = "active")  @JsonIgnore  private Boolean active = true; }  

Этот дизайн должен обеспечивать, чтобы данный ученик мог быть связан только с одним учителем (хотя у данного учителя может быть несколько учеников).

Комментарии:

1. Да, это сработает, но проблема здесь в том, что всякий раз, когда я обновляю сущность учителя, создается новая строка(требование клиента) с новым идентификатором. Поэтому, если я сопоставляю идентификатор, мне также нужно позаботиться об обновлении сопоставленного идентификатора в сущности student, верно?

2. Нет, не совсем так. Допустим, вы выбираете определенного учителя, а затем создаете нового Student . До тех пор, пока вы назначаете отношения от ученика к учителю, когда вы save() JPA/Hibernate должны позаботиться об остальном за вас.

3. Рассмотрим этот сценарий: я создал Учителя -gt; создал Ученика с сопоставлением с этим Учителем -gt;gt; Обновляет Учителя, а не Ученика. это не изменит сопоставленный идентификатор учащегося, верно?

4. Я ответил на ваш первоначальный вопрос, который, по моей оценке, был сосредоточен вокруг определений сущностей. Если вам нужна помощь с каким-либо рабочим процессом JPA, вам следует либо отредактировать свой вопрос и раскрыть эту проблему, либо задать новый вопрос.