Spring Hibernate JPA @Transaction(Propagation.REQUIRES_NEW)找不到对象

时间:2017-07-10 14:04:42

标签: java spring hibernate jpa transactions

我在5小时后盯着显示器问这个问题

我的代码格式如下

@Transaction(readmode=true)
class SomeServiceClass {
    @Autowired
    SubServiceClassA subServiceClassA;

    @Autowired
    SubServiceClassB subServiceClassB;

    public void doSomething() {
        Long id = subServiceClassA.performSave();

        subServiceClassB.performAction(id);
    }
}

我坚持一个对象并返回id。

@Service
class SubServiceClassA {
    @Transactional(propagation=Propagation.REQUIRES_NEW)
    public Long performSave() {
        SomeObj someObj = someRepository.save(SomeObj someObj);
        return someObj.getId();
    }
}

稍后在单独的REQUIRES_NEW事务中,我尝试对新保存的对象执行某些操作。

@Service
class SubServiceClassB {
    @Transactional(propagation=Propagation.REQUIRES_NEW)
    public void performAction(Long id) {
        SomeObj someObj = someRepository.find(id);
        // someObj is null here!!! :(
    }
}

我的理解是这个代码应该可以工作,因为保存的对象是在一个单独的bean中的REQUIRES_NEW事务中。

我的问题是这段代码在我的本地设置中运行良好。当我将其上传到生产设置时,我得到了NPE,因为someObjnull。 (我们正在使用gradle,所以依赖应该是相同的)

如果我能得到任何关于为什么这可能不起作用的指示,我将非常感激。

1 个答案:

答案 0 :(得分:0)

找到解决方案

我想我的帖子没有额外的信息

我的ServiceB类中的代码是

@Service
class SubServiceClassB {
    @Transactional(propagation=Propagation.REQUIRES_NEW, readonly=true)
    public void performAction(Long id) {
        SomeObj someObj = someRepository.find(id);
        // someObj is null here!!! :(
    }
}

问题是我在ServiceA中将对象写入主DB,但是从从DB读取。显然,设置readonly=true迫使服务器从slaveDB读取,但是新持久化的对象还没有被复制到从属数据库。

删除readonly=true后,一切正常。