繁体   English   中英

事务结束时未发生JPA隐式刷新

[英]JPA implicit flush at end of transaction not happening

我有一个标记为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);
}

存储库查找用户,并且没有记录异常。

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

我真正看到的是租用事务方法bob时用户被刷新。 因此,如果执行后for循环有3个用户名,我可以去查看前2个用户在数据库中获取日期,而第三个用户永远不会刷新到db并保持无日期。 因此,我的理解似乎是错误的。 我想念什么?

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

从春季文档

方法可见性和@Transactional

使用代理时,应仅将@Transactional注释应用于具有公共可见性的方法。 如果使用@Transactional注释对受保护的,私有的或程序包可见的方法进行注释,则不会引发任何错误,但是带注释的方法不会显示已配置的事务设置。 如果需要注释非公共方法,请考虑使用AspectJ(请参见下文)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM