web-dev-qa-db-fra.com

Comment pouvez-vous faire qu'une colonne created_at génère automatiquement la date-heure de création comme un ID est automatiquement créé?

J'ai actuellement une entité comme ci-dessous:

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

Lors de la création de cet objet, la valeur de createdAt et updatedAt affiche null dans la base de données et se demandait comment je pouvais implémenter du code pour que createdAt et updateAt soient automatiquement insérés?

Ma méthode de publication est la suivante:

@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 [~ # ~]

Il n'y a rien de plus pratique que d'annoter directement le champ Horodatage, mais vous pouvez utiliser le @PrePersist, @PreUpdate annotations et avec peu d'effort, on obtient les mêmes résultats.

Mise en veille prolongée

Spring Data JPA

7
dimitrisli

Vous pouvez créer une BaseEntity. Chaque entité étend la BaseEntity. Dans l'entité de base, il définira l'heure automatiquement

@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

Avec le mélange des réponses @dimitrisli et @buddha, quelque chose d'assez propre est

@Data
@MappedSuperclass
public abstract class BaseEntity {

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

Et maintenant, vous tous votre entité pouvez étendre cette classe comme ça

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

Notez que vous pourriez ne pas avoir besoin @ Data & @ EqualsAndHashCodeannotation annotations de lombok lors de la génération de getter/setter

0
Francis Robitaille