0

我想打开一个新交易并使用我在第一笔交易中所做的所有更改。但是从第二笔交易我无法读取内部实体

class A {
    @Autowirde
    private B b;

    @Transactional
    public test() {
        ProgramRole programRole = new ProgramRole();
        programRoleRepo.save(programRole);
        
        Program program = new Program();
        program.setProgramRole(programRole);
        programRepo.save(program); // Let say id is 1
        
        Program p = programRepo.getOne(1);
        p.getProgramRole() // Return 'programRole'
        
        b.test();
    }
}

@Component
class B {
    @Transactional(propagation = Propagation.REQUIRES_NEW, isolation = Isolation.READ_UNCOMMITTED)
    public void test() {
        Program p = programRepo.getOne(1);
        p.getProgramRole() // Return null. Why?
    }
}
4

1 回答 1

0

Hibernate 将持久化状态保存在内存中,将此状态同步到底层 DB 的过程称为刷新。当我们使用 save() 方法时,与保存操作关联的数据不会刷新到数据库,除非并且直到显式调用 flush() 或 commit() 方法,在您的情况下,事务注释将这样做b.test 方法在事务中从 with 调用,因此您在那里得到 null,因为第一个事务仍在进行中(事务将在方法执行完成时提交数据)。

对于您的用例,您需要使用 saveAndFlush 而不是仅保存

ProgramRole programRole = new ProgramRole();
        programRoleRepo.saveAndFlush(programRole);
        
        Program program = new Program();
        program.setProgramRole(programRole);
        programRepo.saveAndFlush(program); /
于 2021-02-03T16:34:39.853 回答