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实体的修改


相关推荐
Chase_______3 分钟前
计算机数据存储全解:从底层进制转换到存储介质演进
java·开发语言·python
网络工程小王12 分钟前
【LangGraph 子图(Subgraph)详解】学习笔记
java·服务器·数据库·人工智能·langchain
小碗羊肉30 分钟前
【JavaWeb | 第七篇】部门管理项目实战
java·开发语言·servlet
YL200404261 小时前
027合并两个有序链表
java·数据结构·算法·链表
维诺菌1 小时前
claude code安装
java·开发语言·ai编程·calude
顶点多余1 小时前
自定义协议、序列化、反序列化实现
java·linux·开发语言·c++·tcp/ip
小新同学^O^1 小时前
简单学习 --> SpringAOP
java·学习·spring·aop
风味蘑菇干1 小时前
使用接口定义规范,实现类完成具体逻辑。
java·开发语言
Zephyr_01 小时前
java数据结构
java·数据结构
2401_833269301 小时前
Java多线程:从入门到进阶
java·开发语言