8
votes

Sur la mise à jour actuelle_timettamp et jpa

J'ai une entité avec des champs xxx pré>

lorsque j'essaie de mettre à jour avec Spring-Data-JPA , j'observe Edit_Count a été incrémenté, mais Edit_TimeStamp reste la même. Si j'invoque manuellement SQL P>

@PreUpdate
protected void onUpdate() {
    editTimestamp = new Date();
}


1 commentaires

Pour descendre, veuillez fournir votre commentaire ...


3 Réponses :


-1
votes

Parce que dans votre ensemble initial d'annotations, tout ce que vous avez dit sur la colonne EDIT_TIMESTAMP est qu'il s'agit d'un horodatage; JPA ne sait pas que cela doit le mettre à jour. Je suppose que lorsque vous exécutez manuellement l'instruction SQL, vous avez une sorte de déclencheur sur la mise à jour qui change ces champs pour vous - mais sont écrasés par les données provenant de l'entité persistée lorsque vous le mettez à jour.
Si vous n'avez pas besoin du comte / horodatage modifié, essayez de les supprimer de l'entité et de voir si cela fonctionne. Sinon, vous avez une solution de travail.


0 commentaires

11
votes

Vous devez modifier l'annotation de la colonne pour inclure Mise à jour = Faux. Cela provoquera que la colonne EDIT_TIMESTAMP n'apparaît pas dans la mise à jour SQL, le fournisseur JPA n'inclut pas la valeur actuelle du champ, ce qui est ce qui la fait remplacer par défaut.

@Temporal(TemporalType.TIMESTAMP)
@Column(name = "edit_timestamp", 
        updatable = false,
        columnDefinition="TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP")
private Date editTimestamp;


3 commentaires

Cela fonctionne en partie. Avec Updatable = FALSE, la colonne EDIT_TIMESTAMP ne figure pas dans la requête de mise à jour. À partir de la base de données, j'ai observé que Edit_TimeStamp a été mis à jour. Toutefois, le getter pour EditMESTAMP n'est pas au courant de la valeur mise à jour, car elle n'est pas déclenchée par @Preupdate, elle renvoie donc toujours l'ancienne valeur.


Bonjour, je voulais savoir si je peux définir l'horodatage actuel sur la création mais sur la mise à jour, je veux qu'il reste la même chose.


@Leechekiam Comment résoudre ce problème, supprimer simplement updatable = false semble ne peut pas fonctionner



0
votes

Vous pouvez marquer les variables comme mise à jour ou création des horodatages dans votre entité. Dans l'exemple suivant, vous pouvez voir comment cela peut être fait très facilement en utilisant des annotations Hibernate: xxx

juste pour la référence et pour vous assurer qu'il n'y a pas de confusion, j'utilise les importations de package suivantes pour Les types de données et annotations respectifs: xxx


0 commentaires