当前位置: 首页 > 面试题库 >

Session.update和HibernateTemplate.merge进行的Hibernate更新之间的区别

费秦迟
2023-03-14
问题内容

我看到了更新操作的类型:首先:

    getHibernateTemplate().execute(new HibernateCallback() {
        public Object doInHibernate(Session session) {  
            session.flush();
            session.setCacheMode(CacheMode.IGNORE);
            SomeObject ss = (SomeObject) session.get(SomeObject.class, id);
            long next = ss.getAndIncrement();
            session.update(ss);
            session.flush();
            return null;
        }
    });

其次

    SomeObject ss = loadSomeObject(); 
    long next = ss.getAndIncrement();
    getHibernateTemplate.merge(ss);

这两种方法的作用相同。我想知道哪个更好更安全,为什么。谢谢。


问题答案:

在第一个操作中,对象ss 连接 到会话。在第二次手术中它是 分开的
。因此,如果您有附加的对象,则可以使用update。如果您有一个分离的对象,则使用合并,该合并 首先将 对象 附加 到会话,然后进行
更新

编辑:有关附加的(持久的)和分离的对象的信息:

Hibernate定义并支持以下对象状态:

瞬态 -如果对象只是使用new运算符实例化的,则该对象是瞬态的,并且它与Hibernate
Session无关。它在数据库中没有持久性表示形式,也没有分配标识符值。如果应用程序不再拥有引用,则瞬态实例将被垃圾收集器破坏。使用Hibernate会话使对象持久化(并让Hibernate处理此转换需要执行的SQL语句)。

持久
-持久实例在数据库中具有表示形式和标识符值。它可能只是被保存或加载,但是根据定义,它在Session范围内。当工作单元完成时,Hibernate将检测对处于持久状态的对象所做的任何更改,并将该状态与数据库同步。当应将对象设置为瞬态时,开发人员不会执行手动的UPDATE语句或DELETE语句。

已分离
-分离的实例是已持久的对象,但其会话已关闭。当然,对对象的引用仍然有效,并且分离的实例甚至可以在此状态下进行修改。分离的实例可以在稍后的时间点重新附加到新的Session,使其(以及所有修改)再次持久。此功能为需要用户思考时间的长时间运行的工作单元启用了编程模型。我们称它们为应用程序交易,即从用户角度来看的一个工作单元。



 类似资料:
  • 问题内容: 但没人回答我的下一个问题。经典的hibernate方法使用和JPA 实现之间有什么区别?我听说此JPA实现使用并像包装器一样工作,这是真的吗? 问题答案: 确实。 JPA只是一个API,允许您从使用的持久层中进行抽象。Hibernate提供了充当接口的实现,它使用与Hibernate 相同的基础方法。 这个想法是,例如,您可以将实现切换到Eclipse Link,而不必更改任何源代码。

  • 本文向大家介绍JDBC和Hibernate之间的区别,包括了JDBC和Hibernate之间的区别的使用技巧和注意事项,需要的朋友参考一下 JDBC是Java数据库连接的首字母缩写。它用于将您的应用程序连接到数据库和事务。它是一个开源Java api。   Hibernate还用于将您的应用程序连接到数据库并执行与数据库相关的事务,但是使用不同的方法。它有一个对象关系库,该库将java的对象映射到

  • 问题内容: 我的问题很简单:Spring jdbcTemplate和Hibernate之间的主要区别是什么?我们应该考虑使用其中一种的主要原因是什么? 谢谢 问题答案: Hibernate是一个非常庞大的解决方案,具有数据持久性和ORM(包括JPA实现)。另外,还定义了许多方法来管理Hibernate中的实体,如何持久化,事务等。在Hibernate中,您可以使用SQL,HQL或Java批注。JD

  • 问题内容: 已经在FlushMode上通过了hibernateapi规范,但没有得到确切的区别。所以请帮忙。 问题答案: 始终表示在对集合运行任何查询或针对数据库重新运行该查询之前。对于自动,我假设幕后有一些“魔术”,它知道大多数数据不会经常更改,因此您不必总是刷新。它还影响交易期间可能发生的频率。我之所以说是可能的,是因为某些消息源说设置flushmode只是hibernate的提示- 但请参见

  • 问题内容: 我正在考虑使用Hibernate保留我的模型。我似乎找到两种方法来做到这一点。 第一个使用,例如: 另一个使用带注释的子类/接口扩展: 另外,有时我看不到注释。有什么区别? 我没有找到“何时/应该使用前一种或后一种方法”的答案,因此我可以得到解释吗? 问题答案: 只是您可以在Spring docs网站上找到这些注释的描述。 很快,要回答您的问题,它们之间的区别是它们用于不同的目的。 用