JPA @Version: how to use it?

cometta picture cometta · Dec 3, 2009 · Viewed 17.2k times · Source
@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?

Answer

KLE picture KLE · Dec 3, 2009

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.