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相关联.方法返回,必须提交事务.我没有看到这种情况发生.
一旦"顶级"@Transactional方法完成(即从你的servlet调用的方法),那么应该提交事务,并且默认的Hibernate行为是在提交时刷新.
听起来好像发生了奇怪的事情,你应该做一些调查.
调查您的日志,特别是我会在事务管理器上将日志记录级别设置为DEBUG,以确切了解事务管理器正在执行的操作.
另外,为hibernate设置登录(将show_sql设置为true):当发生刷新时,这将输出到System.out,这可能会给你一些线索.
如果您发现任何有趣的事情,请回报.
惊奇我认为这是可以解决这种确切情况的确切答案,FlushMode.ALWAYS每当您需要在每次交易后完全刷新会话限制时,您都可以使用特定的 DAO。
@Autowired
private SessionFactory sessionFactory;
@Before
public void myInitMethod(){
sessionFactory.getCurrentSession().setFlushMode(FlushMode.ALWAYS);
}
Run Code Online (Sandbox Code Playgroud)
ALWAYS 冲洗模式不是可取的,因为它很昂贵,但是根据您的需要,您可以针对不同的要求使用不同的冲洗模式多个会话工厂。
| 归档时间: |
|
| 查看次数: |
24568 次 |
| 最近记录: |