개인프로젝트에서 그냥 되니까 사용했던 @OneToMany에 대해서 좀더 알아보았다.
프로젝트에서 썼던 코드는 이렇다
@OneToMany(mappedBy = "post", cascade = CascadeType.REMOVE, orphanRemoval = true)
private List<Comment> comments = new ArrayList<>();
이중 mappedBy는 관계의 주체가 되는 쪽이다.
주로 관계가 양방향일때 사용하며, 나는 댓글을 가지고 있는 주체가 게시글이기때문에 post를 주체로 해주었다.
casecade는 영속성 전이, 즉 주체가 되는 Entity의 상태를 하위Entity에게 전달하는 것이다.
Entity의 상태는 Transient, Persistent, Detached, Remove가 있다.
나는 Post가 삭제될때, 연관된 댓글도 삭제해야하기 때문에 Remove를 삭제했다.
이러면 삭제상태를 comment 엔티티에도 전이하기때문에 post가 삭제되면 comment도 같이 삭제된다.
나머지 Transient, Persistent, Detached도 있는데 설명만 보고는 잘 이해가 되지 않아 다음 프로젝트에 적용할수 있으면 적용해 보면서 공부할 생각이다.
JPA 에서 자식엔티티의 수정은 insert update update delete 순으로 이어진다고 한다.
JPA는 변경된 자식을 먼저 insert 하고 기존의 자식을 NULL로 update 한다.
이때 PK값이 NULL로 변한 자식은 고아객체라고 한다.
orphanRemoval을 true로 하면 pk값이 NULL인 이 고아 객체를 삭제해준다.
나는 Comment가 삭제되면 Post의 comment정보가 삭제가 될 수 있도록 orphanRemoval을 true로 해주는 줄 알고 있었는데 애초에 자식객체의 정보는 부모객체에 저장되지 않았었다.
그리고, JPA에서 자식엔티티의 수정이 바로 delete로 넘어가는 것이 아니고, 심지어 정보 수정은 자식객체인 comment에서 해주는 것을 알게 되었다.
어노테이션들을 뜯어보면 뜯어볼수록 JPA에 대한 정보가 부족하다는 생각이 든다.
JPA에 대한 공부를 따로 하던가 계획을 세워보도록 해야 할 것 같다.
'개발일지(일간)' 카테고리의 다른 글
22년 12월 26일 (0) | 2022.12.27 |
---|---|
22년 12월 23일 (0) | 2022.12.23 |
22년 12월 21일 (0) | 2022.12.22 |
22년 12월 20일 스프링 개인 프로젝트 (0) | 2022.12.20 |
22년 12월 19일 스프링 개인프로젝트 (0) | 2022.12.19 |