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");
}
[~ # ~] 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
@CreationTimestamp
- Documentation@UpdateTimestamp
- DocumentationSpring Data JPA
@CreatedDate
- Documentation@LastModifiedDate
- DocumentationVous 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();
}
}
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