본 내용은 유튜브 나무소리님의 강의 내용을 정리한 내용입니다.
JPA 4-2 관계 매핑 기본(2)
연관 관계의 이해
- 영속객체간의 관계를 구성할 때 단순히 테이블의 관계에 따라 매핑하여 구성할 수도 있습니다.
- 테이블의 관계에서 다른 테이블의 기본키를 외래키로 갖는 것처럼 동일하게 영속객체의 관계를 구성할 수 있습니다.
- 하지만, 이 경우 객체간의 관계에서 특정 객체가 다른 객체를 참조하는 형태의 구성이 아니기 때문에 추가적인 작업이 필요합니다.
연관관계의 방향성 - @ManyToOne, @JoinColumn
- 영속객체 간의 관계는 방향성을 갖습니다. Student 클래스가 Major 클래스를 참조함으로 Student -> Major의 방향성을 갖습니다.
- 따라서, Student 객체를 참조하는 major를 통해 Major의 인스턴스 객체에 접근할 수 있습니다.
- 또한 하나의 Major를 다수의 Student가 참조하기 때문에 N : 1의 관계를 갖습니다.
- Student 클래스는 Major 클래스에 대해 ManyToOne의 관계, 그 반대의 경우에는 OneToMany의 관계가 됩니다.
package com.example.jpa.entity;
...
@Data
@NoArgsConstructor
@Entity
@Table(name = "STUDENT_TB")
public class Student {
@Id
@GeneratedValue
private Long studentId;
private String name;
private String grade;
@ManyToOne
@JoinColumn(name = "MAJORID") // 조인할 테이블 컬럼명
private Major major; // majorId를 major 참조로 변경
public Student(String name, String grade) {
this.name = name;
this.grade = grade;
}
}
...
transaction.begin();
try {
Major major = new Major("Computer Science", "College of Engineering");
entityManager.persist(major);
Student student = new Student("Kim", "3");
student.setMajor(major);
entityManager.persist(student);
entityManager.flush();
entityManager.clear();
// Student 검색
Student foundStudent = entityManager.find(Student.class, 1);
// Student의 전공 이름 검색
System.out.println(foundStudent.getMajor().getName());
transaction.commit();
}
...
- Student 객체가 Major 객체를 직접 참조하도록 코드를 변경 후 학생 정보를 검색하게 되면 Join을 통해 해당 데이터를 가져옵니다.
지연 로딩(Lazy)
- JPA에서 지연로딩은 데이터를 실제로 필요한 시점에 로딩합니다. 지연로딩은 특히 연관된 엔티티를 로딩할 때 사용되며, 해당 연관 엔티티가 실제로 필요한 시점에 로딩되도록 합니다.
@ManyToOne(fetch = FetchType.LAZY) // fetch 속성 추가
@JoinColumn(name = "MAJORID") // 조인할 테이블 컬럼명
private Major major;
// Student 검색
Student foundStudent = entityManager.find(Student.class, 1);
// Student의 전공 이름 검색
System.out.println(foundStudent.getMajor().getName()); // 이때 전공 정보 조회
'JPA' 카테고리의 다른 글
JPA 기초 - @Embeddable을 사용하여 다른 테이블 매핑하기 (0) | 2024.01.17 |
---|---|
JPA 기초 - @Embeddable (0) | 2024.01.17 |
JPA 기초 - 연관 관계의 이해 (0) | 2024.01.16 |
JPA 기초 - 필드와 컬럼 매핑(@Temporal, @Lob, @Enumerated, @Translent) (0) | 2024.01.15 |
JPA 기초 - 기본키 매핑(Table), 필드와 컬럼 매핑(@Column) (0) | 2024.01.15 |