-
org.hibernate.exception.ConstraintViolationExceptionjava 2021. 4. 1. 00:01
constraint [pk_sys_code]; nested exception is org.hibernate.exception.ConstraintViolationException: could not execute statement, httpStatus=500}]
위 에러는 디비와 매핑되어있는 Entity 객체의 Key가 중복으로 save 될 때 발생할 수 있는 에러입니다.
하지만 기존에 record가 있음에도 불구하고 saveOrUpdate를 할 때에도 발생할 수 있습니다.
아래의 순서는 한 트랜잭션 내에서 수행하는 과정입니다.
1. 기존 객체를 생성(hibernate - save) ( 실제 데이터 저장은 이루이지지 않았습니다. )
2. 객체를 변경 (pk는 그대로)
3. 객체 저장 (hibernate - saveOrUpdate)
4. 트랜잭션 종료
해결 방안으로는 트랜잭션 종료 직전에 객체를 저장하거나, 한 트랜잭션 내에서 객체를 변경했지만 이후에 또 변경할 여지가 생겼다면 merge를 사용하면 해결이 가능합니다.
[hibernate에서 모든 데이터의 저장은 트랜잭션을 commit 하거나 flush할때 발생합니다.]
Save : Hibernate의 기본 매소드입니다. 기본적으로 Serializable 객체의 영속성을 보존합니다.
Merge : 트랜잭션 중간에 객체의 영속성이 업데이트 될 경우에 새로운 값으로 변경되어 영속성이 유지됩니다.
- 기존 객체의 ID(PK) 로 record를 찾습니다.
- record를 저장한 뒤 변경된 객체를 반환합니다.
SaveOrUpdate : 객체를 다시 연결할때 사용하면서 지속시킬때 사용합니다.
Update : 존재하지 않는 record를 update할 때 exception이 발생합니다.
출처 : www.baeldung.com/hibernate-save-persist-update-merge-saveorupdate)
'java' 카테고리의 다른 글
[FILE] 파일 분할 읽기 (0) 2021.04.21 [Aws SDK] CreateMultipartUploadRequest (0) 2021.04.13 [tibero, oracle] org.hibernate.HibernateException: (0) 2021.04.10 디자인패턴 Delegate pattern 예제 (0) 2021.04.04 org.hibernate.LazyInitializationException (0) 2021.03.28