0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Spring Boot JPA の OneToMany, ManyToOne 簡易メモ

Posted at

Spring Boot の JPA で 1対多(OneToMany), 多対1(ManyToOne) の関係のときの簡易メモ
ここでは例として Book(One), Review(Many) で BookRepository のみで登録・更新とかやってみる

  • Entity関係
    image.png

  • エンティティ Book (One)

    Book.java
    package 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.java
    package 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
    これは特に意識しないでOK

    BookRepository
    package 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

    BookService
    package 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);
    	}
    
    }
    
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?