Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to do optimistic locking in hibernate

I am completely new to Hibernate and Spring and in my attempt to learn Spring, Hibernate, Maven etc I only know how to run a hello world example using all of the three. With my basic understanding I have been assigned a task for performing optimistic locking. As far as I have googled it I can only see it is not very difficult all I need is to add a version tag in my xml and integer variable version in my mapped class.. Like this...

public class MyClass {
...
private int version;
...
}

my xml should be like this

<class name="MyClass">
<id ...>
<version name="version" column="VERSION" access="field">
...
</class>

And hibernate will automatically take care of versioning when second user saves, hibernate finds this user is working on the stale data and throws StaleObjectException.

Just wanted to confirm my understanding, thanks in advance.

It will be really helpful if some one can point me to a hello world example for this.

I would also like to mention that I am trying to implement "last commit wins" scenerio

like image 276
Anupam Gupta Avatar asked Aug 02 '11 08:08

Anupam Gupta


2 Answers

I used Hibernate annotations and here is my implementation of optimistic locking

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

    private String data;

    @Version
    private Integer version; // this is version field
}

Here is 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 element 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, new element in DB has version 0. After modifying - 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;
    }
}
like image 170
Sergey Galchenko Avatar answered Oct 26 '22 17:10

Sergey Galchenko


If we are using the xml style we can use as below in the hbm file:

<id name="productId" column="pid"  />
**<version name="v" column="ver" />**
<property name="proName" column="pname" length="10"/>
like image 35
Sonu Avatar answered Oct 26 '22 17:10

Sonu