[스프링 JPA] - 복합키 구성

sonnng·2023년 9월 30일
0

Spring

목록 보기
15/41

복합키를 설정하는 2가지 방법

[지켜야 할 사항- 공통]

  • Serializable을 implements

  • equal, hashCode 메서드 구현(lombok 활용 가능)

    :

    @EqualsAndHashCode(onlyExplicitlyIncluded = true) - 클래스에 작성
    @EqualsAndHashCode.Include - 복합키로 사용할 각 필드에 작성

  • public class 이어야 함

  • 기본 생성자 O





1. @Embeddable

[방법]

  • @Embeddable를 클래스에 작성해주어서, 복합키들을 정의
  • @EmbeddedId를 @Embeddable이 작성된 클래스를 사용하는 필드에 작성해주어서, 복합키 클래스를 매핑


[특징]

  • 주의 사항 : 복합키를 정의한 클래스는 직렬화 처리가 되어있어야 함.

  • '객체지향적' : @IdClass 보다 더 객체지향적인 방법이며, @IdClass는 관계형 데이터베이스에 가까운 방법

[지켜야 할 사항]

  • Serializable을 implements

  • equal, hashCode 메서드 구현(lombok 활용 가능)

    :

    @EqualsAndHashCode(onlyExplicitlyIncluded = true) - 클래스에 작성
    @EqualsAndHashCode.Include - 복합키로 사용할 각 필드에 작성

  • public class 이어야 함

  • @EmbeddedId 어노테이션을 붙여주어야 함(복합키 클래스를 사용하고자 하는 필드에서)

  • 기본 생성자 O

[구현]

(1) MemberId 복합키로 구성된 클래스

@Embeddable
public class MemberId implements Serializable{
    private int memberNo;
    private Stirng memberId;
    //두 필드를 묶어 복합키로 설정

    public MemberId(){}
    public MemberId(int memberNo, String memberId){
        super();
        this.memberNo = memberNo;
        this.memberId = memberId;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        MemberId memberId1 = (TaskId) o;
        return memberId == memberId1.memberId && Objects.equals(employeeId, memberId1.memberNo);
    }

    @Override
    public int hashCode() {
        return Objects.hash(memberNo, memberId);
    }


}


(2) Member 엔티티에서 복합키 사용

@Entity
public class Member{
    @EmbeddedId
    private MemberId memberPK;

    private String phone;
    private Stirng address;
    //두 필드를 묶어 복합키로 설정

    public Member(){}
    public MemberId(MemberId memberPK, String phone, String address){
        super();
        this.memberPK = memberPK;
        this.phone = phone;
        this.address = address;
    }


}



[복합키를 조회하고자 할때]

  • member.getMemberPK().getMemberNo()와 같이 사용




2. @IdClass

[방법]

  • 클래스에 복합키들을 정의
  • @Id를 복합키가 작성된 클래스를 사용하는 필드에 작성해주어서, 복합키 클래스를 매핑


[특징]

  • 주의 사항 : 복합키를 정의한 클래스는 직렬화 처리가 되어있어야 함.

  • '관계형 데이터베이스' : @Embeddable 보다 덜 객체지향적인 방법이며, @IdClass는 관계형 데이터베이스에 가까운 방법

[지켜야 할 사항]

  • Serializable을 implements

  • equal, hashCode 메서드 구현(lombok 활용 가능)

    :

    @EqualsAndHashCode(onlyExplicitlyIncluded = true) - 클래스에 작성
    @EqualsAndHashCode.Include - 복합키로 사용할 각 필드에 작성

  • public class 이어야 함

  • Entity class의 필드명과 동일한 필드를 가지고 있어야 함

  • 기본 생성자 O

[구현]

(1) MemberId 복합키로 구성된 클래스

public class MemberId implements Serializable{
    private int memberNo;
    private Stirng memberId;
    //두 필드를 묶어 복합키로 설정

    public MemberId(){}
    public MemberId(int memberNo, String memberId){
        super();
        this.memberNo = memberNo;
        this.memberId = memberId;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        MemberId memberId1 = (TaskId) o;
        return memberId == memberId1.memberId && Objects.equals(employeeId, memberId1.memberNo);
    }

    @Override
    public int hashCode() {
        return Objects.hash(memberNo, memberId);
    }


}


(2) Member 엔티티에서 복합키 사용

@Entity
@IdClass(MemberId.class)
public class Member{
    @Id
    private int memberNo;

    @Id
    private Stirng memberId;

    private String phone;
    private Stirng address;
    //두 필드를 묶어 복합키로 설정

    public Member(){}
    public MemberId(MemberId memberPK, String phone, String address){
        super();
        this.memberPK = memberPK;
        this.phone = phone;
        this.address = address;
    }


}

[복합키를 조회하고자 할때]

  • member.getMemberNo()와 같이 사용

0개의 댓글