cascade
→ 부모 엔터티의 변경이 자식 엔터티에게 영향을 준다.
ex) team, member 시 team 을 생성하거나 team 을 삭제할 때 member 도 같이 생성되고 삭제된다.
orphan removal
→ 부모 객체의 자식 변수에서 자식 객체가 삭제 되었을 때 자식 엔터티를 삭제하는 것
ex) team, member 시 team 의 members 에서 member 원소 하나가 삭제되었을 때 해당 엔터티가 연관에서 삭제된다.
주의점: hibernate5.6 기준 orphan removal 은 cascade 의 속성에 영향을 받는다. cascade 가 persist 이거나 all 일때만 유효하다.
예시
환경
•
Team, Member 는 OneToMany 단방향
cascade 가 remove 일 때
entityManager.getTransaction().begin();
Team morak = entityManager.find(Team.class, 1);
entityManager.remove(morak);
entityManager.getTransaction().commit();
Java
복사
→ team 을 삭제하면 member 도 삭제된다. 물론 제약조건에 의해 member가 먼저 삭제된다.
cascade 가 persist 이고 orphan removal 일 때
entityManager.getTransaction().begin();
entityManager.persist(morak);
morak.removeMember(0);
entityManager.getTransaction().commit();
Java
복사
결과
Hibernate: insert into team (id, name) values (default, ?)
Hibernate: insert into member (id, name, team_id) values (default, ?, ?)
Hibernate: delete from member where id=?
Java
복사
orphan removal 이 잘 동작한다.
결론
•
cascade remove 는 team 이 삭제될 때의 상황
•
orphan removal 은 team 의 members 에서 member 가 삭제될 때의 상황
번외
cascade 가 persist 이고 orphan removal=false(default) 일 때 부모 엔터티를 삭제하면
JdbcSQLIntegrityConstraintViolationException → 제약조건 에러
cascade 가 persist 이고 orphan removal=true 일 때 부모 엔터티를 삭제하면
entityManager.getTransaction().begin();
entityManager.persist(morak);
entityManager.remove(morak);
entityManager.getTransaction().commit();
Java
복사
Hibernate: insert into team (id, name) values (default, ?)
Hibernate: insert into member (id, name, team_id) values (default, ?, ?)
Hibernate: delete from member where id=?
Hibernate: delete from team where id=?
Java
복사
orphan removal 옵션에 의해 cascade remove 처럼 동작