session.load()方法如何在不命中数据库的情况下提取数据?

时间:2016-11-25 21:27:03

标签: java hibernate session orm

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

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

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

1 个答案:

答案 0 :(得分:1)

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

考虑一个学生班。许多学生属于同一标准的学校。

这里标准与学生之间产生了一对多的关系。

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

你必须坚持学生对象,如下所示:

student.setStandard(standard);

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

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

因此,hibernate不会访问数据库,它会创建一个代理对象,您将注入您的学生对象。当你在那时打电话给session.save(学生)时,它将被保存。

但假设您使用load()方法加载Standard对象。如果您尝试调用standard.getClassTeacher()之类的任何方法,那么它实际上将命中数据库,如果在db中找不到它,那么它将抛出错误。