본문 바로가기
카테고리 없음

JPA 연관관계 매핑 기능

by 수바니 2024. 8. 22.
더보기

@OneToOne

일대일 관계를 나타내는 매핑정보

1:1 관계를 지정하기에 앞서 이것이 꼭 물리적으로 테이블이 분리되어야 하는지에 대해 생각해보아야 한다.

 

 

더보기

@OneToMany

일대다 관계를 나타내는 매핑정보

속도를 위해 기본적으로 FetchType설정이 LAZY로 설정되어 있습니다.

 

속성

maappedBy 연관관계의 주인 필드를 선택
fetch 글로벌 페치 전략 설정
cascade 영속성 전이 기능을 사용
targetEntity 연관된 엔티티의 타입정보를 설정한다.

 

 

 

// 일대다 단방향 관계
@Entity(name = "parent")
public class Parent {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    
    @OneToMany
		@JoinColumn(name = "parent_id")
    private List<Child> childList;
}

@Entity(name = "child")
public class Child {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(name = "parent_id")
    private Long parentId;
}
// 일대다 양방향 관계는 없음!

// 대신, 다대일 양방향 관계
@Entity(name = "parent")
public class Parent {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    
    @OneToMany(mappedBy="parent")
    private List<Child> childList;
}

@Entity(name = "child")
public class Child {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @ManyToOne
    @JoinColumn(name = "parent_id")
    private Parent parent;
}

 

더보기

@JoinColum

외래 키 매핑 시 사용 (join을 요청하기 위한 매핑정보로 사용)

@ManyToOne 어노테이션과 주로 함께 사용

어노테이션을 생략해도 외래 키가 생성된다.

 

더보기

@ManyToMany

대다 관계를 나타내는 매핑 정보 (N:M)

다대다 설정을 하게되면 중간 매핑테이블(JoinTable)이 자동으로 생성된다.

중간 매핑 테이블은 JPA상에서 숨겨져서(Entity 정의 없이) 관리된다.

매핑 테이블 관리가 불가능 하여서 실무에서는 잘 사용하지 않는 기능이다.

 

@Entity
public class Parent {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    
    @OneToMany(mappedBy = "parent")
    private List<ParentChild> parentChilds;
}

@Entity
public class ParentChild {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    
    @ManyToOne
		@JoinColumn("parent_id")
    private Parent parent;

    @ManyToOne
		@JoinColumn("child_id")
    private Child child;
}

@Entity
public class Child {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    
    @OneToMany(mappedBy = "child")
    private List<ParentChild> parentChilds;
}

 이렇게 관리를 한다.