본문 바로가기

Spring/jpa

[spring data jpa] Entity 상태 , Cascade

jpa 의 중요한 개념인 entity의 상태와

상태를 전이시키는 cascade 옵션을 봐보자

 

@OneToMany 나 @ManyToOne 을 보면 Cascade 를 쓸 수 있는데

이게 엔티티의 상태 변화를 연관되어있는 Account 에도 상태 변화를 알려주는것

 

Study 의 상태를 A에서 B로 바꿀때 Account 에도 변한 상태를 주고 싶을때 사용

 

Entity 의 상태는 4가지가 있다.

 

 

이렇게 만든 상태가 Transient , jpa 가 전혀 모르는 상태

이렇게 저장을 하면 이제 JPA 가 아는 상태로 바뀐다.

db 에 객체가 바로 들어간건아니다

하이버네이트가 persistent 상태로 관리를 하고 있다가

이쯤되면 데이터베이스에 싱크업을 해야겟따

그 시점에 실제 데이터를 넣는것

바로 insert 쿼리가 발생하는건 아니다.

 

이제 jpa 가 관리하는 객체가 된다.

 

이 상태에선 하이버네이트가 해주는게 여러개 있는데 일단

1차캐시가 있다.

1차 캐시란 이미 세션에 저장이 된 것 @PersisteneceContext에 이 인스턴스가 저장이 된것이다

이제 이 인스턴스는 캐시가 된 상태가 된다.

 

캐시 되어있기 때문에 이 밑에서 load 를 해도 select 를 하지 않고 

데이터를 받을 수 있다.

 

트랜잭션이 끝났을때 인서트가 발생한다.

 

setUserName 을 하고 뒤에 update문이 없는데도

실제 update 가 발생한다.

이게 바로 dirty checking

 

 

트랜잭션이 끝나고 밖에서 이 객체를 사용될때는 Detached 로 변경된다

jpa가 관리 했던 객체

 

Removed 는 실제 커밋이 일어날때 삭제 된다.

 

 

Cascade 는 바로 이런 상태 변화를 전이 시키는 것이다.

 

PERSIST 저장할때 저기에 전파를 하라고 설정을 해두면

해당 mapped 된 곳에 같이 저장 된다

참조하고 있던 객체들도 전부 Persist 상태가 된다.