JPA関連

43888 ワード

対日関係を知る

  • 掲示板と会員がいます.
  • の会員は複数の投稿を書くことができます.
  • 掲示板と会員は多対一の関係です.
  • 投稿を使用すると、投稿を作成した会員情報を問い合わせることができます.
  • Board <----> Member

    プレートシンボル

    package com.example.study.domain;
    
    import lombok.Getter;
    import lombok.Setter;
    
    import javax.persistence.*;
    import java.util.Date;
    
    @Getter
    @Setter
    @Entity
    @Table(name = "study_board")
    public class Board {
       @Id
       @GeneratedValue
       private Long seq;
       private String title;
    //    private String writer;
       private String content;
       @Temporal(value = TemporalType.TIMESTAMP)
       private Date createDate;
       private Long cnt;
    
       @ManyToOne
       @JoinColumn(name = "MEMBER_ID")
       private Member member;
    }
    

    Memeberエンティティ

    package com.example.study.domain;
    
    import lombok.Getter;
    import lombok.Setter;
    import lombok.ToString;
    
    import javax.persistence.Column;
    import javax.persistence.Entity;
    import javax.persistence.Id;
    
    @Getter
    @Setter
    @Entity
    @ToString
    public class Member {
       @Id
       @Column(name="MEMBER_ID")
       private String id;
       private String password;
       private String name;
       private String role;
    }

    BoardRepository

    package com.example.study.persistence;
    
    import com.example.study.domain.Board;
    import org.springframework.data.domain.Page;
    import org.springframework.data.domain.Pageable;
    import org.springframework.data.jpa.repository.Query;
    import org.springframework.data.repository.CrudRepository;
    import org.springframework.data.repository.query.Param;
    
    import java.util.List;
    
    public interface BoardRepository extends CrudRepository<Board, Long> {
    
        List<Board> findByTitle(String keyword);
    
        // like
        List<Board> findByContentContaining(String keyword);
    
        // 여러 조건
        List<Board> findByTitleContainingOrContentContaining(String title, String content);
    
        // 데이터 정렬
        List<Board> findByTitleContainingOrderBySeqDesc(String keyword);
    
        // 페이징 처리
    //    List<Board> findByTitleContaining(String searchkeyword, Pageable paing);
    
        // 페이지 타입 사용하기
        Page<Board> findByTitleContaining(String searchkeyword, Pageable paing);
    }

    MemberRepository

    package com.example.study.persistence;
    
    import org.springframework.data.repository.CrudRepository;
    
    public interface MemberRepository extends CrudRepository {
    }

    マルチペアテストコード

    package com.example.study;
    
    import com.example.study.domain.Board;
    import com.example.study.domain.Member;
    import com.example.study.persistence.BoardRepository;
    import com.example.study.persistence.MemberRepository;
    import org.junit.jupiter.api.Test;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.boot.test.context.SpringBootTest;
    
    import java.util.Date;
    
    @SpringBootTest
    public class RelationMappingTest {
       @Autowired
       private BoardRepository boardRepo;
    
       @Autowired
       private MemberRepository memberRepo;
    
       @Test
       public void testManyToOneInsert() {
           Member member1 = new Member();
           member1.setId("member1");
           member1.setPassword("aaaa");
           member1.setName("둘리");
           member1.setRole("User");
           memberRepo.save(member1);
    
           for (int i = 0; i <= 3; i++) {
               Board board = new Board();
               board.setTitle("title" + i);
               board.setContent("둘리가 작성한 내용 + " + i);
               board.setCreateDate(new Date());
               board.setMember(member1);
               boardRepo.save(board);
           }
       }
    }

    一対一の関係を知る


  • 住所と会員があります.

  • 会員には住所があります.

  • 住所は会員と一対一の関係です.

  • 会員を通じて住所情報を取得することができます.

    Addressエンティティ


  •  package com.example.study.domain;
    
    import lombok.Getter;
    import lombok.Setter;
    
    import javax.persistence.*;
    
    @Getter
    @Setter
    @Entity
    @Table(name = "address")
    public class Address {
        @Id
        @GeneratedValue
        @Column(name = "id")
        private Long id;
    
        @OneToOne(mappedBy = "address")
        private Member member;
    }

    メンバーエンティティ

     package com.example.study.domain;
    
    import lombok.Getter;
    import lombok.Setter;
    import lombok.ToString;
    
    import javax.persistence.*;
    
    @Getter
    @Setter
    @Entity
    @ToString
    public class Member {
        @Id
        @Column(name="MEMBER_ID")
        private String id;
        private String password;
        private String name;
        private String role;
    
        @OneToOne(cascade = CascadeType.ALL)
        @JoinColumn(name = "address_id", referencedColumnName = "id")
        private Address address;
    }

    アドレス帳

    package com.example.study.persistence;
    
    import com.example.study.domain.Address;
    import org.springframework.data.repository.CrudRepository;
    
    public interface AddressRepository extends CrudRepository<Address, Long> {
    }

    一対一テストコード

        @Test
        public void testOneToOneFind() {
            Address ad = new Address();
    
            System.out.println("address id : "+ ad.getId());
            Member member1 = new Member();
            member1.setId("member2");
            member1.setPassword("aaaa");
            member1.setName("둘리22");
            member1.setRole("User");
            member1.setAddress(ad);
            memberRepo.save(member1);
    
            System.out.println(addressRepo.findById(ad.getId()).get().getMember().getName());
        }

    多対多の関係を理解する

  • の学生と科目があります.
  • 学生と科目はいくつもあります.
  • 学生と科目は多対多の関係である.
  • の学生を通じてカリキュラム情報を取得できます.
  • Studioエンティティ

    package com.example.study.domain;
    
    import lombok.Getter;
    import lombok.Setter;
    
    import javax.persistence.*;
    import java.util.ArrayList;
    import java.util.List;
    import java.util.Set;
    
    @Entity
    @Setter
    @Getter
    public class Student {
        @Id
        @GeneratedValue
        Long id;
    
        @ManyToMany
        @JoinTable(
                name = "course_like",
                joinColumns = @JoinColumn(name = "student_id"),
                inverseJoinColumns = @JoinColumn(name = "course_id"))
        List<Course> likedCourses;
    
        public boolean addCourse(Course cs) {
            if (likedCourses == null) {
                likedCourses = new ArrayList<Course>();
            }
            return likedCourses.add(cs);
        }
    }
    

    Courseエンティティ

    package com.example.study.domain;
    
    import javax.persistence.Entity;
    import javax.persistence.GeneratedValue;
    import javax.persistence.Id;
    import javax.persistence.ManyToMany;
    import java.util.List;
    import java.util.Set;
    
    @Entity
    public class Course {
        @Id
        @GeneratedValue
        Long id;
    
        @ManyToMany(mappedBy = "likedCourses")
        List<Student> likes;
    }

    マルチペアマルチテストコード

       @Test
        public void testManyToMany() {
            Student st = new Student();
    
            Course cs1 = new Course();
            Course cs2 = new Course();
    
            st.addCourse(cs1);
            st.addCourse(cs2);
    
            for (Course cs : st.getLikedCourses()) {
                System.out.println(cs.toString());
            }
        }