gpt4 book ai didi

java - 如何正确使用乐观锁定,使用 Spring 和 Hibernate 捕获 StaleObjectState 异常

转载 作者:行者123 更新时间:2023-12-01 15:30:44 26 4
gpt4 key购买 nike

我是第一次尝试使用 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 单例来与数据库交互,这对我来说似乎很合理。

最佳答案

基本上,您只需向实体添加一个版本字段,您还应该有一个 ID。

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

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

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

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

最后你想用@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

关于java - 如何正确使用乐观锁定,使用 Spring 和 Hibernate 捕获 StaleObjectState 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9535364/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com