当我们调用session.get()方法时,hibernate将命中数据库并返回原始对象。session.load()方法如何在不触及数据库的情况下提取数据?
当您调用session.load()方法时,它将始终返回一个“代理”对象而不查询数据库。
我的问题是如果load()方法没有命中数据库,那么它如何知道请求的信息是否在数据库中可用。
当我们调用session.get()方法时,hibernate将命中数据库并返回原始对象。session.load()方法如何在不触及数据库的情况下提取数据?
当您调用session.load()方法时,它将始终返回一个“代理”对象而不查询数据库。
我的问题是如果load()方法没有命中数据库,那么它如何知道请求的信息是否在数据库中可用。
假设你有父子关联。例如,有一个主表。您正在将一个对象的引用注入其他对象。
考虑一个学生课。许多学生属于同一个学校标准。
这里标准和学生之间会产生一对多的关系。
现在,当保存学生对象时,您将需要标准的持久对象。
你必须坚持学生对象,如下:
student.setStandard(standard);
现在,你有标准对象的主键。而且你知道这个标准已经存在于数据库中。现在考虑它是一个主表。因此,而不是实际进入数据库,你这是傻瓜已经有一个目标:
Standard standard = session.load(Standard.class, id);
,因为Hibernate不会碰到数据库,它会创建将在您的学生对象注入一个代理对象。当你在那个时候会打电话给session.save(学生)时,它将被保存。
但是,假设您使用load()方法加载标准对象。如果你会尝试调用像standard.getClassTeacher()那样的任何方法,那么它实际上会碰到数据库,如果它在db中找不到,那么它会抛出错误。
直到你真的尝试阅读它。 –
那么使用load()有什么好处?我正在寻找get()和load()之间的区别,但上下文就是这个地方。 – sNegi
不,这不是JPA API,所以请不要将它标记为 –