【问题标题】:How does session.load() method of pulls up the data without hitting the database?session.load() 方法如何在不访问数据库的情况下提取数据?
【发布时间】:2016-11-25 21:27:03
【问题描述】:

当我们调用 session.get() 方法时,hibernate 会访问数据库并返回原始对象。

当你调用 session.load() 方法时,它总是会返回一个“代理”对象而不查询数据库。

我的问题是,如果 load() 方法没有命中数据库,那么它如何知道所请求的信息是否在数据库中可用。

【问题讨论】:

  • 只有在您真正尝试阅读后才会这样做。
  • 那么使用 load() 有什么好处呢?我一直在寻找 get() 和 load() 之间的区别,但上下文无处不在。
  • 不,这不是 JPA API,所以请不要这样标记它

标签: java hibernate session orm


【解决方案1】:

假设您有父子关联。例如,有一个主表。您正在将一个对象的引用注入到另一个对象中。

考虑一个学生班级。许多学生属于同一学校。

这里在标准和学生之间生成一对多关系。

现在在保存学生对象时,您将需要标准的持久对象。

您必须按以下方式持久化学生对象:

student.setStandard(standard);

现在,您有了标准对象的主键。你知道这个标准已经存在于数据库中。现在考虑它是一个主表。因此,与其实际访问数据库,不如说已经存在一个对象:

Standard standard = session.load(Standard.class, id);

所以hibernate不会访问数据库,它会创建一个代理对象,你将把它注入到你的学生对象中。当您调用 session.save(student) 时,它将被保存。

但是假设您正在使用 load() 方法加载标准对象。如果您尝试在其上调用任何方法,例如standard.getClassTeacher(),那么它实际上会命中数据库,如果在数据库中找不到它,则会抛出错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-12
    • 1970-01-01
    • 1970-01-01
    • 2013-06-19
    • 1970-01-01
    相关资源
    最近更新 更多