当前位置: 首页 > 知识库问答 >
问题:

在使用Spring数据JPA查找实体时,如何启用lockmodetype.pessimistic_write?

艾宏远
2023-03-14

我如何才能实现以下代码的等价:

tx.begin();
Widget w = em.find(Widget.class, 1L, LockModeType.PESSIMISTIC_WRITE);
w.decrementBy(4);
em.flush();
tx.commit();

...但是使用Spring和Spring-Data-JPA注释?

我现有代码的基础是:

@Service
@Transactional(readOnly = true)
public class WidgetServiceImpl implements WidgetService
{
  /** The spring-data widget repository which extends CrudRepository<Widget, Long>. */
  @Autowired
  private WidgetRepository repo;

  @Transactional(readOnly = false)
  public void updateWidgetStock(Long id, int count)
  {
    Widget w = this.repo.findOne(id);
    w.decrementBy(4);
    this.repo.save(w);
  }
}

但是我不知道如何指定updateWidgetStock方法中的所有内容都应该使用悲观锁集来完成。

有一个Spring Data JPA注释org.springframework.Data.JPA.repository.lock,它允许您设置LockModeType,但我不知道将它放在UpdateWidgetStock方法上是否有效。这听起来更像是widgetrepository上的注释,因为Javadoc说:

org.springframework.data.jpa.repository
@target(value=方法)
@retention(value=运行时)
@documented
public@interface Lock
注释,用于指定执行查询时要使用的LockModeType。在对查询方法使用Query或从方法名派生查询时,将对其进行计算。

...所以这似乎没什么帮助。

如何使UpdateWidgetStock()方法在设置LockModeType.Pessimistic_Write的情况下执行?

共有1个答案

常乐
2023-03-14

从Spring Data JPA的1.6版开始,CRUD方法就支持@lock(事实上,已经有一个里程碑可用)。详见此票。

对于该版本,您只需声明以下内容:

interface WidgetRepository extends Repository<Widget, Long> {

  @Lock(LockModeType.PESSIMISTIC_WRITE)
  Widget findOne(Long id);
}

这将导致备份存储库代理的CRUD实现部分将配置的LockModeType应用于EntityManager上的Find(…)调用

 类似资料:
  • 问题内容: 我如何才能达到与以下代码等效的效果: …但是使用Spring和Spring-Data-JPA批注? 我现有代码的基础是: 但是我不知道如何指定方法中的所有操作都应使用悲观锁集。 有一个Spring Data JPA批注,允许您设置,但是我不知道将其放在方法上是否有效。听起来更像是的注解,因为Javadoc说: org.springframework.data.jpa.repositor

  • 这个问题几乎说明了一切。使用JPARepository,我如何更新一个实体? JPARepository只有一个save方法,它并不告诉我它实际上是create还是update。例如,我向数据库用户插入一个简单的对象,它有三个字段:、和: 然后我只需调用,此时它实际上是对数据库的插入: 到目前为止还不错。现在我想更新这个用户,比如说改变他的年龄。为此,我可以使用查询,无论是QueryDSL还是Na

  • 我开始学习使用实体图来减少N1问题。但我面临一个问题,findAll方法返回重复数据。 < code >人 我创建一个 pom.xml代码 我的代码出了什么问题?方法 都不能使用 EntityGraph?

  • 我的用户实体 每个用户都可以有许多角色。给定一个角色(以字符串数据类型表示),我想获取具有此角色的所有用户。 例如 角色为“admin”的User1 角色为“user”的User2 角色为“admin”的User3 对于角色“admin”,我想得到User1和User2。 我对Spring Data Jpa的尝试: 但我得到了豁免 组织。冬眠LazyInitializationException:

  • 主要内容:JPA实体查找示例要找到一个实体,接口提供了方法,该方法根据主键搜索一个元素。 JPA实体查找示例 在这里,我们将搜索指定的记录并在控制台输出它的值。 完整的项目代码如下所示 - 这个例子包含以下步骤 - 第1步: 在包下创建一个名为的实体类,它包含属性:,和。 文件:StudentEntity.java 的代码如下 - 第2步: 将实体类和其他数据库配置映射到文件中。 文件:persistence.xml 的代码

  • 问题内容: 这个问题几乎说明了一切。使用JPARepository如何更新实体? JPARepository只有一个 save 方法,它不会告诉我它是否实际上是在创建或更新。例如,我插入一个简单的对象数据库的用户,其中有三个领域:,和: 然后,我简单地调用,这实际上是数据库的插入: 到目前为止,一切都很好。现在,我想更新此用户,例如更改其年龄。为此,我可以使用QueryDSL或NamedQuery