136 votes

Java - JPA - Annotation @Version

Je suis nouveau à la JPA. Je suis cofused sur l' @Version d'annotation.

  • Comment cela fonctionne?

J'ai googlé et trouvé des réponses très diverses dont l'extrait est comme suit:

JPA utilise une version du champ dans votre entités afin de détecter les modifications concurrentes de la même banque de données d'enregistrement. Lorsque l'APP runtime détecte une tentative de modifier simultanément le même registre, il déclenche une exception à la transaction fait de tenter de commettre dernier.

Mais encore, je ne suis pas sûr de savoir comment il fonctionne?

==================================================================================

Également depuis les lignes suivantes:

Vous devriez envisager de champs de version immuable. La modification de la valeur du champ a des résultats inattendus.

Ça veut dire que nous devons déclarer notre champ de version comme final

203voto

Pascal Thivent Points 295221

Mais encore, je ne suis pas sûr de savoir comment il fonctionne?

Disons une entité MyEntity a une annoté version de la propriété:

@Entity
public class MyEntity implements Serializable {    

    @Id
    @GeneratedValue
    private Long id;

    private String name;

    @Version
    private Long version;

    //...
}

Sur mise à jour, le champ annotées @Version sera incrémenté et ajouté à l' WHERE clause, quelque chose comme ceci:

UPDATE MYENTITY SET ..., VERSION = VERSION + 1 WHERE ((ID = ?) AND (VERSION = ?))

Si l' WHERE clause ne parvient pas à correspondre à un enregistrement (parce que la même entité a déjà été mis à jour par un autre thread), puis le fournisseur de persistance va jeter un OptimisticLockException.

Ça veut dire que nous devons déclarer notre champ version finale

Non, mais vous pourriez envisager de faire le setter protégée que vous n'êtes pas censé l'appeler.

9voto

stefanglase Points 5482

Chaque fois qu'une entité est mis à jour dans la base de données le champ version sera augmenté d'une unité. Chaque opération que les mises à jour de l'entité dans la base de données ont ajouté WHERE version = VERSION_THAT_WAS_LOADED_FROM_DATABASE de sa requête.

Dans la vérification de lignes affectées de votre opération de la jpa cadre assurez-vous il n'y a pas de modifications simultanées entre le chargement et la persistance de votre entité, car la requête ne serait pas trouver votre entité dans la base de données lorsque c'est le numéro de version a été augmenté entre charge et de persister.

2voto

uudashr Points 69

Version utilisée pour garantir qu'une seule mise à jour à la fois. Le fournisseur JPA vérifiera la version. Si la version attendue augmente déjà, une autre personne mettra déjà à jour l'entité et une exception sera levée.

La mise à jour de la valeur de l'entité serait donc plus sûre et plus optimiste.

Si la valeur change fréquemment, vous pouvez envisager de ne pas utiliser le champ de version. Pour un exemple "une entité qui a un champ compteur, cela augmentera à chaque accès à une page Web"

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X