JPA隐式刷新在交易结束时没有发生

时间:2015-08-12 19:38:22

标签: java hibernate jpa transactions

我有一个标有org.springframework.transaction.annotation.Transactional的方法

@Transactional
private void bob(String userName){
   User user = userRepo.getUser(userName);//autowired repo finds User domain Object
   user.setSomeDate(new Date());
}

然后我将此方法称为循环

for(String userName: userNames ){
    System.outPrintln("something happens before we cal it again.");
    bob(userName);
}

repo找到用户,并且没有记录任何异常。

我的理解是脏用户对象是一个托管实体,并在事务退出时保存。

我实际看到的是在重写事务方法bob时刷新用户。因此,如果for循环在执行后有3个用户名,我可以看到前2个用户在db中获取日期,第三个永远不会刷新到db并保持无日期。 所以我的理解似乎是错误的。我错过了什么?

1 个答案:

答案 0 :(得分:1)

问题是你的方法是私有的,默认情况下Spring只能在从另一个类调用的公共方法中启动一个事务。你可以使用aspectJ来解决这个问题。

从春天docs

  

方法可见性和@Transactional

     

使用代理时,应该应用@Transactional注释   仅限具有公众可见度的方法。如果你做注释保护,   使用@Transactional注释的私有或包可见方法,   没有引发错误,但带注释的方法没有出现错误   配置的事务设置。考虑使用AspectJ(参见   如果你需要注释非公开方法。