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


相关推荐
晚霞的不甘6 分钟前
CANN 编译器深度解析:UB、L1 与 Global Memory 的协同调度机制
java·后端·spring·架构·音视频
SunnyDays10118 分钟前
使用 Java 冻结 Excel 行和列:完整指南
java·冻结excel行和列
摇滚侠19 分钟前
在 SpringBoot 项目中,开发工具使用 IDEA,.idea 目录下的文件需要提交吗
java·spring boot·intellij-idea
云姜.24 分钟前
java多态
java·开发语言·c++
李堇27 分钟前
android滚动列表VerticalRollingTextView
android·java
泉-java1 小时前
第56条:为所有导出的API元素编写文档注释 《Effective Java》
java·开发语言
zfoo-framework1 小时前
帧同步和状态同步
java
charlotte102410241 小时前
高并发:关于在等待学校教务系统选课时的碎碎念
java·运维·网络
亓才孓1 小时前
[JDBC]PreparedStatement替代Statement
java·数据库
_F_y2 小时前
C++重点知识总结
java·jvm·c++