Как сделать оптимистичную блокировку в hibernate

Я совершенно новичок в Hibernate и Spring, и в моей попытке узнать Spring, Hibernate, Maven и т. д. Я знаю только, как запустить пример hello world, используя все три. С моим базовым пониманием мне была назначена задача для выполнения оптимистической блокировки. Насколько я погуглил, я вижу, что это не очень сложно, все, что мне нужно, это добавить тег версии в мою xml и целочисленную версию переменной в моем сопоставленном классе.. Вроде этого...

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

мой xml должен быть похож это

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

и hibernate автоматически позаботится о управлении версиями, когда второй пользователь сохраняет, hibernate обнаруживает, что этот пользователь работает над устаревшими данными и бросает StaleObjectException.

просто хотел подтвердить мое понимание, спасибо заранее.

это будет очень полезно, если кто-то может указать мне на пример hello world для этого.

Я также хотел бы упомянуть, что я пытаюсь реализовать сценарий "last commit wins"

2 ответов


я использовал аннотации Hibernate и вот моя реализация оптимистической блокировки

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

    private String data;

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

вот пример

// 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;
}

и некоторый код для добавления одного элемента в 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();

после создания новый элемент в БД имеет версию 0. После изменения версии 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;
    }
}

Если мы используем стиль xml, мы можем использовать, как показано ниже в файле hbm:

<id name="productId" column="pid"  />
**<version name="v" column="ver" />**
<property name="proName" column="pname" length="10"/>