首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何正确使用优化锁,捕获带有Spring和Hibernate的StaleObjectState异常

如何正确使用优化锁,捕获带有Spring和Hibernate的StaleObjectState异常
EN

Stack Overflow用户
提问于 2012-03-02 14:58:37
回答 1查看 260关注 0票数 0

我第一次尝试使用Hibernate。我需要利用乐观锁定,这样第一次提交就赢了。我想出了如何在测试项目中使用hibernate托管版本号来做到这一点。测试项目只使用Hibernate,而不是Spring,因此处理数据库的代码如下所示:

代码语言:javascript
复制
get session from sessionfactory
open transaction
perform database actions
commit transaction with error handling

我的理解是,我可以使用Spring来获得事务管理,并将代码简化为如下所示:

代码语言:javascript
复制
perform database actions

我不知道的是:

  1. 如何设置Spring。我想使用XML而不是注释。只要链接到一个好的参考资料就太棒了。
  2. 如何在Spring实现中引入错误处理?我在哪里能赶上StaleObjectStateException
  3. ,什么是最好的设计结构?我见过所有线程都使用DAO单例与数据库进行交互,这在我看来是合理的。
EN

回答 1

Stack Overflow用户

发布于 2012-03-06 07:54:57

基本上,您只需向实体添加一个version字段,您也应该有一个id。

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

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

客户端代码需要管理staleObjectStateException。当发生此异常时,它意味着对象被其他代码更改,或者您没有获得最新版本。然后您可以决定要做什么:获得一个更新鲜的版本并进行更改,向用户表明如果存在UI,其他人做了更改……

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

最后,要用@javax.persistence.Version注释version字段

实际上,这是一个JPA概念,也是:

代码语言:javascript
复制
    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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9535364

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档