Как сделать оптимистическую блокировку в спящем режиме - PullRequest
7 голосов
/ 02 августа 2011

Я совершенно новичок в 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.

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

Будет очень полезно, если кто-нибудь подскажет мне пример с приветом.

Я также хотел бы отметить, что япытаюсь реализовать "последний коммит выигрывает" scenerio

Ответы [ 2 ]

11 голосов
/ 02 августа 2011

Я использовал аннотации 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;
}

И некоторый код для добавления одного элемента в БД

        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;
    }
}
1 голос
/ 31 марта 2016

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

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