【问题标题】:Hibernate 5 return a manageable objectHibernate 5 返回一个可管理的对象
【发布时间】:2015-12-08 14:46:27
【问题描述】:

我有一个 Spring MVC web-app,这个后端有所有 RESTful web-services,所以我们有一个 entity.jar、一个 dao.jar、services.jar 和 web-services.war。

在 DAO 层,我之前和老板讨论过,当我们保存或更新时,我们希望返回一个可管理的对象,并且可以对其进行延迟加载。

我们确实有一个 Postgres SQL 数据库,主键很长,并且由 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)中调用。业务服务显然是事务和会话开始的地方。

谢谢!

【问题讨论】:

    标签: hibernate postgresql spring-mvc


    【解决方案1】:

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

    1.在一些查询执行之前

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

    3.from Session.flush()

    这意味着 flush() 将在您的事务结束时被调用。另外,如果你的一级缓存没有被使用太多,那么就不需要调用flush()

    refresh() 方法在使用数据库触发器初始化对象的某些属性时很有用,即重新加载对象及其所有集合。因此,如果您在 commit() 之前使用 refresh(),则所有手动更改都将消失。

    Thisthis also 会很有帮助。

    Hibernate reference

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-06-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-01
      相关资源
      最近更新 更多