我有一个Spring MVC网络应用程序,其后端具有所有RESTful Web服务,因此我们有一个entity.jar,一个dao.jar,和services.jar,以及web-services.war。< / p>
在DAO层,在我们保存或更新之前,我已经和我的老板讨论了这个问题,我们希望返回一个被管理的对象,并且可以对其进行延迟加载。
我们有一个Postgres SQL数据库,主键是long,由Postgres中的序列设置。
所以,我有以下两种方法:
@Override
public MyEntity create(MyEntity myObject)
{
this.sessionFactory.getCurrentSession().save(myObject);
this.sessionFactory.getCurrentSession().flush();
this.sessionFactory.getCurrentSession().refresh(myObject);
return myObject;
}
@Override
public MyEntity update(MyEntity myObject)
{
this.sessionFactory.getCurrentSession().update(myObject);
this.sessionFactory.getCurrentSession().flush();
this.sessionFactory.getCurrentSession().refresh(myObject);
return myObject;
}
我的老板非常技术性,并且自己查看了这些方法,看看他们都做了什么。他认为我们不需要刷新和刷新。但是我所有的单元测试表明这两种方法一直运行良好。
所以,我问你使用这两种方法的方式有什么问题吗? 这些将从任何业务服务(services.jar)调用。业务服务显然是交易和会话开始的地方。
谢谢!
答案 0 :(得分:2)
有时,Session会执行将JDBC连接状态与内存中保存的对象状态同步所需的SQL语句。此过程称为刷新,默认情况下发生在以下几点:
1.在执行某些查询之前
2.from org.hibernate.Transaction.commit()
3.来自Session.flush()
这意味着将在您的交易结束时调用flush()。此外,如果您的第一级缓存未使用不太多,则无需拨打flush()
。
refresh()
方法很有用。因此,如果您在refresh()
之前使用commit()
,那么您的所有手动更改都将消失。