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);