当前位置:  开发笔记 > 运维 > 正文

Hibernate:session.get和session.load之间的区别

如何解决《Hibernate:session.get和session.load之间的区别》经验,为你挑选了3个好方法。

从API,我可以看到它与代理有关.但我找不到很多关于代理的信息,也不理解调用session.get和调用之间的区别session.load.有人可以解释或指导我参考页面吗?

谢谢!!



1> duffymo..:

来自Hibernate论坛:

这来自Hibernate in Action一书.好的人读了这个..


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

User user = (User) session.get(User.class, userID);

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

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()在缓存或数据库中找不到持久对象时,它可能不会抛出异常; 访问代理时,将抛出异常.当然,通过标识符检索对象不像使用任意查询那样灵活.


SessionDget的JavaDoc说:用给定的标识符返回给定实体类的持久化实例,如果没有这样的持久化实例则返回null.(如果实例或实例的代理已经与会话关联,则返回该实例或代理.)因此,书中的部分说:"另一方面,get()永远不会返回代理." 是不正确的.
非常感谢!对我来说,钱部分是:"如果load()无法在缓存或数据库中找到对象,则抛出异常.如果找不到该对象,则get()方法返回null."

2> Jorge Alves..:

好吧,至少在nhibernate中,session.Get(id)将从数据库加载对象,而session.Load(id)只创建一个代理对象而不离开你的服务器.与POCO(或POJO :)中的所有其他延迟加载属性一样工作.然后,您可以使用此代理作为对象本身的引用来创建关系等.

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



3> Vishal Sharm..:

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

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

使用这些方法的性能也会产生差异.两个之间......

推荐阅读
牛尾巴2010
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有