연관관계를 매핑할 떄 고려해야하는 3가지 사항

  1. 다중성
  2. 단방향, 양방향
  3. 연관관계의 주인

 

다중성의 종류

  1. 다대일: @ManyToOne
  2. 일대다: @OneToMany
  3. 일대일: @OneToOne
  4. 다대다: @ManyToMany

 

 

@OneToMany

 

 

외래키를 매핑하는 방법

@JoinColumn 

속성 기능 기본 값
name 매핑할 외래 키 이름 "필드명" + "_"  을 참조하는 테이블의 기본 키 컬럼 명
referencedColumnName 외래키가 참조하는 대상 테이블의 컬럼명 참조하는 테이블의 기본 키 컬럼 명
foreignKey(DDL) 외래 키 제약조건을 직접 지정
테이블을 생성할 때만 사용
 
unique @Column의 속성과 같음  
nullable @Column의 속성과 같음  
insertable @Column의 속성과 같음  
updateable @Column의 속성과 같음  
columnDefinition @Column의 속성과 같음  
table @Column의 속성과 같음

 

 

@OneToMany 단방향

 

@ManyToOne과 비슷한 구조이다.

    class Member{
        //연관관계 주인 클래스, One

        @Id
        @Column(name = "MEMBER_ID")
        private Long id;

        private String username;

        @OneToMany
        @JoinColumn(name="TEAM_ID")
        private Team team; //Team 객체와 연관관계를 맺음
    }
    class Team{
        //Many

        @Id
        @Column(name = "TEAM_ID")
        private Long id;

        private String name;

    }

 

 

 

@OneToMany 양방향

 

이런 매핑은 공식적으로 존재 하지 않는다!

@JoinColumn(name = "team_id", insertable = false, updatable = false) 

코드를 사용한다.

@ManyToOne과 @JoinColumn을 사용해서 연관관계를 매핑하면, 다대일 단반향 매칭이 되어버리는데

반대쪽 Team에서 이미 일대다 단방향 매핑이 설정되어 있어 두 테이블 모두 FK를 관리하게 된다.

 

그걸 방지하기 위해 insertable과 updateable을 false로 설정해준다.

그외에도 읽기 전용으로 사용이 가능하다 

하지만 다대일 양방향을 사용하는 편이 낫다!

 

+ Recent posts