web-dev-qa-db-ja.com

IDが自動的に作成されるように、created_at列に作成日時を自動的に生成させるにはどうすればよいですか?

私は現在、次のようなエンティティを持っています:

@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");
}
8
Brett Freeman

[〜#〜] jpa [〜#〜]

タイムスタンプフィールドに直接注釈を付けるほど便利なものはありませんが、@PrePersist@PreUpdate注釈とほとんど労力をかけずに同じ結果が得られます。

Hibernate

Spring Data JPA

7
dimitrisli

BaseEntityを作成できます。各エンティティはBaseEntityを拡張します。 Baseエンティティでは、自動的に時刻が設定されます

@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();
    }
}
3
buddha

@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;
}

getter/setterを生成するためのロンボクからの@ Data@ EqualsAndHashCodeannotation注釈は必要ないかもしれないことに注意してください =

0