작성
·
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()로 인해 영속성 컨텍스트에서 분리된 상태
모호하게 알고 있었던 점이 해결되셨으면 좋겠네요
감사합니다.
네 맞습니다.
두 가지만 알고 계시면 됩니다.
1. 기본키는 직접 할당해줄 수있고, 자동생성전략을 사용해서 할당 받을 수 있다.
전자는 @Id만 사용하는 것. 후자는 @Id @GeneretedValue를 사용하는 것입니다.
2. 비영속 객체가 영속 상태가 되려면 식별자를 반드시 갖고 있어야 한다.
직접 할당해주는 방법일 땐 할당이 되어있어야 하고, 자동생성전략을 이용하는 경우 persist() 호출 시점에 값의 할당이 이뤄집니다.(코드 레벨로 찾아가 보려 했는데 정확한 부분은 잘 모르겠습니다.)
그래서 결국 "비영속상태도 식별자를 가질 수 있다!" 의 답변 YES 입니다.
답변 감사합니다 1번질문에서 준영속과 비영속의 차이는 이해되었습니다! 그런데 "비영속상태도 식별자를 가질 수 있다!" 라는 것은 맞는건가요?