注意:我不需要关于最佳锁定的说明.这个问题是关于使用乐观锁定时的特定Spring Data行为.
每当实体具有带注释的字段时,从jpa 规范中@Version
,应该在实体上自动启用乐观锁定.
如果我在使用存储库的弹簧数据测试项目中执行此操作,则锁定似乎不会被激活.实际上,OptimisticLockException
在执行不可重复读取测试时会抛出no (参见JPA规范第93页上的P2)
但是,从spring 文档中我看到,如果我们用一个方法注释,@Lock(LockModeType.OPTIMISTIC)
那么底层系统会正确地抛出一个OptimisticLockException
(然后由spring捕获并以稍微不同的形式向上传播).
这是正常的还是我错过了什么?我们是否有义务对所有方法进行注释(或者创建一个采用锁定的基本存储库实现)以使用spring数据启用乐观行为?
我在spring boot项目1.4.5版本的上下文中使用spring数据.
考试:
public class OptimisticLockExceptionTest {
static class ReadWithSleepRunnable extends Thread {
private OptimisticLockExceptionService service;
private int id;
UserRepository userRepository;
public ReadWithSleepRunnable(OptimisticLockExceptionService service, int id, UserRepository userRepository) {
this.service = service;
this.id = id;
this.userRepository = userRepository;
}
@Override
public void run() {
this.service.readWithSleep(this.userRepository, this.id);
}
}
static class ModifyRunnable extends Thread {
private OptimisticLockExceptionService service;
private int id;
UserRepository …
Run Code Online (Sandbox Code Playgroud) 我有这个代码:
messageDto = new CorrelationDto()
{
timestamp = default,
};
var isDefault = messageDto.GetType().GetProperty("timestamp").GetValue(messageDto) == default; // FALSE
var isDefault2 = messageDto.timestamp == default; // TRUE
Run Code Online (Sandbox Code Playgroud)
其中时间戳是日期时间。
正如你所看到的,通过反射获取值并与默认返回 false 进行比较。您知道为什么会发生这种情况以及我应该如何检查默认值吗?谢谢
==编辑==
有人向我指出 GetValue() 的返回值是一个对象,因此必须将其转换为 DateTime 才能使默认值起作用。不幸的是我不能,因为我正在对对象的所有属性运行此测试以发现该对象是否已初始化(因此我检查 null 或默认值)。而实际上 messageDto 是一个泛型类型,所以我事先不知道它的属性的类型。