인프런 커뮤니티 질문&답변

hello님의 프로필 이미지
hello

작성한 질문수

자바 ORM 표준 JPA 프로그래밍 - 기본편

영속성 컨텍스트 2

비영속과 준영속 질문 입니다! + persist 질문

작성

·

317

1

1. 안녕하세요 https://www.inflearn.com/questions/31193 의 답변 내용을 참고하여 질문 드립니다.

비영속과 준영속의 차이는 '식별자가 있고 없고' 뿐이다 라고 생각했는데 저기에 답변을 보면 @Id로 선언한 변수가 member.setId() 등을 통해 초기화가 되었다면 식별자가 있는 것이다 라고 이해했습니다. 그럼 비영속 상태이더라도 식별자를 가질 수 있다는 건데 결론적으로 비영속과 준영속의 차이는

비영속 : 한번도 영속상태가 되지 않음.

준영속 : 영속 상태였다가 비영속 상태가 됨

의 느낌으로 이해하는 것이 맞을까요?

2. 

이 코드를 실행했을때 insert와 update 2개 쿼리가 실행됩니다. 그러면 

1. persist 할때 쓰기지연 저장소에 create문과 영속성 컨텍스트 Entity와 스냅샷에 값 추가

2. setName 호출시 Entity 값이 변경됨

3. 트랜젝션이 커밋되어 flush가 일어나면 영속성 컨텍스트에서 더티체킹을 실행. 이때 member의 Entity와 스냅샷의 name 값이 다르니 update 쿼리를 쓰기지연 저장소에 추가

4. create와 update 문 실행

이게 맞을까요?? persist 설명하실때 그림은 스냅샷 컬럼이 없어서 질문드립니다!

답변 1

0

안녕하세요. hello님, 공식 서포터즈 OMG입니다.

비영속과 준영속의 차이는 처음에 말씀하셨던  '식별자가 있고 없고'  뿐이 아니라

영속성 컨텍스트에서 관리 되었던 적이 있냐 없냐 로 구분하시면 됩니다.

-

비영속

아래의 강의자료를 보시면 객체를 생성한 시점을 나타내므로 영속성 컨텍스트에서 관리된 적이 없습니다.

준영속(=detached상태)

비영속 상태의 객체를 persist를 호출함으로써 영속상태(=영속성 컨텍스트에 들어가 있는)로 만들었지만 detach()로 인해 영속성 컨텍스트에서 분리된 상태

모호하게 알고 있었던 점이 해결되셨으면 좋겠네요

감사합니다.

hello님의 프로필 이미지
hello
질문자

답변 감사합니다 1번질문에서 준영속과 비영속의 차이는 이해되었습니다! 그런데 "비영속상태도 식별자를 가질 수 있다!" 라는 것은 맞는건가요?

네 맞습니다.

두 가지만 알고 계시면 됩니다.

1. 기본키는 직접 할당해줄 수있고, 자동생성전략을 사용해서 할당 받을 수 있다.

전자는 @Id만 사용하는 것. 후자는 @Id @GeneretedValue를 사용하는 것입니다.

2. 비영속 객체가 영속 상태가 되려면 식별자를 반드시 갖고 있어야 한다.

직접 할당해주는 방법일 땐 할당이 되어있어야 하고, 자동생성전략을 이용하는 경우 persist() 호출 시점에 값의 할당이 이뤄집니다.(코드 레벨로 찾아가 보려 했는데 정확한 부분은 잘 모르겠습니다.)

그래서 결국 "비영속상태도 식별자를 가질 수 있다!" 의 답변 YES 입니다.

hello님의 프로필 이미지
hello

작성한 질문수

질문하기