220715_TIL

백승한·2022년 7월 15일
0
public class Product {

	@ManyToMany
    private List<Folder> folderList;
}

Product 클래스에서 위에 설정으로 인해 folderRepository에서 따로 find해서 가져올 필요없이
자동으로 Product를 find할 때 folderList까지 가져온다.

Folder 클래스에서는 Product와 관련된 멤버변수는 존재하지않지만
둘 사이의 대한 table(PRODUCT_FOLDER_LIST)은 생성된다.

public Product addFolder(Long productId, Long folderId, User user) {
        // 1) 상품을 조회합니다.
        Product product = productRepository.findById(productId)
                .orElseThrow(() -> new NullPointerException("해당 상품 아이디가 존재하지 않습니다."));

        // 2) 관심상품을 조회합니다.
        Folder folder = folderRepository.findById(folderId)
                .orElseThrow(() -> new NullPointerException("해당 폴더 아이디가 존재하지 않습니다."));

        // 3) 조회한 폴더와 관심상품이 모두 로그인한 회원의 소유인지 확인합니다.
        Long loginUserId = user.getId();
        if (!product.getUserId().equals(loginUserId) || !folder.getUser().getId().equals(loginUserId)) {
            throw new IllegalArgumentException("회원님의 관심상품이 아니거나, 회원님의 폴더가 아닙니다~^^");
        }
        /////////////////////////////////////////////////////////////

        // 4) 상품에 폴더를 추가합니다.
        product.addFolder(folder);

        return product;
    }

에러가 발생하지 않는데 DB상에 등록이 안된다..
1차 캐시와 관련된 내용을 기억해보자 !!!
해결 방법은 두가지 이다. 잘 기억해두자

  • productRepository.save(folder)
  • @Transactional (✔)
  • 쿼리 메소드에서 '_' 를 활용하면 객체가 갖고있는 변수들로 찾을수 있다.

앞에는 userId, 뒤에는 변수로 갖고있는 List<Folder> folderList에서 id로 찾아달라~

Page<Product> findAllByUserIdAndFolderList_Id(Long userId, Long folderId, Pageable pageable);
profile
방문해주셔서 감사합니다🙂

0개의 댓글