为什么在新事务中我不能读取内部实体?

relj7zay  于 2021-07-24  发布在  Java
关注(0)|答案(1)|浏览(311)

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

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?
    }
}
zengzsys

zengzsys1#

hibernate将持久状态保存在内存中,将此状态与底层db同步的过程称为刷新。当我们使用save()方法时,与save操作相关联的数据不会被刷新到db,除非并且直到显式调用flush()或commit()方法,在您的例子中,事务性注解会这样做,因为b.test方法在事务中从with调用,所以您在那里得到null,因为第一个事务仍在处理中(当方法执行完成时,事务将提交数据)。
对于您的用例,您需要使用saveandflush而不仅仅是save

ProgramRole programRole = new ProgramRole();
        programRoleRepo.saveAndFlush(programRole);

        Program program = new Program();
        program.setProgramRole(programRole);
        programRepo.saveAndFlush(program); /

相关问题