개발하는 자몽

[JPA] Entity - 매핑 관계 본문

Java/Spring

[JPA] Entity - 매핑 관계

jaamong 2022. 12. 22. 16:13

예를 들어 질문 게시판을 구현한다고 하자. 그렇다면 질문 엔티티와 답변 엔티티가 필요하다. 이때 고려해야 할 점은 매핑 관계이다. 하나의 질문에는 여러 개의 답변이 달릴 수 있고, 하나의 답변은 여러 개의 질문에 달릴 수 있다.

 

  • 답변 엔티티 입장에서 질문 엔티티와의 매핑 관계 → 1 : N
  • 질문 엔티티 입장에서 답변 엔티티와의 매핑 관계 → N : 1

이를 위한 어노테이션으로 @ManyToOne @OneToMany를 사용할 수 있다. 해당 어노테이션을 사용하면 실제 데이터베이스에서는 ForeignKey(FK) 관계가 생성된다.

(@ManyToOne은 부모 자식 관계를 갖는 구조에서 사용한다. 여기서 부모는 질문, 자식은 답변이라고 할 수 있다.)

 

 

질문 엔티티 - Question.java

@Getter
@Builder
@Entity
public class Question {

    @Id @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(length=200)
    private String subject;

    @Column(columnDefinition = "TEXT")
    private String content;

    private LocalDateTime createAt;

    @OneToMany(mappedBy = "question", cascade = CascadeType.REMOVE) //1:N
    private List<Answer> answers;
}

@OneToMany의 속성인 mappedBy는 참조 엔티티의 속성명을 의미한다. 즉, Answer 엔티티에서 Question 엔티티를 참조한 속성명 question을 mappedBy에 전달해야 한다.

 

답변 엔티티 - Answer.java

@Getter
@Builder
@Entity
public class Answer {

    @Id @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;

    @Column(columnDefinition = "TEXT")
    private String content;

    private LocalDateTime createAt;

    @ManyToOne
    private Question question; //N:1
}

 

CascadeType.REMOVE
질문 하나에는 여러 개의 답변이 작성될 수 있다. 이때 질문을 삭제하면 여기에 달린 답변들도 모두 함께 삭제돼야 한다. 이를 위해 @OneToMany의 속성인 cascade = CascadeType.REMOVE를 사용한다.

참고 : https://www.baeldung.com/jpa-cascade-types

 

 

 

 

 

참고

 

2-04 엔티티

* `[완성 소스]` : [https://github.com/pahkey/sbb3/tree/2-04](https://github.com/pahkey/sbb3/tree/2-04) …

wikidocs.net

'Java > Spring' 카테고리의 다른 글

[Spring Security] BCryptPasswordEncoder  (0) 2023.01.02
[Spring Security] @EnableWebSecurity  (0) 2022.12.30
[JPA] Hibernate의 데이터베이스 초기화 전략  (0) 2022.12.21
[Spring]JdbcTemplate  (0) 2022.09.30
스프링 예외 추상화  (1) 2022.09.29
Comments