Java Hibernate如何跟踪来自不同会话的分离和持久对象

Java Hibernate如何跟踪来自不同会话的分离和持久对象,java,hibernate,jakarta-ee,orm,hibernate-mapping,Java,Hibernate,Jakarta Ee,Orm,Hibernate Mapping,据我所知,Hibernate在session.close()之前一直跟踪持久对象。 session.close()之后,持久对象变成分离对象,hibernate不知道这个对象 我在下面的两个代码示例中有一些混淆 在第一个代码示例中:-仅打开一个会话,并在会话后保留一个对象。close()此对象被分离,我们无法执行更新(例如object.setName()) 但在第二个代码示例中,我们将对象分离并对对象执行setter,然后再次打开一个会话并更新这个分离的对象。但是第二个会话如何知道上述sette

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

我在下面的两个代码示例中有一些混淆

在第一个代码示例中:-仅打开一个会话,并在会话后保留一个对象。close()此对象被分离,我们无法执行更新(例如object.setName())

但在第二个代码示例中,我们将对象分离并对对象执行setter,然后再次打开一个会话并更新这个分离的对象。但是第二个会话如何知道上述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();

        }

    }
4.可能是我弄错了,请指出我的错误


谢谢:)

首先,我建议你读一点关于

  • 当附加对象时,持久性上下文将使用来检测更改

  • 当对象分离时(因为加载它的会话已关闭),您可以:

    • 通过调用
      会话来合并实体。merge(entity)
      ,该会话将获取新的新副本并使用合并实体更新它
    • 通过调用遗留
      会话来附加实体。更新(实体)
  • 因此,尽可能使用合并