TIL(Develop)/Spring
📖Entity에 복합키로 id구성하는 방법 @IdClass, @EmbeddedId
개발바닥곰발바닥!!!
2024. 3. 15. 00:29
📖 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로 구현하는 방식
졸려서 내일 쓰겠음