Hibernate Session刷新行为[和Spring @Transactional]

Eug*_*neP 16 java session spring hibernate

我在一个网络应用程序中使用Spring和Hibernate,

SessionFactory被注入到DAO bean中,然后这个DAO通过webservicecontext在Servlet中使用.

DAO方法是事务性的,在我使用的方法之一... getCurrentSession().save(myObject);

一个servlet使用传递的对象调用此方法.

更新似乎不会立即刷新,大约需要5秒才能看到数据库中的更改.调用DAO更新方法的servlet方法需要几分之一秒才能完成.

DAO的@Transactional方法完成后,可能不会发生冲洗?它似乎不是一个规则 [我已经看到了].

那么问题是:在每个DAO方法之后如何强制会话刷新?这可能不是一件好事,但谈到Service层,一些方法必须以立即刷新结束,而Hibernate Session行为是不可预测的.

那么如何保证我的@Transactional方法在该方法代码的最后一行之后保留所有更改?

 getCurrentSession().flush() is the only solution?
Run Code Online (Sandbox Code Playgroud)

ps我在某处看到@Transactional与DB Transaction相关联.方法返回,必须提交事务.我没有看到这种情况发生.

Dic*_*ood 5

一旦"顶级"@Transactional方法完成(即从你的servlet调用的方法),那么应该提交事务,并且默认的Hibernate行为是在提交时刷新.

听起来好像发生了奇怪的事情,你应该做一些调查.

调查您的日志,特别是我会在事务管理器上将日志记录级别设置为DEBUG,以确切了解事务管理器正在执行的操作.

另外,为hibernate设置登录(将show_sql设置为true):当发生刷新时,这将输出到System.out,这可能会给你一些线索.

如果您发现任何有趣的事情,请回报.


com*_*mit 5

惊奇我认为这是可以解决这种确切情况的确切答案,FlushMode.ALWAYS每当您需要在每次交易后完全刷新会话限制时,您都可以使用特定的 DAO。

@Autowired
private SessionFactory sessionFactory;

@Before
public void myInitMethod(){
  sessionFactory.getCurrentSession().setFlushMode(FlushMode.ALWAYS);
}
Run Code Online (Sandbox Code Playgroud)

ALWAYS 冲洗模式不是可取的,因为它很昂贵,但是根据您的需要,您可以针对不同的要求使用不同的冲洗模式多个会话工厂。