I used Hibernate annotations and here is my optimistic locking implementation
@Entity public class MyObject { @Id @GeneratedValue(strategy = GenerationType.AUTO) private Long id; private String data; @Version private Integer version;
Here is a working example
// Entity class with version field @Entity public class Ent1 implements Serializable { private static final long serialVersionUID = -5580880562659281420L; @Id Integer a1; Integer a2; @Version private Integer version; }
And some code to add one item to DB
session = HibernateHelper.getSessionFactory().openSession(); transaction = session.beginTransaction(); Ent1 entity = new Ent1(); entity.setA1(new Integer(0)); entity.setA2(new Integer(1)); session.save(entity); transaction.commit(); // get saved object and modify it transaction = session.beginTransaction(); List<Ent1> list = (List<Ent1>)session.createQuery("FROM Ent1 WHERE a1 = 0").list(); Ent1 ent = list.get(0); ent.setA2(new Integer(1000)); session.save(ent); transaction.commit();
After creation, the new item in the database has version 0. After the change, version 1.
HibernateHelper.java
import org.hibernate.SessionFactory; import org.hibernate.cfg.AnnotationConfiguration; public class HibernateHelper { private static final SessionFactory sessionFactory; static { try { sessionFactory = new AnnotationConfiguration().configure().buildSessionFactory(); } catch (Throwable ex) { System.err.println("Initial SessionFactory creation failed." + ex); throw new ExceptionInInitializerError(ex); } } public static SessionFactory getSessionFactory() { return sessionFactory; } }
Sergey Galchenko
source share