单张用户表,禁止重名,因此会在新增用户和改名时校验一下。
因此有了下面的代码,在 save 操作之前进行一下 findByName 查询操作。如果存在同名用户,应该在下一个判断语句处抛出异常。而实际上在 findByName 这一句就抛出异常了。
查看具体的 sql 执行结果发现,在执行 findByName 时,Hibernate 先发送了一条 update 语句,直接改掉了对应记录。
网上查了一下,似乎是缓存的问题,但并不熟悉 Hibernate ,也没有显式配置过缓存,想问下如何禁止这个行为?(就是不让它在查询的时候自己 update )
OpenJDK 11
Spring Boot 2.5.3
1
eggoxygen 2022-03-06 19:21:52 +08:00 via iPhone
不知道是不是 JPA 的坑,在我具体的场景当中对于这种查的我统一会写一个方法。并且标记事务为 readonly 。这样就不会出现这种情况。而且我猜你 findByName 当中的 user 对象已经是一个准备新增的对象并且有值了。有大佬也可以讲讲这种情况如何可以避免。之前用的都是 Mybatis ,感觉 JPA 坑有点点多。
|
2
dddd1919 2022-03-07 09:07:55 +08:00 1
首先 @Transactional 注解不支持 protected 方法,全部是查询的方法上没必要也不应该使用事务注解
另外猜测 save 可能是发生在外部调用,如果外部还有声明事务的话,即使不用 save 方法,只要修改了 jpa 返回的对象,都会在事务执行完成后 update |