我如何才能实现以下代码的等价:
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
的情况下执行?
从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