[Spring] 양방향 Entity 저장 시 save 한번만 하도록 수정
2023. 2. 4. 05:44ㆍ프로그래밍/Java
현재 게시글 엔티티의 경우 이렇게 되어있다. Post 객체에서 해시태그를 가지고 있는 셈이다.
public class Post extends BaseTimeEntity {
@Id
@GeneratedValue
@Column(name="POST_ID")
private Long postId;
...
private String title;
@Column(name="CONTENT")
@Lob
private String content;
@Fetch(FetchMode.SUBSELECT)
@OneToMany(mappedBy = "post",
cascade = CascadeType.ALL)
private List<Hashtag> hashtags = new ArrayList<Hashtag>();
@Fetch(FetchMode.SUBSELECT)
@OneToMany(mappedBy = "post",
cascade = CascadeType.ALL)
...
원래는 게시글 엔티티를 생성해 해당 데이터를 저장하고 사용자가 따로 해시태그를 달았다면 해시태그 엔티티를 생성해주고 두번에 걸쳐 일일히 저장해주는 로직이었다.
@Transactional
public void registerPost(PostRequest postRequest) {
try{
Post registerNewPost = Post.builder()
.user(userRepository.findById(SecurityUtil.getCurrentUserId())
.orElseThrow(() -> new UnderlineException(ErrorCode.CANNOT_FOUND_USER)))
.title(postRequest.getTitle())
.content(postRequest.getContent())
.categoryCode(postRequest.getCategoryCode())
.build();
postRepository.save(registerNewPost);
if(postRequest.getHashtag().size() > 0){
List<Hashtag> hashtags = new ArrayList<Hashtag>();
for(String eachHashtag : postRequest.getHashtag()){
hashtags.add(new Hashtag(registerNewPost,eachHashtag));
}
hashtagRepository.saveAll(hashtags);
}
그러나 영속성 전이라고해서 특정 엔티티를 저장할때 연관된 테이블들의 데이터도 할당되어있으면 이들도 같이 저장된다고한다.
OneToMany의 필드에 cascade = persist/all로 적용하면 같이 저장할 수 있다. (원래 설정되어 있었는데 몰라서 안쓴거라.. 서비스단 로직만 변경)
Post registerNewPost = Post.builder()
.user(userRepository.findById(SecurityUtil.getCurrentUserId())
.orElseThrow(() -> new UnderlineException(ErrorCode.CANNOT_FOUND_USER)))
.title(postRequest.getTitle())
.content(postRequest.getContent())
.build();
registerNewPost = setHashtagsAndCategory(registerNewPost,postRequest);
postRepository.save(registerNewPost);
해시태그와 카테고리의 경우 list로 주어지는 값들이기에 따로 Post 엔티티에 세팅해주는 메소드를 생성했다(중복제거).
private Post setHashtagsAndCategory(Post registerPost, PostRequest postRequest){
List<Hashtag> hashtags = new ArrayList<Hashtag>();
List<PostCategoryRelation> postCategoryRelations = new ArrayList<PostCategoryRelation>();
if(postRequest.getHashtag().size() > 0){
for(String eachHashtag : postRequest.getHashtag()){
hashtags.add(new Hashtag(registerPost,eachHashtag));
}
}
if(postRequest.getCategory().size() > 0){
for(String eachCategory : postRequest.getCategory()){
postCategoryRelations.add(new PostCategoryRelation(registerPost,eachCategory));
}
}
registerPost.setHashtagsAndCategory(hashtags,postCategoryRelations);
return registerPost;
}
참조한 글
https://data-make.tistory.com/730
[JPA] 양방향 관계 Entity 저장하기
JPA 양방향 관계 Entity 저장하기 인간은 습관의 동물이다. 습관에는 대부분 좋은 습관이 많지만 그중에 나쁜 습관도 있다. 그것은 바로.. 원리를 모르고 개발하는 습관이다. 😯 . '요로케할 때 이
data-make.tistory.com