0

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

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

5 回答 5

2

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

如果您没有为updateM1getData方法描述 Transactional ,那么问题是这两种方法都在同一个事务中。因此,Hibernate 在事务提交之前不会更新数据。要解决该问题,您只需将updateM1的事务描述如下:

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

这样,每次调用updateM1时都会创建一个新事务。当 updateM1 完成时,该新事务被提交,所有更改都将保存在数据库中。

关于 session.flush 不起作用,这里有一个明确的答案:关于 Hibernate session.flush()的问题

于 2013-05-09T14:23:22.223 回答
1

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

但是在这里你是在方法完成之前调用的。所以你没有得到更新的结果。

于 2013-05-09T13:30:52.490 回答
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();
}
于 2013-05-09T14:51:32.290 回答
0

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

而是考虑实体在持久性上下文中的状态。

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

你的updateget方法是如何实现的?

于 2013-05-09T13:38:39.263 回答
0

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

于 2013-05-09T13:35:32.530 回答