먹었으면 뇌를 쓰자

JPA 학습 내용을 정리한 로드맵 - 2.2 일대다 연관관계 본문

Framework/JPA

JPA 학습 내용을 정리한 로드맵 - 2.2 일대다 연관관계

뇌이비 2022. 12. 20. 07:44

 

1. JPA란 무엇인가
     1.1 기본 CRUD
     1.2 기초 지식

2. 연관관계
     2.1 다대일 연관관계 
     2.2 일대다 연관관계 

3. 상속
     3.1 상속관계
     3.2 CASCADE

4. SQL
     4.1 JPQL
     4.2 Querydsl

 

 

 

2.2 일대다 연관관계

 

 

앞서 살펴본 다대일 연관관계(@ManyToOne)은 

다 쪽인 Item이 일 쪽인 PurchaseOrder의 FK를 관리하는 관점이었다.

하지만 객체 지향 프로그래밍에서는 일대다 연관관계(@OneToMany)까지

양방향으로 참조하기를 지향한다.

 

만약 일대다 연관관계의 단방향 참조만 이루어진다면 어떻게 될까? 

PurchaseOrder 엔티티에서 Item 엔티티로 일대다 단방향 참조만 이루어졌다고 해보자.

 

PurchaseOrder와 Item가 각각 일대다 관계로 연결된 

중간 테이블 PurchaseOrder_Item 이 발생한다. 

중간 테이블은 두 엔티티를 연결만 할 뿐, 아무 쓸모가 없어 비효율적이다.

 

PurchaseOrder 엔티티에서 @JoinColumn을 해서 중간 테이블을 없앤다 해도,

Item 엔티티가 FK를 관리하고 있지 않기 때문에

추가 쿼리가 실행되는 비효율이 발생한다. 

 

 

결론. 다대일과 일대다 연관관계를 양방향으로 설정하자. 

 

 

 

덧. 일대일 연관관계 (@OneToOne)

 

일대일 연관관계에서는 어떤 한쪽이 FK를 관리해도 상관없다.

 

 

<Manuscript.class> (one)


@Entity
public class Manuscript {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "MANUSCRIPT_ID")
private Long id;
private byte[] file;

@OneToOne(mappedBy = "manuscript")
private Book book;
<Book.class> (one)


@Entity
public class Book {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "BOOK_ID")
private Long id;
private String ISBN;

@OneToOne
@JoinColumn(name = "MANUSCRIPT_ID") // Book이 FK를 관리하는 구조
private Manuscript manuscript;

 

<Main.class>


Manuscript manuscipt = new Manuscript();
Book book = new Book();
book.setISBN("ABCD12");
book.setManuscript(manuscript);
manuscript.setBook(book);

em.persist(manuscirpt);
em.persist(book); // FK를 관리하는 book이 나중에

 

 

Comments