본문 바로가기

짧은 기록

JPA 사용시 주의점 : 양방향 연관관계와 영속화

양방향 연관관계를 가지는 엔티티 객체를 영속화 하면 연관관계가 있는 다른 객체까지 영속화를 시켜주지 않을까 하는 잘못된 생각을 잠깐 했다. 물론 아니었다. 

 

위 코드와 같이 Order 객체와 연관관계를 갖지 않는 다른 엔티티들을 영속화 하지 않고 Order 객체만 persist()를 통해 영속화 시키고 커밋했을 때 아래처럼 바로 에러를 뱉어냈다.

Error during managed flush [org.hibernate.TransientPropertyValueException: object references an unsaved transient instance - save the transient instance before flushing : jpabook.jpashop.domain.Order.member -> jpabook.jpashop.domain.Member]

요약하면 commit()을 통해 flush 될 때 Order 객체가 영속성 컨텍스트에 저장되지 않는 엔티티 객체를 참조하고 있으니이를 컨텍스트에 저장 시켜주라는 뜻이다.

 

결론은 EntityManger는 참조값을 가지고 있다고 이를 영속성 컨텍스트에 직접 추가해주고 디비에 반영해주지 않는다. 엔티티를 디비에 Insert 하고 싶으면 개발자가 따로 각 엔티티 객체들을 아래처럼 영속화 해주어야 한다.

'짧은 기록' 카테고리의 다른 글

Intellij 파일 에디터 기능 안할 때  (0) 2022.04.15