我想打开一个新的事务,并使用我在第一个事务中所做的所有更改。但从第二个事务中,我无法读取内部实体
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?
}
}
1条答案
按热度按时间zengzsys1#
hibernate将持久状态保存在内存中,将此状态与底层db同步的过程称为刷新。当我们使用save()方法时,与save操作相关联的数据不会被刷新到db,除非并且直到显式调用flush()或commit()方法,在您的例子中,事务性注解会这样做,因为b.test方法在事务中从with调用,所以您在那里得到null,因为第一个事务仍在处理中(当方法执行完成时,事务将提交数据)。
对于您的用例,您需要使用saveandflush而不仅仅是save