Объединение трех таблиц в одну с помощью Hibernate - PullRequest
0 голосов
/ 24 апреля 2020

Допустим, у меня есть 3 таблицы, которые представлены Java классами:

ClassRoom {
int id;
int student_id;
int teacher_id;
String name;
}

Student{ 
int id;
String name;
}

Teacher{
int id
String name;
}

В моем коде мне нужно будет использовать имя ученика и имя учителя, но в настоящее время у меня есть только их идентификаторы, используя hibernate Я хочу в конечном итоге получить сущность, подобную приведенной ниже:

ClassRoom {
int id 
String name;
String studentName;
String teacherName;
}

Должен ли я создать такой класс? Или я могу сделать все, используя hibernate logi c через какой-то его метод, чтобы получить список таких объектов? Я предполагаю, что это обычная задача, но я новичок в спящем режиме, и я не могу найти хороших поисковых слов, чтобы найти несколько хороших примеров в Интернете.

Ответы [ 2 ]

0 голосов
/ 27 апреля 2020

Итак, после просмотра нескольких руководств, а также применения DrHelmholtz, советую, что я настроил следующую настройку для моего classRoom:

@Getter
@Setter
@EqualsAndHashCode(of = {"className"})
@ToString(of = {"id", "className", "student", "teacher"})
@NoArgsConstructor
@Entity(name = "Classroom")
public class ClassRoom {
    @Id
    @SequenceGenerator(name = "hibernateSeq", sequenceName = "HIBERNATE_SEQUENCE", allocationSize = 1)
    @GeneratedValue( strategy = GenerationType.SEQUENCE, generator = "hibernateSeq")
    private Long id;
    @Column(name = "class_name")
    private String className;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "student_id", foreignKey = @ForeignKey(name="fk_student"))
    private Student student;


    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "teacher_id", foreignKey = @ForeignKey(name="fk_teacher"))
    private Teacher teacher;

    public ClassRoom(final String className) {
        this.className = className;
    }
}

Есть несколько хороших советов, на которые я хотел бы указать out:

  1. Я отказался от использования Lombok @Data, потому что он создает hasCode, используя каждое отдельное поле, что в большинстве случаев является чрезмерным.
  2. Лучшая производительность GenerationType.SEQUENCE - лучший, потому что он создает идентификаторы в пакетах (по умолчанию = 50), не уверен, что мой был настолько хорош, потому что я использую postgres, который по некоторым причинам не работает со значениями по умолчанию я должен был установить allocSize в 1.
  3. Ленивая выборка должна быть по умолчанию, чтобы избежать проблемы N + 1
0 голосов
/ 24 апреля 2020

Использовать ForeignKey.

ClassRoom {
 int id;

 @ManyToOne
 @JoinColumn(name = "student_id", foreignKey = @ForeignKey(name = "fk_student"))
 Student student_id;

 @OneToMany
 @JoinColumn(name = "teacher_id", foreignKey = @ForeignKey(name = "fk_teacher"))
 Teacher teacher_id;

 String name;
}

Чем вы можете использовать его как классы, например .getName () или что-то еще. это довольно хороший учебник

...