[Spring Data JPA] Cascade

2019. 10. 5. 15:41SPRING/Spring Data JPA

ManyToOne 또는 OneToMany 옵션으로 설정 가능.

상태변화를 전파하는 옵션이다.

 

 

1. 생성

 

1) cascade 옵션 설정

@Entity
public class School {

    @Id @GeneratedValue
    private Long id;

    private String name;

    @OneToMany(mappedBy = "school", cascade = CascadeType.ALL)
    private Set<Student> students = new HashSet<>();
    
 }

 

2) 실행 테스트

@Component
@Transactional
public class JpaRunner implements ApplicationRunner {

    @PersistenceContext
    EntityManager entityManager;

    @Override
    public void run(ApplicationArguments args) throws Exception {
    
        Session session = entityManager.unwrap(Session.class);

        // school1
        School school1 = new School();
        school1.setName("testSchool");

        Student student1 = new Student();
        student1.setName("stu1");

        school1.addStudent(student1);

        Student student2 = new Student();
        student2.setName("stu2");

        school1.addStudent(student2);

        Student student3 = new Student();
        student3.setName("stu3");

        school1.addStudent(student3);

        session.save(school1);
        
        // school2
        School school2 = new School();
        school2.setName("testSchool2222");

        Student student1 = new Student();
        student1.setName("stu10");

        school2.addStudent(student1);

        Student student2 = new Student();
        student2.setName("stu11");

        school2.addStudent(student2);

        Student student3 = new Student();
        student3.setName("stu12");

        school2.addStudent(student3);

        session.save(school2);
        
 	}
}

 

3) 결과

springdata=# select * from school;
 id |      name      
----+----------------
  1 | testSchool
  5 | testSchool2222
(2 rows)

springdata=# select * from student;
 id | name  | school_id 
----+-------+-----------
  2 | stu1  |         1
  3 | stu3  |         1
  4 | stu2  |         1
  6 | stu11 |         5
  7 | stu12 |         5
  8 | stu10 |         5
(6 rows)

 

 

 

2. 삭제

 

1) 실행 테스트

@Component
@Transactional
public class JpaRunner implements ApplicationRunner {

    @PersistenceContext
    EntityManager entityManager;

    @Override
    public void run(ApplicationArguments args) throws Exception {
    
        Session session = entityManager.unwrap(Session.class);

        School school = session.get(School.class, 1l);
        session.delete(school);      
        
 	}
    
}

 

2) 결과 쿼리

Hibernate: 
    /* delete me.sky.jpa_study.Student */ delete 
        from
            student 
        where
            id=?

 

3) 결과

springdata=# select * from school;
 id |      name      
----+----------------
  5 | testSchool2222
(1 row)

springdata=# select * from student;
 id | name  | school_id 
----+-------+-----------
  6 | stu11 |         5
  7 | stu12 |         5
  8 | stu10 |         5
(3 rows)