当前位置: 首页 > 面试题库 >

使用Spring Data 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 = METHOD)
@Retention(value = RUNTIME)
@Documented
public @interface锁定
注释,用于指定执行查询时要使用的LockModeType。在查询方法上使用“查询”或从方法名称派生查询时,将对它进行评估。

…因此似乎没有帮助。

如何使我的updateWidgetStock()方法通过LockModeType.PESSIMISTIC_WRITEset 执行?


问题答案:

@Lock从Spring Data JPA
1.6版开始,CRUD方法就支持该功能(实际上,已经有了一个里程碑)。有关更多详细信息,请参见此票证。

使用该版本,您只需声明以下内容:

interface WidgetRepository extends Repository<Widget, Long> {

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

这将导致后备存储库代理的CRUD实现部分将已配置的应用LockModeType到上的find(…)调用EntityManager



 类似资料:
  • 我如何才能实现以下代码的等价: ...但是使用Spring和Spring-Data-JPA注释? 我现有代码的基础是: 但是我不知道如何指定方法中的所有内容都应该使用悲观锁集来完成。 有一个Spring Data JPA注释,它允许您设置,但我不知道将它放在方法上是否有效。这听起来更像是上的注释,因为Javadoc说: org.springframework.data.jpa.repository

  • SpringDataJpa中 Specification怎样使用in查询 实体类Menu.java如下 想通过roles属性做in查询,代码如下 错误如下: Parameter value [com.appmtce.pojo.entity.role.Role@20f81e2a] did not match expected type [java.util.Collection (n/a)] 我的S

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

  • 如何使用Spring Rest Controller和Spring Data JPA仅更新从@刚体传递的实体属性? 员工实体: 服务类方法: 请求体: Hibernate更新查询: Spring Data JPA正在尝试将company_id设置为空以进行更新,即使我没有将其传递给请求体?但是如果我从数据库中得到实体,使用employee_id传递,然后如果我试图保存(),那么它的工作正常。 我想

  • 问题内容: 我有以下代码: 在同一工作区,我有以下课程 如果我单击鼠标右键(首先提到)并选择“打开呼叫层次结构”,那么我什么也看不到。 如何在Eclipse中找到这种用法? 问题答案: 右键单击Myclass,在project | workspace中找到引用。 打开调用层次结构,打开继承层次结构。