영속성 전이

Hyuk·2023년 5월 24일
0

특정 엔티티를 영속 상태를 만들 때 연관된 엔티티도 함께 영속 상태로 만들려면 영속성 전이 기능을 사용하면 된다.

Public class Parent{
	
	@OneToMany
	private List<Child> children = new ArrayList<Child>();

}
Public class Child{
	
	@ManyToOne
	private Parent parent;

}

부모 1명에게 자식 2명을 저장한다고 하자.

Parent parent = new Parent();
em.perstst(parent);

Child child1 = new Child();
child1.setParent(parent);
parent.getChildren().add(child1);
em.persist(child1);

Child child2 = new Child();
child2.setParent(parent);
parent.getChildren().add(child2);
em.persist(child2);

부모 엔티티를 영속 상태로 만들고, 자식 엔티티도 영속 상태로 만든다.

영속성 전이를 사용하면 부모만 영속 상태로 만들면 된다.

영속성 전이 -저장

Public class Parent{
	
	@OneToMany(cascade = CascadeType.PERSIST)
	private List<Child> children = new ArrayList<Child>();

}

위와 같이 설정을 해주면


Child child1 = new Child();
Child child2 = new Child();

Parent parent = new Parent();
child1.setParent(parent);
child2.setParent(parent);
parent.getChildren().add(child1);
parent.getChildren().add(child2);

em.persist(parent);

부모만 영속화하면 자식 엔티티까지 함께 영속화해서 저장한다.

영속성 전이 -삭제

CascadeType.REMOVE로 설정하고 부모 엔티티만 삭제하면 연관된 자식 엔티티도 삭제된다.

만약 설정하지 않고 부모엔티티만 삭제하면 부모 엔티티만 삭제되지만, 삭제되는 순간 자식 테이블에서 외래키 무결성 예외가 발생한다.

고아 객체

JPA는 부모 엔티티와 연관관계가 끊어진 자식 엔티티를 자동으로 삭제하는 기능을 제공한다.

Public class Parent{
	
	@OneToMany(orphanRemoval= true)
	private List<Child> children = new ArrayList<Child>();

}

위와 같이 설정 하고

parent1.getChildren().remove(0);

이렇게 컬렉션에서 엔티티를 제거하면 데이터베이스의 데이터도 삭제된다. 고아 객체 제거 기능은 영속성 컨텍스트를 플러시할 때 적용되므로 플러시 시점에 쿼리가 실행된다.

이 기능은 참조하는 곳이 하나일 때만 사용해야 한다. 만약 삭제한 엔티티가 다른 곳에서도 참조한다면 문제가 발생한다. 따라서 @OneToOne, @OneToMany에만 사용 가능하다. 또한 부모를 제거하면 자식은 고아가 되므로 부모를 제거하면 자식도 제거되고 이것은 CascadeType.REMOVE 를 설정한 것과 같다.

profile
🙂 🙃 🙂 🙃

0개의 댓글