자바 jpa (1) 실체 관계 깊이 학습

6005 단어 자바
jpa 는 완전 체 대상 관계 맵 의 인터페이스 규범 입 니 다.
그 중 실체 관 계 는
@OneToOne, @OneToMany, @ManyToOne, @ManyToMany 

아래 의 user 실 체 는 상기 각 주 해 를 사용 하여 각종 관 계 를 유지 하고 실체 대상 을 구축 한 후에 enity manager 를 사용 하여 각종 조작 을 하면 됩 니 다.
@Entity
@Table(name = "user")
@Data
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
    private String name;
    private Integer age;

    // user document       ,  user   , document   
    @OneToOne(cascade = CascadeType.ALL) //     ,  user            document  
    @JoinColumn(name = "user_document_id") //    user       
    private UserDocument userDocument;
    @ManyToMany(cascade = CascadeType.PERSIST)
    @JoinTable(
            name = "r_user_cource",
            joinColumns = @JoinColumn(name = "user_id"),
            inverseJoinColumns = @JoinColumn(name = "course_id")
    )
    private List cource;
    @ManyToOne(cascade = {CascadeType.PERSIST,CascadeType.MERGE,CascadeType.DETACH})
    @JoinColumn(name = "school_id")
    private School school;
    @OneToMany(cascade = CascadeType.ALL)
    @JoinColumn(name = "user_id")
    private List phone;

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", age=" + age +
                ", userDocument=" + userDocument +
//                ", cource=" + cource +
                ", school=" + school +
                ", phone=" + phone +
                '}';
    }
}

여기 서 many tomany 의 테스트 예 를 중점적으로 소개 합 니 다.
user 와 다 중 관 계 를 가 진 것 은 Course 실체 입 니 다.

@Data
@Entity
@Table(name = "course")
public class Cource {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
    //     
    private String name;
    //     
    private Integer num;

    //       
    @ManyToMany(cascade = CascadeType.PERSIST)//     
    @JoinTable(
            name = "r_user_cource", //      
            joinColumns = @JoinColumn(name = "course_id"), //     
            inverseJoinColumns = @JoinColumn(name = "user_id") //     
    )
    private List users;

    @Override
    public String toString() {
        return "Cource{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", num=" + num +
//                ", users=" + users +
                '}';
    }
}

쌍방 이 @ Many ToMany 참조 제약 을 유지 한 것 을 볼 수 있 습 니 다. 이때 양쪽 의 실 체 를 통 해 등급 연결 작업 을 할 수 있 습 니 다.
테스트 클래스
이 테스트 방법 들 은 이 검사 의 인 스 턴 스 작업 을 추가 삭제 하 는 것 을 보 여 주 었 다.
@RunWith(SpringRunner.class)
@SpringBootTest
public class ManyToManyTest {
    @Autowired
    private EntityManager entityManager;

    @Test
    @Transactional
    @Rollback(false)
    public void contextLoads() {
        User user = new User();
        user.setName("  ");
        user.setAge(11);

        User user2 = new User();
        user2.setName("  ");
        user2.setAge(14);

        Cource course = new Cource();
        course.setName("  ");
        course.setNum(64);
        Cource course2 = new Cource();
        course2.setName("  ");
        course2.setNum(64);
        Cource course3 = new Cource();
        course3.setName("  ");
        course3.setNum(64);

        List list1 = new ArrayList<>();
        list1.add(course);
        list1.add(course2);
        list1.add(course3);

        List list2 = new ArrayList<>();
        list2.add(course);
        list2.add(course2);

        user.setCource(list1);
        user2.setCource(list2);

        entityManager.persist(user);
        entityManager.persist(user2);
    }


    @Test
    @Transactional
    @Rollback(false)
    public void save() {
        User user = new User();
        user.setName("  ");
        user.setAge(11);

        User user2 = new User();
        user2.setName("  ");
        user2.setAge(14);

        Cource course = new Cource();
        course.setName("  ");
        course.setNum(64);
        Cource course2 = new Cource();
        course2.setName("  ");
        course2.setNum(64);
        Cource course3 = new Cource();
        course3.setName("  ");
        course3.setNum(64);

        List list1 = new ArrayList<>();
        list1.add(user);
        list1.add(user2);

        List list2 = new ArrayList<>();
        list2.add(user);

        course.setUsers(list1);
        course2.setUsers(list2);
        course3.setUsers(list1);

        entityManager.persist(course);
        entityManager.persist(course2);
        entityManager.persist(course3);
    }


    @Test
    @Transactional
    @Rollback(false)
    public void update(){
        User user = entityManager.find(User.class,9L);
        user.getSchool().setName("haha");
        entityManager.merge(user);

    }

    @Test
    @Transactional
    @Rollback(false)
    public void findcource(){
        Cource cource = entityManager.find(Cource.class, 25L);
        System.out.println(cource);
    }

    @Test
    @Transactional
    @Rollback(false)
    public void delete(){
        User user = entityManager.find(User.class,15L);
        entityManager.remove(user);
    }
}

주의해 야 할 것 은 다 중 관계 에서 캐 스 케 이 드 = 캐 스 케 이 드 타 입. ALL 을 설정 하거나 캐 스 케 이 드 타 입. REMOVE 를 포함 할 경우  등급 연결 삭제 시 중간 표를 삭제 하 는 것 외 에 다 중 관계 에 대응 하 는 다른 측의 실체 표 데 이 터 를 삭제 하 는데 일반적인 상황 에서 이것 은 업무 논리 에 부합 되 지 않 는 다.사실 다 중 관계 에 서 는 직렬 연결 을 설정 하지 않 고 삭제 하면 됩 니 다. 이 는 enity manger 를 통 해 대상 을 삭제 하면 중간 표를 삭제 합 니 다.
 
항목 주소  [email protected]:Christain1993/jpatest.git

좋은 웹페이지 즐겨찾기