gpt4 book ai didi

java - Hibernate 如何在 session 期间调用 get() 或 load() 方法后准确监视对象

转载 作者:太空宇宙 更新时间:2023-11-04 15:21:09 25 4
gpt4 key购买 nike

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

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

public class User {
private int userId;
private String userName
// getters and setters.
}

假设在数据库中。存在记录

用户 ID -- 1

用户名 -- john

    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

但是在控制台选择查询发生在第 4 行,当我们调用 getUserName() 而不是第 3 行时。是的,我知道使用 load 我们只能得到代理对象。但在第 4 行,我们只调用 POJO getter,但它如何以简单的 java 方式命中数据库选择查询,这是无法理解的。有什么反射(reflect)吗?任何人都可以向我解释它是如何工作的吗?

再次,如果我使用 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 行。好的 get() 命中数据库。但在第 4 行,我们只调用 setter,但它如何在第 5 行事务结束时命中数据库更新查询。

我浏览了源码但不明白。在我看来,它看起来像是反射和事件处理之类的东西。创建了对象或代理对象通过使用反射的 get() 或 load() 方法,然后监视对象状态的变化(如事件处理)。是否有观察者设计模式或其他东西。

如果我的思考方向正确,那么有人可以给我例子或练习链接,因为我对反射(reflection)的了解较少。我也想做类似的事情来监视对象状态。

最佳答案

get() 和 load() 方法之间的主要区别之一

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

我的假设(如果我错了,请纠正我):

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

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

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

//do some other operations…

但是当涉及到 get() 方法时,情况就不同了。它每次都直接从数据库中获取。在这种情况下,它应该首先加载数据(这里无需再考虑),因为在调用 getter 方法时加载数据之前它无法保存一些指针内容(它可能会落入连接架构)。基本上,我个人认为这很贵。

Hibernate 根据对象值而不是对象引用来观察对象状态。但在集合的情况下,hibernate 使用身份。

关于java - Hibernate 如何在 session 期间调用 get() 或 load() 方法后准确监视对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20367652/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com