Everyday Dev System

JPA 복합키 설정하기 - @EmbeddedId 본문

내배캠 주요 학습/JPA 심화

JPA 복합키 설정하기 - @EmbeddedId

chaeyoung- 2023. 7. 31. 12:23

 

 

복합키 위에 @EmbeddedId를 기재하여 사용하는 방법이다.

 

<< 중요한 포인트 >>
1. @Embeddable 과 @EmbeddedId와 매핑

2. @MapsId("user_id") 와  
@Column(name="user_id") 이 매핑이 되므로, 값이 동일

 

 

복합키 UserChannelId 클래스 코드

1. @Embeddable → 클래스 위에 어노테이션 기재

 

2. @Column(name="user_id")  UserChannel 의 @MapsId("user_id") 속성값과 동일해야 한다.

package me.chaeyoung.jpa.userChannel;

import jakarta.persistence.Column;
import jakarta.persistence.Embeddable;
import lombok.AccessLevel;
import lombok.Getter;
import lombok.NoArgsConstructor;

import java.io.Serializable;
import java.util.Objects;

@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Embeddable
public class UserChannelId implements Serializable {
    // Serializable 는 id로 설정하기 위해 반드시 필요함.
    @Column(name="user_id") // UserChannel 의 @MapsId 속성값과 동일해야 함.
    private Long userId;
    @Column(name="channel_id") // UserChannel 의 @MapsId 속성값과 동일해야 함.
    private Long channelId; 

    @Override
    public boolean equals(Object e){
        if (this == e) return true;
        if (e == null || getClass() != e.getClass()) return false;
        UserChannelId userChannelId = (UserChannelId) e;
        return Objects.equals(getUserId(), userChannelId.getUserId()) && Objects.equals(getChannelId()
                , userChannelId.getChannelId());
    }

    @Override
    public int hashCode() {
        return Objects.hash(getUserId(), getChannelId());
    }


}

 

 

 

 

 

UserChannel 엔티티 클래스 코드

 

1. @EmbeddedId → 복합키 클래스 멤버변수 앞에 기재

   

    @EmbeddedId
    private UserChannelId userChannelId;

 

2. @MapsId("user_id")   복합키 클래스 내에 멤버 변수명과 동일하게 명시

 

package me.chaeyoung.jpa.userChannel;


import jakarta.persistence.*;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import me.chaeyoung.jpa.channel.Channel;
import me.chaeyoung.jpa.user.User;

// lombok
@Getter
@NoArgsConstructor

// jpa
@Entity
public class UserChannel {

    @Builder
    public UserChannel(User user, Channel channel){
        this.user = user;
        this.channel = channel;
    }
    
    @EmbeddedId
    private UserChannelId userChannelId;

    @ManyToOne
    @MapsId("user_id")
    private User user;

    @ManyToOne
    @MapsId("channel_id")
    private Channel channel;
}