JPA对数据库修改注意点

同一事务中获取不到修改数据

spring-boot-starter-parent版本2.7.12

Dao

java 复制代码
@Query(value = "select * from inventory_list where id in (?1) order by id desc",nativeQuery = true)
List<InventoryListEntity> getByIds(List<Integer> idList);

@Modifying
@Query(value = "update inventory_list set CLASSIFY_TYPE = ?2 where id in (?1)",nativeQuery = true)
void updateClassifyType(@Param(value = "ids") List<Integer> id,
						@Param(value = "classifyType") String classifyType);

Service

InventoryListService

java 复制代码
public interface InventoryListService {

    List<InventoryListEntity> getByIds(List<Integer> idList);

    void updateClassifyType(List<Integer> idList, String classifyType);

    boolean updateClassifyTypeToE(List<Integer> idList);

    boolean updateClassifyTypeToI(List<Integer> idList);
}

UserService

java 复制代码
public interface UserService {
	
	boolean updateClassifyType(List<Integer> idList);
}

ServiceImpl

InventoryListServiceImpl

java 复制代码
@Component
public class InventoryListServiceImpl implements InventoryListService {

    private final Log log = LogFactory.getLog(this.getClass());
    Gson gson = new Gson();

    @Autowired
    private InventoryListDao inventoryListDao;

    @Override
    public void updateClassifyType(List<Integer> idList, String classifyType) {
        inventoryListDao.updateClassifyType(idList, classifyType);
    }

    @Override
    public List<InventoryListEntity> getByIds(List<Integer> idList) {
        return inventoryListDao.getByIds(idList);
    }

    @Override
    public boolean updateClassifyTypeToE(List<Integer> idList) {

        List<InventoryListEntity> entityList = getByIds(idList);
        if (entityList.size() < idList.size()){
            log.warn("存在未查到数据");
            return false;
        }
        for (InventoryListEntity entity : entityList) {
            log.info("? to E,classifyType: " + gson.toJson(entity.getClassifyType()));
        }

        updateClassifyType(idList, "E");

        return true;
    }

    @Override
    public boolean updateClassifyTypeToI(List<Integer> idList) {
        List<InventoryListEntity> entityList = getByIds(idList);
        if (entityList.size() < idList.size()){
            log.warn("存在未查到数据");
            return false;
        }
        for (InventoryListEntity entity : entityList) {
            log.info("E to I,classifyType: " + gson.toJson(entity.getClassifyType()));
            if (!"E".equals(entity.getClassifyType())){

                return false;
            }
        }
        updateClassifyType(idList, "I");

        return true;
    }
}

UserServiceImpl

java 复制代码
@Component
public class UserServiceImpl implements UserService {
	private final Log log = LogFactory.getLog(this.getClass());
	@Autowired
    private InventoryListService inventoryListService;

	// 默认事务隔离级别
	@Override
    @Transactional
    public boolean updateClassifyType(List<Integer> idList) {

        boolean flag1 = inventoryListService.updateClassifyTypeToE(idList);
        if (!flag1){
            return false;
        }
        log.info("updateClassifyTypeToE success");

        boolean flag2 = inventoryListService.updateClassifyTypeToI(idList);
        if (!flag2){
            log.info("updateClassifyTypeToE false");
            return false;
        }

        return true;
    }

}

Controller

java 复制代码
@RestController
public class JpaEntityController {

    @Autowired
    private UserService userService;

    @PostMapping("/jpa/entity/test")
    public String jpaEntityTest(@RequestBody List<Integer> idList){

        boolean flag = userService.updateClassifyType(idList);

        if (flag){
            return "true";
        }

        return "false";
    }
}

请求结果日志


数据最终都会被改成之前第一次修改的状态

解决方式

将修改换成对entity实体的修改


相关推荐
失散136 分钟前
分布式专题——26 BIO、NIO编程与直接内存、零拷贝深入辨析
java·分布式·rpc·架构·nio·零拷贝
-雷阵雨-31 分钟前
数据结构——栈和队列(模拟实现)
java·开发语言·数据结构·intellij-idea
祈祷苍天赐我java之术1 小时前
Redis 热点数据与冷数据解析
java·redis·mybatis
9号达人1 小时前
Java20 新特性详解与实践
java·后端·面试
sniper_fandc2 小时前
关于Mybatis-Plus的insertOrUpdate()方法使用时的问题与解决—数值精度转化问题
java·前端·数据库·mybatisplus·主键id
天若有情6732 小时前
Spring配置文件XML验证错误全面解决指南:从cvc-elt.1.a到找不到‘beans‘元素声明
xml·java·spring
熊小猿2 小时前
ArrayList 与 LinkedList 的区别
java·面试
笨手笨脚の3 小时前
设计模式-装饰器模式
java·设计模式·装饰器模式·结构型设计模式
9毫米的幻想3 小时前
【Linux系统】—— 程序地址空间
java·linux·c语言·jvm·c++·学习
C++chaofan3 小时前
Redisson分布式限流
java·jvm·spring boot·redis·分布式·mvc·redisson