8

我对 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 示例,那将非常有帮助。

我还想提一下,我正在尝试实现“最后一次提交获胜”场景

4

2 回答 2

12

我使用了 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;
    }
}
于 2011-08-02T11:05:39.673 回答
1

如果我们使用 xml 样式,我们可以在 hbm 文件中使用如下:

<id name="productId" column="pid"  />
**<version name="v" column="ver" />**
<property name="proName" column="pname" length="10"/>
于 2016-03-31T06:12:36.207 回答