Java 在会话期间调用get()或load()方法后,Hibernate如何精确监视对象

Java 在会话期间调用get()或load()方法后,Hibernate如何精确监视对象,java,hibernate,reflection,Java,Hibernate,Reflection,我知道当我们调用get或load方法时,hibernate使用反射调用默认构造函数来创建一个对象。但我无法理解hibernate如何在会话期间监视该对象 假设我有一个表示数据库中实体的POJO类 public class User { private int userId; private String userName // getters and setters. } 假设在DB中。 创纪录的礼物 用户标识-1 用户名-约翰 Session session

我知道当我们调用get或load方法时,hibernate使用反射调用默认构造函数来创建一个对象。但我无法理解hibernate如何在会话期间监视该对象

假设我有一个表示数据库中实体的POJO类

public class User {
    private int userId;
    private String userName
    // getters and setters.
}
假设在DB中。 创纪录的礼物

用户标识-1

用户名-约翰

    Session session = sessionfactory.openSession(); // Line 1
    Transaction tx = session.beginTransaction();    //Line 2

    User user = (User) session.load(User.class,1); //Line 3
    user.getUserName(); //Line 4

    tx.commit(); //Line 5
    session.close(); //Line 6   
但在控制台上,当我们调用getUserName时,select查询发生在第4行,而不是第3行。是的,我知道使用load只能得到代理对象。但是在第4行,我们只调用POJO getter,但是它是如何以简单的java方式命中数据库select查询的,这是不可理解的。有没有什么反映。有人能解释一下它到底是怎么工作的吗

同样,如果我使用get方法获取对象

    Session session = sessionfactory.openSession(); // Line 1
    Transaction tx = session.beginTransaction();    //Line 2
    User user = (User) session.get(User.class,1); //Line 3
    user.setUserName("mark"); //Line 4
    tx.commit(); //Line 5
    session.close(); //Line 6   
选择查询发生在第3行。好的,点击数据库。但是在第4行,我们只调用setter,但它如何在第5行的事务结束时点击数据库更新查询

我查阅了资料,但不明白。 在我看来,它看起来像是反射和事件处理之类的东西 通过使用反射获取或加载,然后监视对象状态的变化,如事件处理。是否存在观察者设计模式或其他模式

如果我想的方向是正确的,那么请有人给我举个例子或链接来练习,因为我对反思的知识较少。我还想做类似的事情来监视对象状态

get和load方法之间的关键区别之一

load方法将首先检查会话级缓存中的实体。如果找到该实体,则该实体将从缓存中返回,否则它将查询数据库并将其返回给客户端。但是get方法将直接从数据库中获取

public class User {
    private int userId;
    private String userName
    // getters and setters.
}
如果我错了,请纠正我的假设:

第3行表示您需要一个特定的对象。但这并不能保证你会使用它,所以他们可能已经为内存管理实现了延迟获取之类的东西。如果您不使用它,那么您就是在浪费一个实例。但从大局来看,这可能是一个理性的设计

User user = (User) session.load(User.class,1); //Line 3

//do some other operations…
但当涉及到获取方法时,情况就不同了。它每次都直接从数据库获取数据。在这种情况下,它应该首先加载数据,因为在调用getter方法加载数据之前,它无法保存一些指针内容,它可能会落入连接的体系结构中。基本上,这是昂贵的,因为我个人认为


Hibernate根据对象值而不是对象引用来观察对象状态。但对于集合,hibernate使用标识。

谢谢您的回复。我知道load和get之间的区别,但我的问题是hibernate会话如何观察该对象,以及当对象状态更改时,hibernate如何执行某些任务。