相关疑难解决方法(0)

如何向Spring Data JPA添加自定义方法

我正在研究Spring Data JPA.考虑下面的示例,我将默认使用所有crud和finder功能,如果我想自定义查找器,那么也可以在界面本身轻松完成.

@Transactional(readOnly = true)
public interface AccountRepository extends JpaRepository<Account, Long> {

  @Query("<JPQ statement here>")
  List<Account> findByCustomer(Customer customer);
}
Run Code Online (Sandbox Code Playgroud)

我想知道如何为上述AccountRepository添加一个完整的自定义方法及其实现?由于它的接口我无法在那里实现该方法.

java spring-data spring-data-jpa

144
推荐指数
8
解决办法
15万
查看次数

Spring数据CrudRepository和悲观锁

我正在使用

  • Spring Boot 1.4.2
  • Spring Data JPA 1.10.5
  • PostgreSQL 9.5数据库

我希望findOne在我的Spring Data存储库中有一个带有悲观锁的findOne方法,该方法与已经提供的方法分开.

根据这个答案,我写道:

public interface RegistrationRepository extends CrudRepository<Registration, Long> {
    @Lock(LockModeType.PESSIMISTIC_WRITE)
    @Query("select r from Registration r where r.id = ?1")
    Registration findOnePessimistic(Long id);
}
Run Code Online (Sandbox Code Playgroud)

这几乎可行.

不幸的是,这不会刷新实体管理器缓存中我的实体的先前实例.我有两个并发请求更新我的注册状态

  • 第二个等待第一个提交的事务
  • 第二个没有考虑第一个的变化.

因此破坏了行为.

任何线索为什么@Lock没有开箱即用刷新实体经理?

更新

这是请求的示例代码:

public interface RegistrationRepository extends CrudRepository<Registration, Long> {

    @Lock(LockModeType.PESSIMISTIC_WRITE)
    @Query("select r from registration_table r where r.id = ?1")
    Registration findOnePessimistic(Long id);

}

public void RegistrationService {

    @Transactional
    public void …
Run Code Online (Sandbox Code Playgroud)

java spring spring-data spring-data-jpa

24
推荐指数
1
解决办法
6348
查看次数

如何在spring数据jpa查询中指定@lock timeout?

如何@Lock为查询指定超时.我正在使用oracle 11g,我希望我可以使用类似的东西'select id from table where id = ?1 for update wait 5'.

我定义了这样的方法,

@Lock(LockModeType.PESSIMISTIC_WRITE)
Stock findById(String id);
Run Code Online (Sandbox Code Playgroud)

它似乎永远锁定.我开始javax.persistence.lock.timeout=0LocalContainerEntityManagerFactoryBean.jpaProperties,但没有受到影响.

java oracle spring hibernate jpa

17
推荐指数
2
解决办法
2万
查看次数

如何使用 JPA 和 Hibernate 避免产品销售的竞争条件

我正在使用 Java Spring 框架和 Hibernate。我正在开发一个电子商务网络应用程序,公共用户可以从该网络应用程序购买产品。每个产品都会有一个数量计数。

问题

我想防止出现两个并发用户购买相同产品的数量值为 1 的情况。在这种情况下,只有第一个用户应该购买该产品,而第二个用户应该收到“无库存”消息。

工作流程

我打算减少数量,然后将购买信息发送到支付网关。如果支付网关遇到支付问题,我将增加数量计数。在购买信息发送到支付网关之前,锁定将被释放。

所以我的问题是,

1)我想确认这个关于悲观锁定的答案确实有助于解决我的问题。

2)我的工作流程还好吗?有一个更好的方法吗?

java concurrency hibernate jpa transactions

2
推荐指数
1
解决办法
6064
查看次数