Light Blue Pointer
본문 바로가기
Developing/TIL(Develop)

📖Entity에 복합키로 id구성하는 방법 @IdClass, @EmbeddedId

by Greedy 2024. 3. 15.

📖 How to make Composite Keys in Spring Entity

1. IdClass로 구현하는 방식

사용 방법은 간단하다!

1) Entity에 id를 설정해준다

@IdClass(UserPostId.class)

클래스에 이 어노테이션을 붙여서 id를 지정해주고

@Id

복합키로 사용할 fk Column 두개에 해당 어노테이션을 붙여준다

 

전체 Entity 코드

@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Entity
@Table(name = "tb_user_post")
@IdClass(UserPostId.class)
public class UserPost {

    @Id
    @ManyToOne
    @OnDelete(action = OnDeleteAction.CASCADE)
    @JoinColumn(name = "user_id", nullable = false)
    private User user;

    @Id
    @ManyToOne
    @OnDelete(action = OnDeleteAction.CASCADE)
    @JoinColumn(name = "post_id", nullable = false)
    private Post post;

    @Enumerated(EnumType.STRING)
    private UserPostRole role;

    @Builder
    public UserPost(User user, Post post , UserPostRole role){
        this.user = user;
        this.post = post;
        this.role = role;
    }

}

 

2) 복합키 class를 만들어준다

2-1) Serializable을 implement해서 equals와 hashCode 메서드 구현하기

@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class UserBoardId implements Serializable {

    private Long user;
    private Long board;

    @Override
    public boolean equals(final Object o) {
        if (this == o) {
            return true;
        }
        if (o == null || getClass() != o.getClass()) {
            return false;
        }
        UserBoardId that = (UserBoardId) o;
        return Objects.equals(user, that.user) && Objects.equals(board, that.board);
    }

    @Override
    public int hashCode() {
        return Objects.hash(user, board);
    }
}

 

2-2) Annotaion으로 Override없이 처리하기

@EqualsAndHashCode(onlyExplicitlyIncluded = true)
@NoArgsConstructor
public class UserPostId implements Serializable {

    @EqualsAndHashCode.Include
    private Long user;

    @EqualsAndHashCode.Include
    private Long post;

}

 

3) 복합키를 id로 갖는 Repository를 생성해준다

public interface UserPostRepository extends JpaRepository<UserPost, UserPostId> {

}

 

 

2. EmbeddedId로 구현하는 방식

졸려서 내일 쓰겠음