Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

JPA @Version: how to use it?

@Entity
public class Person {
    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private Long id;

    private int salary;

    @Version
    private long version;

    // ...getters and setters
}
  1. Is it required to create setter/getter for version?
  2. When persisting this entity with Hibernate, I don't need to set this value manually, right?
  3. What else do I need to configure in order to use optimistic concurrency checking with Spring's hibernateTemplate.saveOrUpdate? Are all databases supported?
  4. How to unit-test this entity? In my database all my records showing version field have value of 0
  5. Will calling hibernateTemplate.saveOrUpdate increment the version value every time?
like image 718
cometta Avatar asked Dec 03 '09 09:12

cometta


People also ask

What is the use of @version annotation?

In order to use optimistic locking, we need to have an entity including a property with @Version annotation. While using it, each transaction that reads data holds the value of the version property. Before the transaction wants to make an update, it checks the version property again.

How does JPA version work?

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.

What is JPA and how do you use it?

The Java Persistence API (JPA) is one possible approach to ORM. Via JPA the developer can map, store, update and retrieve data from relational databases to Java objects and vice versa. JPA can be used in Java-EE and Java-SE applications. JPA is a specification and several implementations are available.

How do you handle optimistic lock exception?

Solution. To resolve this error we have two ways: Get the latest object from the database and set the old object values if you need those values to be persisted to the new object and merge it. For the old object set the latest version from Database.


1 Answers

I would say:

  1. set/get version is required, as you might assign the version yourself sometimes (when recreating an new instance from old data)
  2. You don't need if you read the instance from the database. (When creating it in your code with new, it would be a different story).
  3. I see nothing else. I never had a problem with a database.
  4. Unit test don't go the database in my opinion, so tests involving the database are called integration tests. You shouldn't have too much of them, as they are slow, and they don't really test your code, but more the Hibernate/Driver/Database codes ... You should trust them, or just test them once, but not for all your entities.
    To see version values more than 0, read/modify/update your entity in a transaction, the version increase by one. Go out of the transaction, do it again, the value increases ...
  5. The version will increase each time the database row is modified.
like image 84
KLE Avatar answered Sep 28 '22 09:09

KLE