web-dev-qa-db-fra.com

Comment puis-je utiliser la valeur par défaut côté DB tout en utilisant la sauvegarde Hibernate?

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?

39
BruceCui

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 INSERTs.

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

87
Xavi López

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;
17
rajadilipkolli

Mettez simplement insertable = false dans votre définition @Column

voir ceci lien pour plus d'informations

3
MariemJab

Ou vous pouvez initialiser directement la propriété du POJO, par exemple:

//Java code property declaration

private String surname = "default";
0
Sparticles