Spring Boot の JPA で 1対多(OneToMany), 多対1(ManyToOne) の関係のときの簡易メモ
ここでは例として Book(One), Review(Many) で BookRepository のみで登録・更新とかやってみる
-
エンティティ Book (One)
Book.javapackage com.example.demo.entity; import jakarta.persistence.CascadeType; import jakarta.persistence.Column; import jakarta.persistence.Entity; import jakarta.persistence.GeneratedValue; import jakarta.persistence.GenerationType; import jakarta.persistence.Id; import jakarta.persistence.OneToMany; import jakarta.persistence.Table; import lombok.Getter; import lombok.Setter; @Entity @Table(name = "book") @Getter @Setter public class Book { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "id") private Long id; // OneToManyのアノテーションが必要 // mappedBy : Many 側の親を設定するクラス変数名 // cascade : DB操作で Many 側の扱い方、ALL だと全部やる、保存のみなど指定が可能 @OneToMany(mappedBy = "review", cascade = CascadeType.ALL) private List<Review> reviews; } -
エンティティ Review (Many)
Book.javapackage com.example.demo.entity; import jakarta.persistence.Column; import jakarta.persistence.Entity; import jakarta.persistence.GeneratedValue; import jakarta.persistence.GenerationType; import jakarta.persistence.Id; import jakarta.persistence.JoinColumn; import jakarta.persistence.ManyToOne; import jakarta.persistence.Table; import lombok.Getter; import lombok.Setter; @Entity @Table(name = "review") @Getter @Setter public class Review { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "id") private Long id; // ManyToOne, JoinColumnのアノテーションが必要 // JoinColumn の name : テーブルを関連付けるカラム名 @ManyToOne @JoinColumn(name = "book_id") private Book book; } -
リポジトリ BookRepository
これは特に意識しないでOKBookRepositorypackage com.example.demo.repository; import org.springframework.data.jpa.repository.JpaRepository; import com.example.demo.entity.Book; public interface BookRepository extends JpaRepository<Book, Long> { } -
サービス(リポジトリ使うやつ) BookService
BookServicepackage com.example.demo.service; import java.util.ArrayList; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.example.demo.entity.Book; import com.example.demo.entity.Review; import com.example.demo.repository.BookRepository; @Service public class BookService { @Autowired BookRepository bookRepository; public String addBookReview(Book book, Review review) { // review の book に設定が必要 review.setBook(book); // book の reviews に設定が必要 if (book.getReviews() == null) { book.setReviews(new ArrayList<>()); } book.getReviews().add(review); // 設定後に book を save で review も登録される bookRepository.save(book); } public String updateBookReview(Long bookId, Review review) { // bookId で book 取得 Book book = bookRepository.findById(bookId).orElse(null); // review の book に設定が必要 review.setBook(book); // book の reviews に設定が必要 book.getReviews().add(review); // 設定後に book を save で review も登録される bookRepository.save(book); } }
