Java/JPA with Error

[해결 방법] java.sql.SQLIntegrityConstraintViolationException

HJ0216 2023. 6. 25. 09:41

🌿 기본 환경: IDE: STS4, Language: Java

 

 

JPA entity로 생성한 테이블에 trigger를 통해 데이터를 INSERT하고자 할 경우,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
DELIMITER //
 
CREATE TRIGGER tempSeqTrigger BEFORE INSERT ON tempUser
FOR EACH ROW
BEGIN
  DECLARE sequence_value INT;
  
  INSERT INTO tempSeq VALUES (NULL);
  SET sequence_value = LAST_INSERT_ID();
  SET NEW.id = CONCAT(NEW.type, LPAD(sequence_value, 6'0'));
END//
 
DELIMITER ;
 
 
 

🚨 다음과 같은 Error 발생

java.sql.SQLIntegrityConstraintViolationException: Column '...' cannot be null

 

 

발생 원인

INSERT 시, JPA에서 setId를 통해 PK값을 주입 전에 trigger가 실행되어 trigger에서 null exception을 발생시킴

* 실행순서 Trigger → JPA insert
트리거에서 NEW.user_id 값을 설정하려고 하지만, JPA는 이전에 생성된 userEntity 객체를 사용하여 저장을 시도하므로 user_id 컬럼이 null인 상태로 반환됨

 

 

해결 방법

@PrePersist를 사용하여 JPA를 통해 userEntity를 저장하기 전에 해당 컬럼에 값을 할당해야 함

1
2
3
4
5
6
    @PrePersist
    public void prePersist() {
        String uuid = UUID.randomUUID().toString();
        this.id = uuid;
    }