JPA @Version: how to use it?

17,683

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.
Share:
17,683
cometta
Author by

cometta

Updated on June 01, 2022

Comments

  • cometta
    cometta almost 2 years
    @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?
  • cometta
    cometta over 14 years
    @KLE just in case 2 user call hibernatetemplate.saveorupdate same time , no need to put extra checking when call call hibernatetemplate.saveorupdate ? any exception throws?
  • CppDude
    CppDude over 14 years
    @cometta The point is not to save or not, but where the data comes from. In a transaction, if you read an entity from the database, it's version info is up to date. When you save it, it is taken care automatically. If you happen some day to obtain the data from another source (for example the post of a form), and recreate the entity, then you have to care of the version yourself.
  • Zilvinas
    Zilvinas over 10 years
    A pretty good explanation is here: en.wikibooks.org/wiki/Java_Persistence/Locking
  • Kalpesh Soni
    Kalpesh Soni about 10 years
    integration tests - they don't really test your code - really? what does arquillian do then?