我第一次尝试使用Hibernate。我需要利用乐观锁定,这样第一次提交就赢了。我想出了如何在测试项目中使用hibernate托管版本号来做到这一点。测试项目只使用Hibernate,而不是Spring,因此处理数据库的代码如下所示:
get session from sessionfactory
open transaction
perform database actions
commit transaction with error handling我的理解是,我可以使用Spring来获得事务管理,并将代码简化为如下所示:
perform database actions我不知道的是:
StaleObjectStateException?发布于 2012-03-06 07:54:57
基本上,您只需向实体添加一个version字段,您也应该有一个id。
在您的代码中,您需要管理这个版本,即调用持久性层的代码必须首先获得对象的正确版本号,然后才能更改实体。
Hibernate负责版本字段的更新。所以你只需要把它设置在最后一个值。更新实体时,hibernate将增加字段,因此不需要像对id那样创建序列。
客户端代码需要管理staleObjectStateException。当发生此异常时,它意味着对象被其他代码更改,或者您没有获得最新版本。然后您可以决定要做什么:获得一个更新鲜的版本并进行更改,向用户表明如果存在UI,其他人做了更改……
还可以为实体创建一个基类,使其始终具有id和version字段。注意,如果版本号是读-写实体,则版本号是有用的。
最后,要用@javax.persistence.Version注释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
https://stackoverflow.com/questions/9535364
复制相似问题