[TIL] 08 @ManyToOne, @OneToMany..
N:1(다대일관계) 일때 사용해야하는 어노테이션이 있다.
바로 ManyToOne과 OneToMany이다.
예를 들어 회원과 게시글 / 게시글과 댓글의 관계를 생각해보면 아래와 같이 생각할 수 있다.
- 회원과 게시글
한 명의 회원은 여러 게시글을 작성할 수 있다.
- 게시글과 댓글
하나의 게시글에는 여러개의 댓글이 달릴 수 있다.
위 명제에서는 회원: 게시글 = 1:N으로 볼 수 있는데,
이때 회원 입장에서는 @OneToMany, 게시글 입장에서는 @ManyToOne이다.
또 게시글: 댓글= 1:N으로 볼 수 있는데,
이때 게시글 입장에서는 @OneToMany, 댓글 입장에서는 @ManyToOne이다.
내가 작성한 db구조를 보면 아래와 같다.(하이디sql에서는 다이얼그램을 제공안한다...)
member
board
reply
이름에서도 보이듯이
1. board 테이블은 member 테이블의 PK(email)를 FK(writer_email)로 가진다.
2. reply테이블은 board테이블의 PK(bno)를 FK(board_bno)로 가진다.
를 알 수 있다.
작성한 코드는 아래와 같다.
Board.java
@ManyToOne(cascade = {CascadeType.ALL})
private Member writer;
@ManyToOne은 Board가 Member에 대해 다(多) 관계를 가짐을 뜻한다.
ManyToOne은 아래와 같은 속성을 가진다.
- targetEntity() : 연결 대상인 엔터티 클래스로, 연결을 저장하는 필드 또는 속성의 유형이 기본값이다.
- cascade() : 영속성 전이에 관련한 내용이다.
- fetch() : JPA에서 연관관계의 데이터를 어떻게 가져올것인지 정한다. Eager(즉시)과 Lazy(느린)가 있는데,
- 즉시로딩은 불필요한 조인까지 처리해야하는 경우가 많기 때문에 보통 Lazy로 사용하는것 같다.
- optional() : 연결이 선택 사항인지 여부이다. false로 설정하면 null이 아닌 관계가 항상 존재해야 하며, 기본값은 true다.
영속성 : 영원히 계속되는,유지된다는 뜻이다.
영속성 전이라는건 어떤 엔티티에 영속성을 부여할때, 그 엔티티와 관련된 다른 엔티티에게도 영속성을 부여함을 뜻한다.
영속성 전이 설정에 대해서는 위에서 설명한것같이 cascade를 통해 변경 가능하다.
cascade타입에 대해 아래 블로그 글에서 아주 잘 설명되어있다.
CascadeType.ALL : 모든 cascade를 적용한다.
CascadeType.RESIST – 엔티티를 생성하고, 연관 엔티티를 추가하였을 때 persist() 를 수행하면 연관 엔티티도 함께 persist()가 수행된다.
CascadeType.DETACH – 부모 엔티티가 detach()를 수행하게 되면, 연관된 엔티티도 detach() 상태가 되어 변경사항이 반영되지 않는다. (detach : 분리)
CascadeType.MERGE – 트랜잭션이 종료되고 detach 상태에서 연관 엔티티를 추가하거나 변경된 이후에 부모 엔티티가 merge()를 수행하게 되면 변경사항이 적용된다.(연관 엔티티의 추가 및 수정 모두 반영됨)
CascadeType.REMOVE – 삭제 시 연관된 엔티티도 같이 삭제됨
출처 : http://chomman.github.io/blog/java/jpa/programming/jpa-cascadetype-%EC%A2%85%EB%A5%98/
JPA CascadeType 종류
개발도중 PersistentObjectException: detached entity passed to persist 라는 에러메세지를 만나게 되었다.
chomman.github.io