ABOUT ME

쉬운것만골라서

Today
Yesterday
Total
  • org.hibernate.exception.ConstraintViolationException
    java 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)

     

     

     

     

    댓글

Designed by Tistory.