on
[Spring Boot] JPA 복합키 조인 및 식별자 클래스 - @ManyToOne, @IdClass
[Spring Boot] JPA 복합키 조인 및 식별자 클래스 - @ManyToOne, @IdClass
반응형
문제점 : 게시판 프로젝트를 진행 중에 로그인과 게시판 기능을 일부 완성하고 연결하려하니 JPA 관련 오류가 발생했다.
이유는 Entity객체에 JPA 사용을 위한 복합키 처리와 조인 처리를 안했던 것이었다.
해결 : 데이터베이스 설계를 다음 링크와 같이 바꾸었다. https://black-mint.tistory.com/21
그 후 기존 Entity클래스(Member, Board)에 @IdClass 어노테이션을 적용하기 위해 [Member, MemberID, Board] 3개의 클래스로 만들었다.
@Data @Entity @DynamicUpdate @DynamicInsert @Table(name = "tb_userinfo") @IdClass(MemberID.class) public class Member { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private long id; @Id @NotNull(message = "username을 입력하세요.") @Size(min = 1, max = 20, message = "username은 1자 이상 20자 이하입니다.") private String username; @NotNull(message = "암호를 입력하세요.") @Size(min = 6, max = 100, message = "암호는 6자 이상 100자 이하 입니다.") private String password; @NotNull @Size(min = 6, max = 45, message = "이메일은 6자 이상 45자 이하 입니다.") @Email private String email; @Column private String role; }
@Data : lombok을 설치해야 사용 가능. Getter/Setter 등 자동 생성
@IdClass(식별자 클래스) : 식별자 클래스 지정 (복합키를 넣을 클래스)
@Data @AllArgsConstructor @NoArgsConstructor public class MemberID implements Serializable { @Column(name = "id") private long id; @Column(name = "username") private String username; }
식별자 클래스는 public 이어야 하며, Serializable 인터페이스를 구현해야 한다. 또한, 기본 생성자 필수!
Entity객체와 필드명 같게 작성
@Data : 식별자 클래스는 equals(), hashCode()를 필수적으로 작성해줘야 한다. 이를 자동 생성
@AllArgsConstructor : 모든 필드 값을 파라미터로 받는 생성자를 생성
@NoArgsConstructor : 파라미터가 없는 생성자 생성
@Entity @Data @Table(name = "tb_board") public class Board { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @NotNull @Size(min = 2, max = 30, message = "제목은 2자 이상 30자 이하입니다.") private String title; @NotNull @Size(min = 1, message = "내용을 입력하세요.") private String content; @ManyToOne(targetEntity = Member.class, fetch = FetchType.LAZY) @JoinColumns({ @JoinColumn(name = "writer", referencedColumnName = "username"), @JoinColumn(name = "writer_id", referencedColumnName = "id") }) private Member member; private String image; }
게시판 - 사람 이기때문에 ManyToOne으로 구현. (여러 관계가 있으나, 주인 쪽이 FK를 관리하도록 설계하는 것이 좋다고 한다.)
@ManyToOne : 게시판 - 사람 관계이므로 @ManyToOne을 사용
@JoinColumns : 복합키 일 때 사용
@JoinColumn : 그림과 같이 참조하는 필드명과 참조받는 필드명을 작성
from http://black-mint.tistory.com/22 by ccl(A) rewrite - 2021-12-19 00:01:50