JVM/JPA

@JoinTable

kyoulho 2023. 6. 19. 13:34

조인 테이블은 주로 다대다 관계를 일대다, 다대일 관계로 풀어내기 위해 사용한다.

그렇지만 일대일, 일대다, 다대일 관계에서도 사용한다.

 

속성 기능
name 연결 테이블의 이름
joinColumns 현재 엔티티를 참조하는 외래키
inverserJoinColumns 반대 방향 엔티티를 참조하는 외래 키

 

일대일 조인 테이블

만일 이런 구조를 고민하고 있다면 Child를 연관관계의 주인으로 만들자.

@Entity
public class Parent {
    @Id
    @GeneratedValue
    @Column(name = "PARENT_ID")
    private Long id;
    private String name;

    @OneToOne
    @JoinTable(name = "PARENT_CHILD",
            joinColumns = @JoinColumn(name = "PARENT_ID"),
            inverseJoinColumns = @JoinColumn(name = "CHILD_ID"))
    private Child child;
}

// 단방향 매핑
@Entity
public class Child {
    @Id
    @GeneratedValue
    @Column(name = "CHILD_ID")
    private Long id;
    
    private String name;
}

// 양방향 매핑
@Entity
public class Child {
    @OneToOne(mappedBy="child")
    private Parent parent;
    
    private String name;
}

 

일대다 조인 테이블

일대다 관계를 만들려면 조인 테이블의 컬럼 중 다(N)의 PK의 유니크 제약조건을 걸어야 한다.

@Entity
public class Parent {
    @Id
    @GeneratedValue
    @Column(name = "PARENT_ID")
    private Long id;
    private String name;

    @OneToOne
    @JoinTable(name = "PARENT_CHILD",
            joinColumns = @JoinColumn(name = "PARENT_ID"),
            inverseJoinColumns = @JoinColumn(name = "CHILD_ID"))
    private List<Child> child = new ArrayList<>();
}


@Entity
public class Child {
    @Id
    @GeneratedValue
    @Column(name = "CHILD_ID")
    private Long id;
    
    private String name;
}

 

다대일 조인 테이블

@Entity
public class Parent {
    @Id
    @GeneratedValue
    @Column(name = "PARENT_ID")
    private Long id;
    private String name;

    @OneToMany(mappedBy = "parent")
    private List<Child> child = new ArrayList<>();
}


@Entity
public class Child {
    @Id
    @GeneratedValue
    @Column(name = "CHILD_ID")
    private Long id;
    
    private String name;
    
    @ManyToOne(optional = false)
    @JoinTable(name = "PARENT_CHILD",
            joinColumns = @JoinColumn(name = "CHILD_ID"),
            inverseJoinColumns = @JoinColumn(name = "PARENT_ID"))
    private Parent parent;
}

 

다대다 조인 테이블

이전에 정리한 글로 대신한다.

728x90

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

즉시 로딩, 지연 로딩, 프록시  (0) 2023.06.23
@SecondaryTable, @SecondaryTables  (1) 2023.06.19
@MapsId  (0) 2023.06.18
@MappedSuperclass  (0) 2023.06.17
상속 관계 매핑 (슈퍼-서브 타입 모델링)  (0) 2023.06.17