본문 바로가기
Back-End/java

hibernate-envers사용에 Duplicate entry '81981' for key 'PRIMARY' 오류 확인

by 인기쟁이 돌고래 2023. 2. 21.

hibernate-envers사용해서 History남기는 테이블이 있는데 update시에 오류가 난다 @_@? 

insert는 잘했는데... 나한테 왜그래 ㅠ_ㅠ

 

오류내용 일부 

HHH000315: Exception executing batch [java.sql.BatchUpdateException: Duplicate entry '81981' for key 'PRIMARY'], SQL: insert into entity_aud (rev_type, a, b, c, d, e, f, id, rev_id) values (?, ?, ?, ?, ?, ?, ?, ?, ?)

 

Duplicate entry '81981' for key 'PRIMARY'

 

Unable to perform beforeTransactionCompletion callback: org.hibernate.exception.ConstraintViolationException: could not execute batch; nested exception is org.hibernate.HibernateException: Unable to perform beforeTransactionCompletion callback: org.hibernate.exception.ConstraintViolationException: could not execute batch

 

> 오류사유 : 중복값이 저장될려그런다. 

> 오류 원인 : entity_aud테이블 (entity의 history테이블)의 id는 entity의 id와 같다. 따라서 수정/삭제등의 history를 쌓으려면 entity_aud테이블의 primary key는 id값만으로 가져가면 안됨. 근데 우리 entity_aud테이블의 primary key가 그냥 id값만 가지고 있었음.

 

> 문제해결

entity_aud테이블의 primary key를 id -> id+rev 값으로 변경 

 

before
after

 

아니.. 자동으로 생성될때 PK에 id+ rev가 기본인거 같은데 누가 바꿨나... ㅠ_ㅠ 

오늘 삽질 끝.

 

 

참고

envers설정 (application.yml)

https://stackoverflow.com/questions/16701109/do-i-need-a-id-column-in-audit-table

 

Do I need a id column in audit table?

Many table designs I see around has a id column as a primary key. For example log_id in some Logging table, event_id in some event table and so and so. This column would have no dependency on any o...

stackoverflow.com

 

댓글