티스토리 뷰

현재 게시글 엔티티의 경우 이렇게 되어있다. 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

https://hongchangsub.com/jpa-cascade-2/

반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함