본문 바로가기
Java/JPA

[JPA] @PrePersist

by HJ0216 2023. 6. 25.

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

 

 

JPA에서 Custom ID를 부여하기 위해서는 테이블 작업 이후, 추가적인 과정이 필요

 

MySQL에서는 Sequence를 제공하지 않으므로 그에 대한 대안으로, sequence 테이블을 만들고 trigger와 연동시키는 과정이 필요

1. Sequence table 생성

1
2
3
4
CREATE TABLE tempSeq (
  sequence_value INT AUTO_INCREMENT PRIMARY KEY
);
 
 
 

 

2. Trigger를 선언하여 seq를 사용하는 테이블과 연결

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 ;
 
 
 

 * CREATE TRIGGER tempSeqTrigger BEFORE INSERT ON tempUser

- tempUser(seq를 사용하고자하는 entity)에 insert하기 전 사용할 trigger 선언

 * DECLARE sequence_value INT

- SEQ 테이블의 seq column값 선언

 * INSERT INTO tempSeq VALUES (NULL)

- SEQ 테이블에 null값 insert

 * SET sequence_value = LAST_INSERT_ID()

- 직전에 삽입된 행의 자동 증가 값(시퀀스 값)을 반환하는 함수

 * SET NEW.id = CONCAT(NEW.type, LPAD(sequence_value, 6, '0'));

- tempUser 테이블의 type과 sequence_value값을 결합

- LPAD: 지정한 길이(6)만큼 값이 부여되지 않을 경우 지정한 값('0')으로 채움

 

3. JPA에서 insert 작업 전 @PrePersist 선언

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

 * @PrePersist

- Entity가 저장되기 전에 자동으로 호출되며, UUID 값을 생성하고 id 필드에 할당

 

⭐ INSERT 발생 시, @PrePersist 실행 후, Trigger 동작으로 custom id 부여

 

 

 

추가 자료

@PrePersist를 선언해야하는 이유

 

[해결 방법] java.sql.SQLIntegrityConstraintViolationException: Column '...' cannot be null

🌿 기본 환경: 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

hj0216.tistory.com