카테고리 없음

🔗 Create Associations Between Table Objects

ddh1713 2024. 10. 1. 09:25

엔티티 간의 관계 ( 일대일 , 일대다 , 다대다 ) 를 정의하고 매핑

 

1. @OneToOne

- 의도적 중복이 아니라면 사용할 일이 없습니다.

// 일대일 단방향
@Entity
public class Memeber {

	@Id
    @GeneratedValue
    @Column(name = "MEMBER_ID")
    private Long id;
    
    private String username;
    
    @OneToOne
    @JoinColumn(name = "LOCKER_ID")
    private Locker locker;
}

@Entity
public class Locker {

	@Id
    @GeneratedValue
    @Column(name = "LOCKER_ID")
    private Long id;
    
    private String name;
}
// 일대일 양방향
@Entity
public class Member {
  @Id @GeneratedValue
  @Column(name = "MEMBER_ID")
  private Long id;

  private String username;

  @OneToOne
  @JoinColumn(name = "LOCKER_ID")
  private Locker locker;
}

@Entity
public class Locker {
  @Id @GeneratedValue
  @Column(name = "LOCKER_ID")
  private Long id;

  private String name;

  @OneToOne(mappedBy = "locker")
  private Member member;

 

 단방향과 양방향의 차이는 연관관계를 맺으려고 하는쪽에 @OneToOne 과 @JoinColumn(name = {"LOCKER_ID"} 을 걸어 주고 ( { } 안은 상대방 컬럼명 ) , 관계가 맺어지는 쪽에 @OneToOne(mappedBy= {"locker"} 이 있으냐 없으냐의 차이입니다.

 

2. @OneToMany

- @OneToMany 가 단방향으로 쓰이면 문제가 발생할 수 있습니다.

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

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

 

3. @ManyToOne

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

속성
optional (default true) : false 로 설정하면 연관된 엔티티가 반드시 있어야 합니다.
fetch : 글로벌 패치 전략 설정 ( 기본이 EAGER 로 설정되어 있으나 실무에서는 기본 LAZY로 설정하는 것을 추천 ! )
cascade : 영속성 전이 기능 사용
targetEntity : 연관된 엔티티의 타입 정보 설정 (targetEntity = Member.class 식으로 사용 )

 

@JoinColumn

- name 속성은 매핑할 외래키의 이름

속성
name : 매핑할 외래 키의 이름
referencedColumnName : 외래 키가 참조하는 대상 테이블의 컬럼명
foreignKey : 외래 키 제약 조건 지정 ( 테이블 생성 시에만 적용됨 )
unique / nullable / insertable / updateable / columnDefinition / table
( @Column 의 속성과 같음 )

 

4. @ManyToMany

- N : M

- 중간 매핑 테이블 ( JoinTable ) 이 자동으로 생성됩니다.

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

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

- 실무에서는 매핑 테이블을 아래와 같은 형태로 직접 정의합니다.

- TableA(@OneToMany) > MappingTable ( @ManyToOne , @ManyToOne ) > TableB ( @OneToMany )