簡體   English   中英

如何在hibernate中做樂觀鎖定

[英]How to do optimistic locking in 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。

只是想提前確認我的理解。

如果有人可以為我指出一個問候世界的例子,那將會非常有幫助。

我還想提一下,我正在嘗試實施“最后提交勝利”的場景

我使用了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();

創建后,DB中的新元素具有版本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"/>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM