当前位置: 首页 > 面试题库 >

如何在Hibernate状态下进行乐观锁定

弓玉书
2023-03-14
问题内容

我对Hibernate和Spring完全陌生,在尝试学习Spring,Hibernate,Maven等时,我只知道如何使用这三个方法来运行helloworld示例。根据我的基本理解,我被分配了执行乐观锁定的任务。就我用谷歌搜索,我只能看到它不是很困难,我所需要的只是在我的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;
}

以及一些向数据库添加一个元素的代码

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


 类似资料:
  • 我有一个带有和的微服务。我使用注释对中的表执行操作。我遇到的问题是保存操作花费了太多的时间,所以我希望读取操作不被它阻塞。注意,保存是通过持久化实体来执行的。 当前,在所有并发保存操作完成之前,所有读取操作都不会返回结果,这意味着表被锁定。相反,我希望实现乐观锁定。我怎样才能做到呢?

  • 在提交当前事务之前,当hibernate检查行的版本时,它应该发出一个sql语句来获取ithe行。 假设发出语句后,hibernate发现行版本没有更改,因此它应该继续提交事务。 否则,在行版本检查和提交之间会有一个很短的时间间隔,这可能会发生竞争条件。 请分享你的想法。

  • 本文向大家介绍说一下乐观锁和悲观锁?相关面试题,主要包含被问及说一下乐观锁和悲观锁?时的应答技巧和注意事项,需要的朋友参考一下 乐观锁:每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在提交更新的时候会判断一下在此期间别人有没有去更新这个数据。 悲观锁:每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会阻止,直到这个锁被释放。 数据库的乐观锁需要自

  • 我有一个关于Hibernate中乐观锁定的问题。我正试图深入乐观地锁定Hibernate,但我有一个疑问。Hibernate使用版本方法(整数或时间戳)来实现乐观锁定。要进行配置,可以使用@Version注释(或xml配置)并创建版本属性。另一个选项是在不使用乐观lock=“all”属性进行版本控制的情况下进行配置。 我的问题是,如果你没有定义任何版本属性,也没有指定乐观锁属性,在这种情况下,哪种

  • 在多用户环境中,在同一时间可能会有多个用户更新相同的记录,会产生冲突,解决方案有两种:乐观锁、悲观锁。 悲观锁在这里不讲,自行Google。 乐观锁假设不会发生并发冲突,只在提交操作时检查是否违反数据完整性,不完整则更新失败。 乐观锁实现方式 使用整数表示数据版本号.更新时检查版本号是否一致,如果相等,则更新成功,且版本号+1.如果不等,则数据已经被修改过,更新失败。 使用时间戳来实现。 本质上也

  • 我试图在不同的事务中更新同一行,以理解Hibernate的乐观锁定。 但是我没有得到任何StaleObjectStateException或任何其他异常。 我已经在我正在尝试执行的操作上方附加了代码。请让我知道..我错过了什么吗? 或者乐观锁定与我正在尝试做的事情不同。 在上面的代码中,我启动了两个线程“早些时候”和“晚些时候”,它们都从会话工厂获取会话对象,并从数据库加载相同的记录并同时更新它。