본문 바로가기
Framework/JPA

[JPA] Referential integrity constraint violation, save the transient instance before flushing

by 댓츠굿 2019. 1. 4.



ㆍReferential integrity constraint violation



오류 :

ERROR : HHH000315: Exception executing batch [org.h2.jdbc.JdbcBatchUpdateException: Referential integrity constraint violation: "FKOU1XVFC0SWVOFR46KFD8KHY1N: PUBLIC.AUTHCOMPOSITE FOREIGN KEY(USER_SEQ) REFERENCES PUBLIC.USER(USER_SEQ) (12)"; SQL statement:


이유 :

두 Entity간에 부모, 자식 관계가 맺어졌지만 각각 클래스의 ID값에 @GeneratedValue를 설정했기 때문에 각각의 시퀀스 값이 들어가게 된다. 여기서 FK제약조건이 걸려 오류가 난 것이다.


해결책 :

두 Entity 중에 FK를 가지는 Entity의 @GeneratedValue를 삭제한다.







save the transient instance before flushing



오류 :

org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: 


이유 :

참조되는 객체가 save() 되지 않아서 발생되었다. 개체가 저장되지 않은 일시적인 인스턴스를 참조하기 때문이다.

@OneToMany 또는 @ManyToOne 을 사용할 때 부모 개체에 추가하는 자식(혹은 참조) 개체가 아직 데이터베이스에 저장되지 않아서 생긴 문제이다.


해결책 :

맵핑 어노테이션에 cascade=CascadeType.ALL 추가. cascade(종속성)를 주어서 부모 개체가 저장될 때 참조 개체들도 저장하게 한다.


@ManyToOne(cascade=CascadeType.ALL) 



참조:

CascadeType의 종류에는 다음과 같은 것들이 있다.


 ㆍCascadeType.PERSIST

엔티티를 영속화 할 때이 필드에 보유 된 엔티티도 유지합니다. EntityManager가 flush 중에 새로운 엔티티를 참조하는 필드를 찾고 이 필드가 CascadeType.PERSIST를 사용하지 않으면 오류이므로이 Cascade 규칙의 자유로운 적용을 제안합니다.


CascadeType.MERGE

엔티티 상태를 병합 할 때, 이 필드에 보유 된 엔티티도 병합하십시오.


CascadeType.REFRESH

엔티티를 새로 고칠 때, 이 필드에 보유 된 엔티티도 새로 고칩니다.


CascadeType.REMOVE

엔티티를 삭제할 때, 이 필드에 보유 된 엔티티도 삭제하십시오.


CascadeType.DETACH

부모 엔티티가 detach()를 수행하게 되면, 연관된 엔티티도 detach() 상태가 되어 변경사항이 반영되지 않는다.


CascadeType.ALL

모든 Cascade 적용





반응형