J'ai une colonne dans DB avec une valeur par défaut comme sysdate
. Je cherche un moyen d'obtenir cette valeur par défaut insérée alors que je ne donne rien à la propriété correspondante du côté de l'application. Soit dit en passant, j'utilise une configuration basée sur des annotations.
Aucun conseil?
La raison pour laquelle la colonne de date obtient une valeur null
lors de l'insertion, même si elle est définie comme default SYSDATE
côté dbms, c'est que la valeur default
pour une colonne n'est utilisée que si la colonne ne reçoit pas de valeur dans la requête. Cela signifie qu'il ne doit pas apparaître dans le INSERT INTO
phrase, même si elle a été donnée null
.
Si vous souhaitez utiliser le default SYSDATE
du côté du SGBD, vous devez configurer le @Column
avec insertable=false
pour extraire la colonne de votre SQL INSERT
s.
@Temporal(TemporalType.TIMESTAMP)
@Column(name = "myDate", insertable=false)
private Date myDate;
Tenez compte du fait que cette approche ignorera toujours la valeur que vous fournissez à la propriété dans votre application lors de la création de l'entité. Si vous voulez vraiment pouvoir fournir la date parfois, vous devriez peut-être envisager d'utiliser un déclencheur DB pour définir la valeur au lieu d'une valeur par défaut.
Il existe une alternative à l'utilisation de default SYSDATE
définition du SGBD. Vous pouvez utiliser le @PrePersist
et @PreUpdate
annotations pour affecter la date actuelle à la propriété, avant l'enregistrement/la mise à jour, si et seulement si elle n'a pas encore été affectée:
@PrePersist
protected void onCreate() {
if (myDate == null) { myDate = new Date(); }
}
Cette question étroitement liée propose différentes approches: Horodatage de création et horodatage de la dernière mise à jour avec Hibernate et MySQL .
Si vous utilisez Hibernate, vous pouvez simplement utiliser @CreationTimestamp
pour insérer la date par défaut.
@CreationTimestamp
@Temporal(TemporalType.TIMESTAMP)
@Column(name = "create_date")
private Date createDate;
et @UpdateTimestamp
pour mettre à jour la valeur si nécessaire
@UpdateTimestamp
@Temporal(TemporalType.TIMESTAMP)
@Column(name = "modify_date")
private Date modifyDate;
Mettez simplement insertable = false dans votre définition @Column
voir ceci lien pour plus d'informations
Ou vous pouvez initialiser directement la propriété du POJO, par exemple:
//Java code property declaration
private String surname = "default";