从API中,我可以看出它与proxy有关。但是我找不到很多关于proxy的信息,也不明白调用session.get和session.load之间的区别。有没有人能给我解释一下,或者把我引到一个参考页面?
谢谢你!!
发布于 2009-03-04 01:51:35
从Hibernate forum
这本书中的Hibernate in Action。很好的读读这个..
按标识符检索对象以下Hibernate代码片段从数据库中检索用户对象:
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()在缓存或数据库中找不到持久对象时,它可能不会抛出异常;异常将在稍后访问代理时抛出。当然,按标识符检索对象不如使用任意查询灵活。
发布于 2009-03-04 02:01:28
至少在nhibernate中,session.Get(id)会从数据库中加载对象,而session.Load(id)只会在不离开服务器的情况下为其创建代理对象。它的工作方式与POCOs (或POJOs :)中的其他延迟加载属性一样。然后,您可以使用此代理作为对对象本身的引用,以创建关系等。
可以把它想象成一个只保存Id的对象,如果您需要它,它将加载其余的Id。如果你只是传递它来创建关系(比如FKs),那么id就是你所需要的。
发布于 2012-06-21 10:18:27
session.load()将始终返回一个“代理”(Hibernate术语),而不会命中数据库。在Hibernate中,proxy是一个具有给定标识符值的对象,它的属性还没有初始化,它看起来就像一个临时的伪对象。如果没有找到行,它将抛出一个ObjectNotFoundException。
session.get()总是命中数据库并返回真正的对象,即表示数据库行的对象,而不是代理。如果未找到行,则返回null。
这些方法的性能也会有所不同。在两个..。
https://stackoverflow.com/questions/608947
复制相似问题