web-dev-qa-db-fra.com

Utilisation de @Version dans le projet Spring-Data

J'ai travaillé sur un webservice RESTful avec Spring-Data. Il y a quelques jours, un jpa spécial de données de printemps REST a été publié .

Maintenant, j'ai remarqué la possibilité d'utiliser @Version avec ce framework. Cette version est-elle générée par elle-même ou devez-vous la faire manuellement?

Et est-il possible d'utiliser @Version seul? (Pour que je ne doive rien changer à mes référentiels/domaine existants, etc.)

Et dois-je faire une configuration supplémentaire pour utiliser @Version?

31
Byron Voorbach

Cela fait un moment que je n'ai pas posé cette question, mais je l'ai compris. Je vais expliquer ce que j'ai fait pour que cela puisse être utile à quelqu'un d'autre.

L'annotation @Version est une interface javax.persistence et non le framework jpa de Spring-Data Rest comme je l'ai mentionné précédemment.

Si vous souhaitez utiliser @Version, vous devez créer un champ de version dans votre objet de domaine comme ceci:

@Version
@Column(name = "VERSION")
private long version;

Si vous utilisez hibernate, il récupérera automatiquement l'annotation et créera une ligne "version" dans votre table (dans mon cas MySql). Chaque fois qu'un enregistrement est mis à jour, hibernate incrémente le compteur de 1.

Maintenant, pourquoi voulez-vous quelque chose? Eh bien, la raison pour laquelle vous voudrez peut-être l'utiliser est parce que cela diminue les chances que vos clients travaillent avec données périmées . Chaque fois qu'un client vous récupère des informations, une version est fournie avec les données qu'il a demandées. par exemple.

{                       <-- School entity -->
    "id": 1,
    "version": 0,                 
    "name": "De regenboog",
    "street": "Plantaanstraat",
    "number": "2",
    "zipCode": "1234AS",
    "city": "Amsterdam"
}

Maintenant, si un client souhaite modifier certaines informations sur cet enregistrement spécifique, il envoie les nouvelles informations avec la valeur de version. Dans ce cas, changeons le nom de l'école.

 {                       <-- School entity -->
    "id": 1,
    "version": 0,                 
    "name": "Stackoverflow",
    "street": "Plantaanstraat",
    "number": "2",
    "zipCode": "1234AS",
    "city": "Amsterdam"
 }

Hibernate propose une requête avec vos informations et ajoute une clause supplémentaire "where" pour vérifier la version. update .... where id = 1 and version = 0. Maintenant, si la ligne est mise à jour, cela signifie que vous avez fourni la bonne version et que personne d'autre n'a modifié ces informations spécifiques entre le moment où vous avez demandé les informations, les a modifiées et les a renvoyées. Bonne droite?

Et maintenant, si la ligne n'est pas mise à jour? Cela signifie que quelqu'un d'autre a mis à jour cette ligne pendant que vous preniez une petite pause dans la salle de bain après avoir demandé les informations. Cela signifie que votre version est obsolète! Ce qui doit arriver maintenant est vraiment spécifique au cas d'utilisation, donc je n'entrerai pas dans les détails à ce sujet :)

J'espère que quelqu'un pourra utiliser cette information!

Merci a tous

63
Byron Voorbach

Assurez-vous d'importer import javax.persistence.Version

et pas celle du printemps.

5
Byorn