我正在使用Spring和Hibernate。我有一个用@Transactional
注释的方法。此方法有两个数据库调用。一次调用将更新表中的数据,另一次调用将根据第一次调用的更新数据从同一个表中检索一些数据。
问题是第一次调用的数据库更改没有立即反映出来。流程出现在使用@Transactional
注释的方法之后,将反映更改。我仍尝试拨打session.flush()
,但没有用。请建议我。
@Transactional
public void method1(){
dao.updateM1();
dao.getData();
}
答案 0 :(得分:2)
你能详细说明你的情景吗?例如:您为 updateM1 和 getData 方法声明了哪些传播级别?
如果您没有为 updateM1 和 getData 方法描述Transactional,则问题是这两种方法都在同一个事务中。因此,在提交事务之前,Hibernate不会更新数据。要解决该问题,您只需描述 updateM1 的交易,如下所示:
@Transactional (propagation = Propagation.REQUIRE_NEW)
public E updateM1() {}
这样,每次调用 updateM1 时都会创建一个新事务。 updateM1完成后,将提交该新事务,并且所有更改都将保留在数据库中。
关于session.flush无效,这里有一个明确的答案:Question about Hibernate session.flush()
答案 1 :(得分:1)
据我所知,在完成交易方法后,只有更改才会反映在数据库中。
但是在这里你要在方法完成之前调用。所以你没有得到更新的结果。
答案 2 :(得分:0)
据我所知,当你在方法上使用@Transaction
注释时。应该在方法调用结束时提交身体逻辑中的任何数据库更改。
答案 3 :(得分:0)
为什么数据库中更新的内容很重要?
考虑持久化上下文中实体的状态。
也许您应该尝试session.refresh()
来刷新实体的状态,但是您的代码不够详细,无法查看它为什么不起作用。
您的update
和get
方法是如何实施的?
答案 4 :(得分:0)
不建议手动调用session.flush()
,我认为你可以将两个调用与dao分成两种不同的服务方法,使它们具有不同的事务传播属性,
@Transactional
public void method1(){
this.updateM1Service();
this.getDataService();
}
@Transactional (propagation = Propagation.REQUIRE_NEW)
public void updateM1Service(){
dao.updateM1();
}
@Transactional
public void getDataService(){
dao.getData();
}