当前位置: 首页 > 面试题库 >

休眠:session.get和session.load之间的区别

扶开诚
2023-03-14
问题内容

从API中,我可以看到它与代理有关。但是我找不到关于代理的大量信息,也不了解调用session.get和之间的区别session.load。有人可以解释一下或将我定向到参考页面吗?

谢谢!!


问题答案:

在Hibernate论坛中:

摘自《hibernate中的行动》一书。好人读过这个..

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



 类似资料:
  • 问题内容: 我无法理解load和get之间的区别。当我给session.load时,下面的代码不起作用。它给出了空指针异常。但是当我使用session.get()时,同样可以工作。 我还想了解如何将Session对象传递给doInHibernate。 会话何时开始和何时结束? 堆栈跟踪如下 问题答案: 主要区别在于:如果load()在缓存或数据库中找不到对象,则会引发异常。load()方法从不返回

  • 问题内容: 通常我已经阅读过save()方法为对象生成新标识符,并且仅触发 INSERT 并保存它,它不会更新它,而saveOrUpdate()方法可能会 插入 或 UPDATE 记录。 但是根据我的经验,在这里我可以通过示例代码更好地进行解释, 假设有 A类 ,我觉得从记录 表A 的 所以现在我有了一个持久对象, 现在,我试图通过简单地修改某些字段来使用save方法保存记录, 现在我开除 因此,

  • 问题内容: 当我使用@Entity注释类并尝试解决依赖关系时,我可以在两个不同的包javax.persistence.Entity和org.hibernate.annotations.Entity中选择包。 javax包是JPA的实体注释,但是为什么会有休眠的实体注释,它与JPA的注释有区别?仅仅是允许定义更多属性的扩展吗? 问题答案: 具有一些尚未标准化的额外属性。仅当直接使用hibernate

  • 问题内容: 两者之间有什么明显的区别 和 问题答案: 它们仅在处理空值时有明显的区别。 这是因为是原始数据类型不能为其分配null,而它的包装器类 可以接受null。 因此,如果column可为空并且您用于 映射实体对象,则对于null 的记录, 将发生错误,因为 无法存储null。

  • 问题内容: jpa和休眠之间的异同是什么? 问题答案: JPA(Java持久性API)是持久性提供程序要实现的接口。Hibernate就是这样的JPA实现。

  • 问题内容: 除以下内容外,我们还有其他区别吗?另外请验证以下内容是否正确 每个应用程序一个对象,每个客户端一个对象。 是创建和管理。是为映射的类提供CRUD接口,并提供更多功能。 是线程安全的,而不是线程安全的 问题答案: 首先,询问这些接口之间的区别没有任何意义。好像在问汽车制造厂和汽车之间的区别。制造工厂是生产汽车的地方。同样,是一个将创建对象的实例。