从API,我可以看到它与代理有关.但我找不到很多关于代理的信息,也不理解调用session.get
和调用之间的区别session.load
.有人可以解释或指导我参考页面吗?
谢谢!!
来自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()在缓存或数据库中找不到持久对象时,它可能不会抛出异常; 访问代理时,将抛出异常.当然,通过标识符检索对象不像使用任意查询那样灵活.
好吧,至少在nhibernate中,session.Get(id)将从数据库加载对象,而session.Load(id)只创建一个代理对象而不离开你的服务器.与POCO(或POJO :)中的所有其他延迟加载属性一样工作.然后,您可以使用此代理作为对象本身的引用来创建关系等.
可以把它想象成一个只保留Id的对象,如果你需要它,它将加载其余的.如果您只是传递它来创建关系(如FK),那么id就是您所需要的.
session.load()将始终返回"代理"(Hibernate术语)而不会访问数据库.在Hibernate中,proxy是一个具有给定标识符值的对象,它的属性尚未初始化,它看起来就像一个临时假对象.如果找不到行,则会抛出ObjectNotFoundException.
session.get()总是命中数据库并返回真实对象,一个表示数据库行的对象,而不是代理.如果找不到行,则返回null.
使用这些方法的性能也会产生差异.两个之间......