首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Hibernate: session.get和session.load的区别

Hibernate: session.get和session.load的区别
EN

Stack Overflow用户
提问于 2009-03-04 01:36:58
回答 8查看 99.6K关注 0票数 88

从API中,我可以看出它与proxy有关。但是我找不到很多关于proxy的信息,也不明白调用session.getsession.load之间的区别。有没有人能给我解释一下,或者把我引到一个参考页面?

谢谢你!!

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2009-03-04 01:51:35

Hibernate forum

这本书中的Hibernate in Action。很好的读读这个..

按标识符检索对象以下Hibernate代码片段从数据库中检索用户对象:

代码语言:javascript
复制
User user = (User) session.get(User.class, userID);

get()方法是特殊的,因为标识符唯一地标识一个类的单个实例。因此,应用程序通常使用标识符作为持久对象的方便句柄。按标识符检索可以在检索对象时使用缓存,如果对象已缓存,则可避免数据库命中。Hibernate还提供了load()方法:

代码语言:javascript
复制
User user = (User) session.load(User.class, userID);

load()方法比较旧;由于用户请求,将get()添加到Hibernate的API中。区别是微不足道的:

如果load()在缓存或数据库中找不到对象,就会抛出异常。load()方法从不返回null。如果找不到对象,则get()方法返回null。

load()方法可以返回一个代理,而不是一个真正的持久实例。代理是一个占位符,它在第一次访问真实对象时触发它的加载;另一方面,get()从不返回代理。在get()和load()之间进行选择很容易:如果您确定持久对象存在,而不存在则被认为是异常的,那么load()是一个很好的选择。如果您不确定是否存在具有给定标识符的持久实例,请使用get()并测试返回值以查看它是否为null。使用load()还有另一个含义:应用程序可以检索对持久实例的有效引用(代理),而无需命中数据库来检索其持久状态。因此,当load()在缓存或数据库中找不到持久对象时,它可能不会抛出异常;异常将在稍后访问代理时抛出。当然,按标识符检索对象不如使用任意查询灵活。

票数 117
EN

Stack Overflow用户

发布于 2009-03-04 02:01:28

至少在nhibernate中,session.Get(id)会从数据库中加载对象,而session.Load(id)只会在不离开服务器的情况下为其创建代理对象。它的工作方式与POCOs (或POJOs :)中的其他延迟加载属性一样。然后,您可以使用此代理作为对对象本身的引用,以创建关系等。

可以把它想象成一个只保存Id的对象,如果您需要它,它将加载其余的Id。如果你只是传递它来创建关系(比如FKs),那么id就是你所需要的。

票数 15
EN

Stack Overflow用户

发布于 2012-06-21 10:18:27

session.load()将始终返回一个“代理”(Hibernate术语),而不会命中数据库。在Hibernate中,proxy是一个具有给定标识符值的对象,它的属性还没有初始化,它看起来就像一个临时的伪对象。如果没有找到行,它将抛出一个ObjectNotFoundException。

session.get()总是命中数据库并返回真正的对象,即表示数据库行的对象,而不是代理。如果未找到行,则返回null。

这些方法的性能也会有所不同。在两个..。

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/608947

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档