Java spring hibernate事务-更改未反映?

Java spring hibernate事务-更改未反映?,java,spring,hibernate,Java,Spring,Hibernate,我正在使用Spring和Hibernate。我有一个用@Transactional注释的方法。此方法有两个数据库调用。一个调用将更新表中的数据,另一个调用将根据第一个调用的更新数据从同一个表中检索一些数据。 问题是第一次调用的数据库更改没有立即反映出来。在流从方法中出来后,将反映更改,该方法用@Transactional注释。我仍然尝试调用session.flush(),但没有用。请推荐我 @Transactional public void method1(){ dao.updateM1();

我正在使用Spring和Hibernate。我有一个用
@Transactional
注释的方法。此方法有两个数据库调用。一个调用将更新表中的数据,另一个调用将根据第一个调用的更新数据从同一个表中检索一些数据。 问题是第一次调用的数据库更改没有立即反映出来。在流从方法中出来后,将反映更改,该方法用
@Transactional
注释。我仍然尝试调用
session.flush()
,但没有用。请推荐我

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

据我所知,在事务处理方法完成后,只有更改才会反映在数据库中


但是这里您是在方法完成之前调用的。因此您不会得到更新的结果。

据我所知,在事务方法完成之后,只有更改会反映在数据库中


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

据我所知,当您在方法上使用
@Transaction
注释时。身体逻辑中的任何数据库更改都应该在方法调用结束时提交。

据我所知,当您在方法上使用
@Transaction
注释时。身体逻辑中的任何数据库更改都应该在方法调用结束时提交。

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

请考虑持久性上下文中实体的状态

也许您应该尝试
session.refresh()
来刷新实体的状态,但是您的代码不够详细,无法了解它为什么不起作用


您的
更新
获取
方法是如何实现的?

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

请考虑持久性上下文中实体的状态

也许您应该尝试
session.refresh()
来刷新实体的状态,但是您的代码不够详细,无法了解它为什么不起作用


您的
更新
获取
方法是如何实现的?

您能详细介绍一下您的场景吗?例如:您为updateM1getData方法声明了什么传播级别

在这种情况下,您没有描述updateM1getData方法的事务性,问题是两个方法都在同一个事务中。因此,在提交事务之前,Hibernate不会更新数据。为了解决这个问题,您只需描述updateM1的事务,如下所示:

@Transactional (propagation = Propagation.REQUIRE_NEW)
public E updateM1() {}
这样,每次调用updateM1时都会创建一个新事务。当updateM1完成时,新事务将被提交,所有更改都将保留在数据库中


关于session.flush不工作,这里有一个明确的答案:

您能详细说明一下您的场景吗?例如:您为updateM1getData方法声明了什么传播级别

在这种情况下,您没有描述updateM1getData方法的事务性,问题是两个方法都在同一个事务中。因此,在提交事务之前,Hibernate不会更新数据。为了解决这个问题,您只需描述updateM1的事务,如下所示:

@Transactional (propagation = Propagation.REQUIRE_NEW)
public E updateM1() {}
这样,每次调用updateM1时都会创建一个新事务。当updateM1完成时,新事务将被提交,所有更改都将保留在数据库中


关于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();
}

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

@用户755806您是否理解problem@user755806你了解这个问题吗