当我们调用session.get()方法时,hibernate会命中数据库并返回原始对象。
当你调用session.load()方法时,它总是返回一个“代理”对象而不查询数据库。
我的问题是,如果load()方法没有访问数据库,那么它如何知道所请求的信息是否在数据库中可用。
答案 0 :(得分:1)
假设您有父子关联。例如,有一个主表。您正在将一个对象的引用注入到其他对象中。
考虑一个学生班。许多学生属于同一标准的学校。
这里标准与学生之间产生了一对多的关系。
现在,在保存学生对象时,您将需要标准的持久对象。
你必须坚持学生对象,如下所示:
student.setStandard(standard);
现在,您拥有标准对象的主键。而且你知道这个标准已经存在于数据库中。现在考虑它是一个主表。因此,实际上已经存在一个对象,而不是实际访问数据库:
Standard standard = session.load(Standard.class, id);
因此,hibernate不会访问数据库,它会创建一个代理对象,您将注入您的学生对象。当你在那时打电话给session.save(学生)时,它将被保存。
但假设您使用load()方法加载Standard对象。如果您尝试调用standard.getClassTeacher()之类的任何方法,那么它实际上将命中数据库,如果在db中找不到它,那么它将抛出错误。