tags:

views:

90

answers:

2

I am new to JPA. I am cofused about the @Version annotation.

  • How it works?

I have googled it and found various answers whose extract is as follows:

JPA uses a version field in your entities to detect concurrent modifications to the same datastore record. When the JPA runtime detects an attempt to concurrently modify the same record, it throws an exception to the transaction attempting to commit last.

But still I am not sure how it works?

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

Also as from the following lines:

You should consider version fields immutable. Changing the field value has undefined results.

Does it mean that we should declare our version field as final

+1  A: 

Every time an entity is updated in the database the version field will be increased by one. Every operation that updates the entity in the database will have appended WHERE version = VERSION_THAT_WAS_LOADED_FROM_DATABASE to its query.

In checking affected rows of your operation the jpa framework can make sure there was no concurrent modification between loading and persisting your entity because the query would not find your entity in the database when it's version number has been increased between load and persist.

codescape
+1 ........................... :)
Yatendra Goel
+4  A: 

But still I am not sure how it works?

Let's say an entity MyEntity has an annotated version property:

@Entity
public class MyEntity implements Serializable {    

    @Id
    @GeneratedValue
    private Long id;

    private String name;

    @Version
    private Long version;

    //...
}

On update, the field annotated with @Version will be incremented and added to the WHERE clause, something like this:

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

If the WHERE clause fails to match a record (because the same entity has already been updated by another thread), then the persistence provider will throw an OptimisticLockException.

Does it mean that we should declare our version field as final

No but you could consider making the setter protected as you're not supposed to call it.

Pascal Thivent
(+1) comprehensible
Bozho
+1 very clearly answered... I am learning JPA nowadays and will probably post several questions related to JPA within a day or two. I would be happy if you answer those questions.
Yatendra Goel