Hibernate 5返回一个可管理的对象

时间:2015-12-08 14:46:28

标签: hibernate postgresql spring-mvc

我有一个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)调用。业务服务显然是交易和会话开始的地方。

谢谢!

1 个答案:

答案 0 :(得分:2)

  

有时,Session会执行将JDBC连接状态与内存中保存的对象状态同步所需的SQL语句。此过程称为刷新,默认情况下发生在以下几点:

     

1.在执行某些查询之前

     

2.from org.hibernate.Transaction.commit()

     

3.来自Session.flush()

这意味着将在您的交易结束时调用flush()。此外,如果您的第一级缓存未使用不太多,则无需拨打flush()

当数据库触发器用于初始化对象的某些属性,即重新加载对象及其所有集合时,

refresh()方法很有用。因此,如果您在refresh()之前使用commit(),那么您的所有手动更改都将消失。

Thisthis also会有所帮助。

Hibernate reference