You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
프록시객체는 PK를 기반으로 움직이며, PK가 null 인 프록시로 DB와 관련된 일을 수행할 경우 PK를 받아오려 select 를 날린다. (referencedColumn 에서도 목격됨) 하지만 null 인 값이 @mapsid, @GeneratedValue, @manytoone 과 같은 어노테이션으로 매핑되어 있을 경우는 select를 날리지 않고 EntityManager가 자동주입을 해준다.
PK가 null이 아닌 프록시로 DB와 관련된 일을 수행할 경우, 영속성에서 해당 PK를 가진 엔티티를 검색하며, 없을 경우 Select를 날려 영속성에 추가한다.
insert 를 위해 엔티티를 생성하였기 때문에 프록시 객체가 아닌 엔티티 객체이다.
밑의 save() 의 스크린샷에서 확인 할 수 있듯이, isNew로 persist() 냐 merge() 가 분기하는데
엔티티에 pk가 없으면 isNew == true, pk가 있으면 isNew == false 이다.
persist는 sql 저장소에 sql문을 저장하고 영속성에 추가한다.
merge는 영속성컨텍스트에 해당 엔티티가 있나 확인하고 없으면 select로 엔티티를 가져온다.
select 로 반환되는 값이 없다면 해당 객체를 insert 한다.
PK 생성을 DB에 위임하지 않았을 시 목격되는 현상
이러한 현상의 이유는?
나는 ID를 내가 직접 주입해줘야한단 말야.... (복합키, 대리키, 업무키 경우)
테스트 코드
isNew 재정의 부분
수정할사항
프록시가 아니라 객체를 생성한 것이기 때문에 엔티티임원시타입은 null 값이 없으니까, isNew에 항상걸리나? 테스트해볼것save() 호출 시, 원시타입의 PK는 isNew가 True 일까? #7 확인The text was updated successfully, but these errors were encountered: