如何正确使用optimisstic锁定,使用Spring和Hibernate捕获StaleObjectState异常

时间:2012-03-02 14:58:38

标签: java spring hibernate transactions

我第一次尝试使用Hibernate。我需要使用乐观锁定,以便第一次提交获胜。我通过测试项目中的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单例,这对我来说似乎很合理。

1 个答案:

答案 0 :(得分:1)

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

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

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

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

您还可以为实体创建一个基类,以便始终拥有id和version字段。请注意,如果版本号是读写实体,则该版本号非常有用。

最后,您想要使用@ javax.persistence.Version

注释版本字段

实际上它也是JPA概念:

    private int version;

    public AbstractReadWriteEntity() {}

    @javax.persistence.Version
    @javax.persistence.Column(name = "VERSION")
    public int getVersion()...

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