#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, вам следует либо отредактировать свой вопрос и раскрыть эту проблему, либо задать новый вопрос.