시작이 반

[JPA] 연관관계 본문

Programming/JPA

[JPA] 연관관계

G_Gi 2021. 2. 18. 19:39
SMALL

방향

단방향, 양방향

테이블은 외래 키 하나로 조인을 사용하여 양방향으로 쿼리가 가능하므로 사실상 방향이라는 개념이 없다.

하지만 JPA에서는 그 개념이 존재한다. 단뱡향일 때는 한쪽에서만 관계를 참조해 조회해올 수 있고, 양방향일 때는 양쪽이 참조하고 있어서 양쪽에서 조회해 올 수 있다.

객체 관계에서 한 쪽만 참조하는 것을 단방향, 양쪽이 서로 참조하는 것을 양방향 관계라고 한다.

 

다중성

다대일(@ManyToOne), 일대다(@OneToMany), 일대일(@OneToOne), 다대다(@ManyToMany)

*주로 다대일 일대다를 많이쓴다.

연관관계의 주인

테이블은 외래키 하나로 두 테이블의 연관관계를 갖는다.

하지만 객체 양방향 관계는 A->B, B->A처럼 참조가 2군데 이다. JPA는 두 객체 연관관계 중 하나를 정해서 외래 키를 관리하는데 이것을 연관관계의 주인이라고 한다.

연관관계의 주인이 아니면 mappedBy 속성을 사용하여 연관관계의 주인 필드 이름을 값으로 넣는다.

 

 

다대일

데이터베이스 테이블의 일(1), 다(N) 관계에서 외래 키는 항상 다쪽에 있다. 따라서 객체 양방향 관계에서 연관관계의 주인은 항상 다쪽이다. 반대쪽 객체에 mappedBy를 사용한다.

 

일대다

일대다 관계는 다대일 관계의 반대이다. 일대다 관계는 엔터티를 하나 이상 참조할 수 있다. 때문에 자바의 Collection, List, Set, Map중 하나를 사용해야 한다.

 

양방향 연관관계 매핑

@Entity
public class Reply {
    @Id //Primary Key
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;
    
    @Column(nullable = false, length = 200)
    private String content;
    
    //기본전략 : EAGER, 바로가져오는 전략
    @ManyToOne //Many : Reply , One : Board
    @JoinColumn(name = "board_id")
    private Board board;

}
@Entity
public class Board {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;
    
    @Column(nullable = false, length = 100)
    private String title;

    @Lob //대용량 데이터
    private String content;

    //OneToMany 기본전략 : LAZY ,필요하면 들고오고 안필요하면 안들고옴
    @OneToMany(mappedBy = "board")// One = Board, Many = Reply , FK가 필요없다
    private List<Reply> reply;    // mappedBy: 연관관계의 주인이 아니다 (FK가 아니다, DB에 컬럼을 만들지마라)
                                  // join 문을 통해 값을 얻기위해 필요한 것

}

게시글과 댓글은 일대다 관계이다 게시글 Entity에 List<Reply> reply를 추가하였고 일대다 관계를 매핑하기위해 @OneToMany를 사용하였다. @OneToMany의 mappedBy속성은 양방향 매핑일때 사용한다. 반대쪽 매핑의 필드 이름을 값으로 주면 된다. 

 

연관관계의 주인은 테이블에 외래 키가 있는 곳으로 정한다.

 

@ManyToOne의 기본 Fetch전략은 FetchType=EAGER 이다.

@OneToMany의 기본 Fetch전략은 FetchType=LAZY이다.

 

Eager 전략은 엔티티를 조회할 때, 연관 관계에 있는 엔티티도 함께 가져오고, 반대로 Lazy 전략은 연관 관계 엔티티를 참조할 때 그때 가져온다.

 

 

참고 주소를 보고 정리한 내용이다... 어렵다... 계속 보도록하자...

 

참고

LIST

'Programming > JPA' 카테고리의 다른 글

[JPA] 변경감지와 병합(merge)  (1) 2021.05.27
[JPA] DTO, Domain(Entity)  (0) 2021.02.19
[JPA] Paging  (0) 2021.02.05
[JPA] List<DTO> to List<Entity> (DTO, Entity)  (0) 2021.02.01
[JPA] JpaRepository  (0) 2021.01.31