使用休眠将三张表合并为一张

时间:2020-04-24 13:51:41

标签: java hibernate jpa join

假设我有3个表,这些表由Java类表示:

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

Student{ 
int id;
String name;
}

Teacher{
int id
String name;
}

在我的代码中,我需要使用学生姓名和老师姓名,但是目前我只有他们的ID,使用休眠模式,我希望最终获得如下所示的实体:

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

我应该创建这样的类吗?或者我可以使用休眠逻辑通过其某些方法来获取此类对象列表的所有内容?我以为这项任务很普通,但是我是休眠的新手,我真的找不到很好的搜索词来在网络上找到一些好的例子。

2 个答案:

答案 0 :(得分:0)

使用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()之类的东西而言。 it's很好的教程

答案 1 :(得分:0)

因此,在浏览了多个教程并应用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;
    }
}

我想指出几个好的技巧:

  1. 我放弃使用Lombok @Data,因为它使用每个字段创建hasCode,这在大多数情况下是多余的。
  2. 性能方面最好的GenerationType.SEQUENCE是最好的,因为它会批量创建id(默认值= 50),不确定我的效果是否很好,因为我使用的是postgres,出于某种原因,它不能使用默认值,我有将分配大小设置为1。
  3. 默认应采用“延迟抓取”以避免N + 1问题