spring-hibernate事务 - 更改不反映?

问题描述:

我正在使用Spring和Hibernate。我有一个注释为@Transactional的方法。此方法有两个数据库调用。一次调用将更新表中的数据,另一次调用将根据第一次调用的更新数据从同一表中检索一些数据。 问题是第一次调用的数据库更改没有立即反映出来。在用@Transactional注释的方法流出之后,会反映更改。我仍然尝试拨打session.flush()但没有用。请建议我。spring-hibernate事务 - 更改不反映?

@Transactional 
public void method1(){ 
dao.updateM1(); 
dao.getData(); 
} 

据我所知在交易方法完成后,只有变化会反映在数据库中。

但是,您在此方法完成之前调用。因此,您没有得到更新的结果。

+0

@ user755806您是否了解问题 – PSR 2013-05-09 13:36:33

据我所知,当你使用@Transaction注解的方法。在方法调用结束时,应该在您的主体逻辑中更改任何数据库更改。

为什么数据库中更新的内容很重要?

想想实体在持久化上下文中的状态。

也许你应该试试session.refresh()刷新实体的状态,但是你的代码不够详细,看看为什么它不起作用。

您的updateget方法是如何实施的?

你能详细说明你的情况吗?例如:你声明什么传播级别为updateM1getData方法?

在情况下,你没有说明交易的updateM1,并的getData方法,问题是这两种方法都是在一个相同的事务。因此,直到事务提交之前,Hibernate才会更新数据。为了解决这个问题,你刚才描述的交易,如下面updateM1

@Transactional (propagation = Propagation.REQUIRE_NEW) 
public E updateM1() {} 

就这样,一个新的交易将创建的每个updateM1被调用时。 updateM1完成后,该新事务将被提交,并且所有更改都将保留在数据库中。

关于调用Session.flush不工作,这里是一个明确的答案:Question about Hibernate session.flush()

它不建议手动调用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(); 
}