ㆍ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 적용 |