컴퓨터/Spring
[Spring] 트러블 슈팅 - Entity 날짜 자동 세팅(org.springframework.dao.DataIntegrityViolationException: could not execute statement [Column 'created_at' cannot be null] [insert into ...] )
도도새 도
2024. 1. 20. 13:49
문제상황
스프링 부트에서 특정 어노테이션을 달면 해당 Entity가 DB에 저장될 때 자동으로 현재 날짜로 세팅이 된다. 보통 게시글을 언제 썼냐 추적할 때 사용한다.
하지만 아래 에러가 발생하였다.
org.springframework.dao.DataIntegrityViolationException: could not execute statement [Column 'created_at' cannot be null] [insert into ...]
즉 created_at이 null로 세팅되어 에러가 난다는 것이다.
해결
이를 사용하기 위해서는 JAP Auditing 기능을 활성화 해주어야한다. 이는 데이터베이스에서 엔터티 객체의 변경 이력을 추적하는 기능을 제공하는 기술이다.
메인 설정 클래스에 @EnableJpaAuditing를 달아준다. 이로서 auditing을 활성화한다.
@SpringBootApplication(exclude = {SecurityAutoConfiguration.class})
@EnableJpaAuditing
public class MyrecipeApplication {
public static void main(String[] args) {
SpringApplication.run(MyrecipeApplication.class, args);
}
}
추적할 엔터티에 @EntityListeners(AuditingEntityListener.class)를 추가한다. @EntityListeners(AuditingEntityListener.class)는 AuditingEntityListener 클래스를 통해 변경 이력 추적을 활성화하게 된다.
@Entity
@Table(name="recipe")
@ToString
@Getter
@Setter
@Builder
@NoArgsConstructor
@AllArgsConstructor
@EntityListeners(AuditingEntityListener.class)
public class Recipe {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name="recipe_id")
private Long id;
(...)
@CreatedDate
@Column(nullable = false, updatable = false)
private LocalDateTime createdAt;
}
그러면 save등을 사용할 때 자동으로 createdAt이 생성되어 현재 시간으로 저장된다