2016-11-25 54 views
0

当我们调用session.get()方法时,hibernate将命中数据库并返回原始对象。session.load()方法如何在不触及数据库的情况下提取数据?

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

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

+1

直到你真的尝试阅读它。 –

+0

那么使用load()有什么好处?我正在寻找get()和load()之间的区别,但上下文就是这个地方。 – sNegi

+0

不,这不是JPA API,所以请不要将它标记为 –

回答

1

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

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

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

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

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

student.setStandard(standard); 

现在,你有标准对象的主键。而且你知道这个标准已经存在于数据库中。现在考虑它是一个主表。因此,而不是实际进入数据库,你这是傻瓜已经有一个目标:

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

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

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

相关问题