一尘不染

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

hibernate

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

    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);

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


阅读 429

收藏
2020-06-20

共1个答案

一尘不染

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

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

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

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

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

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

2020-06-20