【问题标题】:How to correctly use optimisstic locking, catch StaleObjectState exceptions with Spring and Hibernate如何正确使用乐观锁,使用 Spring 和 Hibernate 捕获 StaleObjectState 异常
【发布时间】:2012-03-02 14:58:37
【问题描述】:

我是第一次尝试使用 Hibernate。我需要使用乐观锁定,以便第一次提交获胜。我通过在测试项目中的休眠管理版本号解决了如何做到这一点。测试项目只使用了 Hibernate,没有使用 Spring,所以使用数据库的代码如下所示:

get session from sessionfactory
open transaction
perform database actions
commit transaction with error handling

我的理解是,我可以利用 Spring 来进行事务管理并将代码简化为这样的:

perform database actions

我不知道的:

  1. 如何设置 Spring。我想在注释上使用 XML。只是一个好的参考链接会很棒。
  2. Spring 实现如何处理错误?我在哪里可以看到StaleObjectStateException
  3. 最好的设计结构是什么?我见过所有线程都用来与数据库交互的 DAO 单例,这对我来说似乎是合理的。

【问题讨论】:

    标签: java spring hibernate transactions


    【解决方案1】:

    基本上你只是为你的实体添加一个版本字段,你还应该有一个 id。

    在您的代码中,您需要管理此版本,即调用持久层的代码必须首先获取具有正确版本号的对象,然后才能更改实体。

    Hibernate 负责更新版本字段。因此,您只需要将它设置为最后一个设置的值。更新实体时,hibernate 将增加字段,因此您无需像为 id 那样创建序列。

    客户端代码需要管理 staleObjectStateException。发生此异常时,表示对象已被其他代码更改或您没有获得最新版本。你可以决定接下来要做什么:获取更新的版本并进行更改,如果有 UI,则向用户指示其他人进行了更改...

    您还可以为您的实体创建一个基类,使其始终具有 id 和 version 字段。请注意,如果版本号是读写实体,则版本号很有用。

    最后你想用@javax.persistence.Version注释版本字段

    其实它也是一个 JPA 概念:

        private int version;
    
        public AbstractReadWriteEntity() {}
    
        @javax.persistence.Version
        @javax.persistence.Column(name = "VERSION")
        public int getVersion()...
    

    还要了解它在 db 级别的作用:http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/transactions.html#transactions-optimistic

    【讨论】:

      猜你喜欢
      • 2013-10-27
      • 2016-07-18
      • 1970-01-01
      • 2015-05-14
      • 2013-09-16
      • 2018-10-22
      • 1970-01-01
      • 2014-02-18
      • 2010-11-28
      相关资源
      最近更新 更多