任何人都可以告诉我在Hibernate中load()vs get()的优势是什么?
axt*_*avt 67
这些方法的语义解释并不能解释它们之间的实际区别.实际规则如下:
使用get()时要加载的对象
使用load()时,你需要获得无需发出额外的SQL查询到对象的引用,例如,创建与另一个对象的关系:
public void savePost(long authorId, String text) {
Post p = new Post();
p.setText(text);
// No SELECT query here.
// Existence of Author is ensured by foreign key constraint on Post.
p.setAuthor(s.load(Author.class, authorId));
s.save(p);
}
Run Code Online (Sandbox Code Playgroud)Dmi*_*lev 33
从"Java Persistence with Hibernate"一书中,第405页:
get()和load()之间的一个区别是它们表明无法找到实例的方式.如果数据库中不 存在具有给定标识符值的行,则get()返回null.所述负载()方法将引发ObjectNotFoundException.您可以选择自己喜欢的错误处理方式.
更重要的是,load()方法可以返回代理,占位符,而不会访问数据库.这样做的结果是,一旦您尝试访问返回的占位符并强制其初始化(这也称为延迟加载;我们将在后面的章节中讨论加载优化),您可能会在以后获得ObjectNotFoundException.)load()方法总是如此尝试返回代理,并且只有在已由当前持久性上下文管理的情况下才返回初始化对象实例.在前面显示的示例中,根本没有发生数据库命中!另一方面,get()方法永远不会返回代理,它总是命中数据库.
你可能会问为什么这个选项很有用 - 毕竟,你检索一个对象来访问它.获取持久化实例以将其指定为对另一个实例的引用是很常见的.例如,假设您只需将项目用于单一目的:设置与Comment的关联:aComment.setForAuction(item).如果这是您计划对该项目进行的所有操作,代理将会很好; 没有必要打到数据库.换句话说,当保存Comment时,您需要插入COMMENT表中的项的外键值.Item的代理提供了这样的:包含在占位符中的标识符值,看起来像真实的东西.
例如:如果您尝试加载 empid=20 的 /get Empoyee 对象。但假设记录在 DB 中不可用。
Employee employee1 = session.load(Employee.class,20); //Step-1
system.out.println(employee1.getEmployeeId(); //Step-2 --o/p=20
system.out.println(employee1.getEmployeeName(); //Step-3 -->O/P:ObjectNotFoundException
Run Code Online (Sandbox Code Playgroud)
如果您在第 1 步中使用负载,休眠此时不会触发任何选择查询以从数据库中获取员工记录。此时,休眠提供了一个虚拟对象(代理)。这个虚拟对象不包含任何东西。它是新员工(20)。您可以在第 2 步中验证这一点,它将打印 20。但在第 3 步中,我们正在尝试查找员工信息。所以此时 hibernate 会触发一个 sql 查询来获取 Empoyee 对象。如果在 DB.throws ObjectNotFoundException 中没有找到。
Employee employee2 = session.get(Employee.class,20); //Step-4
Run Code Online (Sandbox Code Playgroud)
对于 session.get() hibernate 会触发 sql 查询以从 db 获取数据。所以在我们的例子中 id=20 不存在于数据库中。所以它会返回null。
性能问题也是 get 和 load 方法之间的主要区别。
get() 方法一执行就获取数据,而 load() 方法返回一个代理对象,并且只在需要对象属性时获取数据。使 load() 方法获得更好的性能,因为它支持延迟加载。只有当我们知道数据存在时才应该使用 load() 方法,因为它在找不到数据时抛出异常。如果我们想确保数据存在,我们应该使用 get() 方法。
简而言之,您应该了解两者之间的差异,并决定哪种方法最适合您的应用程序。
我在教程中发现了这个差异Hibernate 中 get 和 load 方法之间的差异
| 归档时间: |
|
| 查看次数: |
46311 次 |
| 最近记录: |