programing

created_at 컬럼에 ID가 자동으로 생성되는 것처럼 생성 날짜/시간을 자동으로 생성하도록 하려면 어떻게 해야 합니까?

newstyles 2023. 2. 28. 23:21

created_at 컬럼에 ID가 자동으로 생성되는 것처럼 생성 날짜/시간을 자동으로 생성하도록 하려면 어떻게 해야 합니까?

현재 아래와 같은 엔티티가 있습니다.

@Entity
public class Product {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long productId;
    private String productImage;
    private String productTitle;
    private String productDescription;
    private Integer productPrice;
    private Date createdAt;
    private Date updatedAt;

이 개체를 만들 때 createdAt 및 updatedAt 값이 데이터베이스에 null로 표시되며 createdAt 및 updateAt가 자동으로 삽입되도록 코드를 구현하는 방법을 알고 싶습니다.

제 투고 방법은 다음과 같습니다.

@PostMapping("/products")
public ProductResponse createProduct(@Validated @RequestBody ProductForm productForm) {
    Product product = productForm.asProduct();
    Product createdProduct = productRepository.save(product);
    return new ProductResponse(createdProduct, "Product created");
}

JPA

타임스탬프 필드에 직접 주석을 다는 것만큼 편리한 방법은 없지만@PrePersist,@PreUpdate주석과 약간의 노력으로 동일한 결과를 얻을 수 있습니다.

휴지 상태

스프링 데이터 JPA

엔티티에서 다음 추상 클래스를 확장합니다.

@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
public abstract class DateAudit implements Serializable {
    @CreatedDate
    @Column(name = "created_at", nullable = false, updatable = false)
    private Date createdAt;

    @LastModifiedDate
    @Column(name = "updated_at")
    private LocalDateTime updatedAt;
}

JPA 감사 기능을 유효하게 하는 것을 잊지 말아 주세요.@EnableJpaAuditing

자세한 내용은 https://docs.spring.io/spring-data/jpa/docs/1.7.0.DATAJPA-580-SNAPSHOT/reference/html/auditing.html를 참조해 주세요.

@dimitrisli와 @buddha의 답변이 뒤섞여 있어 꽤 깨끗한 것은

@Data
@MappedSuperclass
public abstract class BaseEntity {

    @Column(updatable = false)
    @CreationTimestamp
    private LocalDateTime createdAt;
    @UpdateTimestamp
    private LocalDateTime updatedAt;
}

그리고 이제 너희 모두 그렇게 수업을 확장할 수 있어

@Data
@Entity
@EqualsAndHashCode(callSuper = true)
public class User extends BaseEntity {

    @Id
    @GeneratedValue
    public UUID id;
    public String userName;
    public String email;
    public String firstName;
    public String lastName;
}

lombok에서 getter/setter를 생성하기 때문에 @Data & @EqualsAndHashCodeannotation 주석이 필요하지 않을 수 있습니다.

BaseEntity를 작성할 수 있습니다.각 엔티티는 BaseEntity를 확장합니다.기본 엔티티에서는 시간을 자동으로 설정합니다.

@Data
@MappedSuperclass
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public abstract class BaseEntity implements Serializable {

    @Id
    @Column(name = "Id")
    private String id;

    @Column(name = "deleted", columnDefinition = "Bit(1) default false")
    private boolean deleted = false;

    @Column(name = "DataChange_CreatedBy", nullable = false)
    private String dataChangeCreatedBy;

    @Column(name = "DataChange_CreatedTime", nullable = false)
    private Date dataChangeCreatedTime;

    @Column(name = "DataChange_LastModifiedBy")
    private String dataChangeLastModifiedBy;

    @Column(name = "DataChange_LastTime")
    private Date dataChangeLastModifiedTime;

    @PrePersist
    protected void prePersist() {
        if (this.dataChangeCreatedTime == null) dataChangeCreatedTime = new Date();
        if (this.dataChangeLastModifiedTime == null) dataChangeLastModifiedTime = new Date();
    }

    @PreUpdate
    protected void preUpdate() {
        this.dataChangeLastModifiedTime = new Date();
    }

    @PreRemove
    protected void preRemove() {
        this.dataChangeLastModifiedTime = new Date();
    }
}

언급URL : https://stackoverflow.com/questions/49954812/how-can-you-make-a-created-at-column-generate-the-creation-date-time-automatical