연관관계 매핑

객체의 참조와 테이블의 외래키를 매핑하는 것

방향

단방향 관계 : 두 엔티티가 관계를 맺을 때, 한 쪽의 엔티티만 참조하고 있는 것을 의미

양방향 관계 : 두 엔티티가 관계를 맺을 때, 양 쪽이 서로 참조하고 있는 것을 의미

다중성

ManyToOne : 다대일
OneToMany : 일대다
OneToOne : 일대일
ManyToMany : 다대다

@JoinColumn 어노테이션과 함께 쓰인다

연관관계의 주인(mappedBy)

연관관계의 주인만이 외래키를 관리할 수 있고, 주인이 아닌 엔티티는 읽기만 할 수 있다

영속성 전이(casecade)

CascadeType.ALL
모든 Cascade를 적용한다.

CascadeType.PERSIST
엔티티를 영속화할 때, 연관된 하위 엔티티도 함께 유지한다.

CascadeType.MERGE
엔티티 상태를 병합(Merge)할 때, 연관된 하위 엔티티도 모두 병합한다.

CascadeType.REMOVE
엔티티를 제거할 때, 연관된 하위 엔티티도 모두 제거한다.

CascadeType.DETACH
영속성 컨텍스트에서 엔티티 제거
부모 엔티티를 detach() 수행하면, 연관 하위 엔티티도 detach()상태가 되어 변경 사항을 반영하지 않는다.

CascadeType.REFRESH
상위 엔티티를 새로고침(Refresh)할 때, 연관된 하위 엔티티도 모두 새로고침한다.

고아 객체 제거(orphanRemoval)

부모와 연관 관계가 끊어진 자식 엔티티를 자동으로 삭제하는 기능

orphanRemoval = true 로 설정하면 자식 엔티티의 부모 잠조만 제거해도 자식 엔티티가 자동으로 삭제된다

예시

@Entity
@Getter @Setter
public class Member {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(nullable = false)
    private String username;

    @ManyToOne
    @JoinColumn(name = "TEAM_ID")

    private Team team;

}
@Entity
@Getter @Setter
public class Team {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(nullable = false)
    private String name;

}