java - Hibernate 如何跟踪来自不同 session 的分离对象和持久对象

标签 java hibernate jakarta-ee orm hibernate-mapping

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

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

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

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

        }

    }

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

谢谢:)

最佳答案

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

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

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

    • 通过调用 session.merge(entity) 合并实体,获取新的副本并使用合并实体更新它。
    • 通过调用旧版 session.update(entity) 附加实体

merge method is preferred to update ,因此请尽可能使用合并。

关于java - Hibernate 如何跟踪来自不同 session 的分离对象和持久对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27202235/

相关文章:

java - 在独立的 Java 控制台应用程序中托管 JSON REST Web 服务

java - 无法在 Piccolo 2D 中拉伸(stretch)零矩形?

java - 使用 Quarkus 和 PanacheRepository 更新实体数据不起作用

jakarta-ee - 来自 IBM WebSphere Application Server 上的 WebJars 的静态资源不可见

java - 按钮自动点击?

java - 解码时 Jaxb 和对象类不从 Xml 中获取值

java - Spring Boot不会在MySQL中创建表

java - 优化 hibernate criteria 查询变得更加动态

java - EJB配置异常: Bean class for EJB not found

java - 使用 JSP/Servlet 在网页上显示 Excel 工作表?