관리 메뉴

JIE0025

[JPA] object references an unsaved transient instance - save the transient instance before flushing 본문

백엔드/이슈, 트러블슈팅

[JPA] object references an unsaved transient instance - save the transient instance before flushing

Kangjieun11 2022. 12. 30. 18:25
728x90

 

object references an unsaved transient instance - save the transient instance before flushing 

 

연관되어 있는 두엔티티가 존재하는데, save()하는 과정에서 오류가 발생한다. 

 

오류메세지를 해석해보면

'개체가 저장되지 않은 임시 인스턴스를 참조합니다. - 플러시(영속화)하기 전임시 인스턴스를 저장합니다.'

 

즉 어떤 객체가 영속화 될 때, 연관된 객체도 영속화 해주는 코드가 필요하다

 

 

✅ 영속성 전이를 사용한 해결

 

연관관계를 맺어주고, 영속성 전이를 사용해야 

객체에 사용되는 행동이 그 관계를 맺어준 객체한테까지 전파되게 해야한다. 

 

특정 엔티티에 대해 특정한 작업을 수행하면 관련된 엔티티에도 동일한 작업을 수행한다

 

JPA에서는 연관된 엔티티간의 의존성을 설정하기 위해 ENUM 타입의 javax.persistence.CascadeType를 제공하고 있다. 

 

  • CascadeType.ALL:  모든 Cascade를 적용
  • CascadeType.PERSIST: 엔티티를 영속화할 때, 연관된 엔티티도 함께 유지
  • CascadeType.MERGE: 엔티티 상태를 병합(Merge)할 때, 연관된 엔티티도 모두 병합
  • CascadeType.REMOVE: 엔티티를 제거할 때, 연관된 엔티티도 모두 제거
  • CascadeType.DETACH: 부모 엔티티를 detach() 수행하면, 연관 엔티티도 detach()상태가 되어 변경 사항 반영 X
  • CascadeType.REFRESH: 상위 엔티티를 새로고침(Refresh)할 때, 연관된 엔티티도 모두 새로고침

 

지금은 영속화할 때 영속화가 함께 되는 코드가 필요하므로  cascade = CascadeType.PERSIST를 사용하면 된다.

 

(이전)

@OneToOne
@JoinColumn(name = "STAMP_ID")
private Stamp stamp;

 

(이후)

@OneToOne(cascade = CascadeType.PERSIST)
@JoinColumn(name = "STAMP_ID")
private Stamp stamp;