zhangzhenhuajack / spring-data-jpa-guide

spring-data-jpa-guide,Spring Data JPA实战,SpringDataJpa详解
http://www.jackzhang.cn/spring-data-jpa-guide/
379 stars 164 forks source link

接手一个Mybtisplus的项目,采用Jpa进行重构。在Service层有原来的Mybatis的访问数据库的代码。在替换过程中,是逐渐替换的,会存在在一个Service方法中,访问数据库的代码,有Jpa,与Mybatis共存的情况。 #44

Open stevenclaro opened 2 years ago

stevenclaro commented 2 years ago

@Transactional @Override //是根据每一条的Task及FileID来执行这一个分解为子任务的 public Result startRuleReview(Integer id) { //1.校验 String key = RedisKeyConstants.FILE_REVIEW.concat(String.valueOf(id)); boolean lock = jedisUtils.lock(key, NumberConstants.THIRTY); if (!lock) { return Result.createError("任务锁定中"); } //RuleReviewTask task = ruleReviewTaskMapper.selectByPrimaryKey(id); JPARuleReviewTask task=jpaTaskRepository.getOne(id.longValue());

    if (!ReviewTaskStateEnum.WATI_RULE_REVIEW.getState().equals(task.getStatus())) {
        return Result.createError("任务状态非待规则审核");
    }

    //2.子任务创建
    ruleReviewDetailMapper.delByTaskId(id);
    //创建之前,在子任务中,先将该主任务的id关联的记录,先删除掉.这个是异常数据检查.这个暂时用Mybtis
    //检查一下,在一个Transaction下,2种混合应用,可能存在的问题。如果不用,业务上需要单独将子表中的相关记录删除,但是主表的记录不动。
    //下面的代码,整体上是将主任务根据manufactureid分解为子任务,并更新子任务的状态
    //根据这个机构选择的规则集合,这样选择就是持久化的选择集合。也可以是每次让用户来传入这个规则集合。
    List<RuleInfoDto>rules = ruleMapper.queryByDepart(task.getSysDepartId());

jpa: generate-ddl: false show-sql: true hibernate: ddl-auto: update properties: hibernate: connection: handling_mode: DELAYED_ACQUISITION_AND_HOLD event: merge: entity_copy_observer: allow open-in-view: false

问题描述 用户请求在碰到方法上的Tranaction注解的时候,会开启一个Session 然后在方法体中, 第一次 碰到Jpa dao层,开启事务,获取数据库连接,执行后不关闭 事务,但是没有关闭数据库连接。 第二次 碰到 Mybatis dao 层,根据事务传播机制,获取Jpa上获取的事务,获取数据库连接,执行后不关闭事务,没有关闭数据库连接。 方法体退出时候,关闭事务,关闭连接,关闭Session 这个理解是否正确,在jpa,与mybatis 2个dao层混用的情况下,原理得比较清楚,否则错误很难排查?

zhangzhenhuajack commented 2 years ago

需要搞清楚:数据源,连接,事务的关系。