Hibernate Get()函数和Load函数有什么区别?什么时候首选?
答案 0 :(得分:2)
load()
将返回数据库中行或对象的代理。它将抛出ObjectNotFoundException
。它永远不会返回null
。
get()
表示数据库中的实际行,因此它不是代理,如果未找到则不会抛出异常,但会返回null
。
答案 1 :(得分:1)
get和load方法之间的区别 以下是Hibernate中get和load方法之间的一些区别。
在会话缓存中找不到对象时的行为 除了性能之外,这是get和load之间的另一个区别,值得记住。如果在缓存和数据库中找不到对象,则Hibernate会话类的get方法返回null,而如果在缓存和数据库上找不到对象但是从不返回null,则load()方法抛出ObjectNotFoundException。
数据库命中 Get方法始终命中数据库,而load()方法可能并不总是命中数据库,具体取决于调用的方法。
代理 Get方法永远不会返回代理,它返回null或完全初始化的Object,而load()方法可能返回代理,这是具有ID的对象,但没有初始化其他属性,这是懒惰地初始化。如果您只是使用返回的对象来创建关系,并且只需要Id,则可以使用load()。
性能 到目前为止,在我看来,get和load之间最重要的区别。如果Object不在缓存上但存在于Database上,则get方法将返回一个完全初始化的对象,这可能涉及基于对象关系映射的多次往返数据库,而Hibernate的load()方法可以返回可以初始化的代理访问非标识符方法时的需求(延迟初始化)。由于上述原因,使用load方法会导致性能略有提升,但有一点需要注意,如果数据库中不存在相应的行,则代理对象将在以后抛出ObjectNotFoundException,而不是立即失败,因此不会出现失败的快速行为。
加载方法存在于用户请求中添加的get方法之前。
答案 2 :(得分:0)
session.load()
它将始终返回“代理”(Hibernate术语)而不会访问数据库。在Hibernate中,proxy是一个具有给定标识符值的对象,它的属性尚未初始化,它看起来就像一个临时假对象。 如果找不到行,则会抛出Object Not Found Exception。
session.get() 它总是命中数据库并返回真实对象,一个表示数据库行的对象,而不是代理。 如果找不到行,则返回null。