JPA 기초 - 연관관계의 방향성(ManyToOne, JoinColumn)

2024. 1. 16. 16:54·JPA
본 내용은 유튜브 나무소리님의 강의 내용을 정리한 내용입니다.
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을 통해 해당 데이터를 가져옵니다.

STUDENT_TB와 MAJOR_TB LEFT 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
'JPA' 카테고리의 다른 글
  • JPA 기초 - @Embeddable을 사용하여 다른 테이블 매핑하기
  • JPA 기초 - @Embeddable
  • JPA 기초 - 연관 관계의 이해
  • JPA 기초 - 필드와 컬럼 매핑(@Temporal, @Lob, @Enumerated, @Translent)
PortLee
PortLee
  • PortLee
    프로그래밍 공부
    PortLee
  • 전체
    오늘
    어제
    • 분류 전체보기
      • C++
      • JAVA
      • JPA
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    entity mapping
    @Access
    @AttributeOverride
    allocationSize
    Entity
    @Table
    @CollectionTable
    Entity 연관관계
    Table 기본키 생성 전략
    1-1연관관계
    다른 테이블 매핑
    JoinColumn
    map
    MemberService
    JPA
    MemberEntity
    set
    컬랙션 매핑
    식별자공유
    MemberRepository
    필드와 컬럼 매핑
    persistence.xml
    컬렉션 매핑
    list
    Translent
    SQL Mapping
    기본키 매핑
    1-N
    @Basic
    @Embeddable
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
PortLee
JPA 기초 - 연관관계의 방향성(ManyToOne, JoinColumn)
상단으로

티스토리툴바