【问题标题】:How does Hibernate keep track of Detached and Persistent object from different SessionsHibernate 如何跟踪来自不同 Session 的 Detached 和 Persistent 对象
【发布时间】:2015-01-27 21:56:46
【问题描述】:

据我所知,Hibernate 会一直跟踪持久对象直到 session.close()。 在 session.close() 之后,持久对象成为分离对象,hibernate 不知道这个对象。

我对以下两个代码示例有些困惑。

在第一个代码示例中:- 只打开一个会话并在 session.close() 之后持久化一个对象,这个对象变得分离并且我们不能执行更新(例如 object.setName() )。

但在第二个代码示例中,我们使对象分离并在对象上执行 setter,然后再次打开会话并更新此分离的对象。但是第二个会话如何知道上述设置器值或更新..

package objectState;

import org.hibernate.Session;
import org.hibernate.Transaction;

import HibernateUtils.HibernateUtils;

public class ObjectStateTest {

    public static void main(String[] args) 
    {

        UserDetails user = new UserDetails();  // Transient Object
        user.setUserName("Test User");

        Session session = HibernateUtils.getFactory().openSession();
        Transaction tx = session.beginTransaction();

        session.save(user);                  //Persistent Object
        user.setUserName("updated user");   //HB Keep Track Persistent Object & Perform Update if any change

        tx.commit();
        session.close();

        user.setUserName("update after session closed");  // Detached Object (HB keep track Object until session.close() )
    }

}

DetachedToPersistent.java 

    package objectState;

    import org.hibernate.Session;
    import org.hibernate.Transaction;

    import HibernateUtils.HibernateUtils;

    public class DetachedToPersistent {

        public static void main(String[] args) {

            UserDetails user = new UserDetails();  //Transient Object
            user.setUserName("Test User");

            Session session = HibernateUtils.getFactory().openSession();
            Transaction tx = session.beginTransaction();

            session.save(user);  //Persistent Object

            tx.commit();
            session.close();

            user.setUserName("update Detached User");  //Detached Object

            session = HibernateUtils.getFactory().openSession();
            tx = session.beginTransaction();

            session.update(user);  // Persistent Detached Object

            tx.commit();
            session.close();

        }

    }

可能是我理解有误,请指出我的错误..

谢谢 :)

【问题讨论】:

    标签: java hibernate jakarta-ee orm hibernate-mapping


    【解决方案1】:

    首先,我建议您阅读一些关于entity state transitions 的内容。

    1. 附加对象时,持久性上下文使用automatic dirty checking mechanism 检测更改。

    2. 当对象分离时(因为加载它的 Session 已关闭),您可以:

      • 通过调用session.merge(entity) 来合并实体,这会获取一个新副本并使用合并实体对其进行更新。
      • 通过调用旧版session.update(entity) 附加实体

    merge method is preferred to update,所以尽可能使用合并。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-15
      • 2010-09-06
      • 1970-01-01
      • 1970-01-01
      • 2018-09-01
      • 1970-01-01
      相关资源
      最近更新 更多