개발/이슈, 트러블슈팅
[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;