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

了解休眠中的session.get和session.load方法

仉成益
2023-03-14
问题内容

我无法理解load和get之间的区别。当我给session.load时,下面的代码不起作用。它给出了空指针异常。但是当我使用session.get()时,同样可以工作。

public Employee getEmployee(final String id){        
        HibernateCallback callback = new HibernateCallback() {
            public Object doInHibernate(Session session) 
                throws HibernateException,SQLException {
                //return (Employee)session.load(Employee.class, id);   doesn't work
                  return (Employee)session.get(Employee.class, id);    //it works
            }
        };        
        return (Employee)hibernateTemplate.execute(callback);
    }

我还想了解如何将Session对象传递给doInHibernate。
会话何时开始和何时结束?

堆栈跟踪如下

Exception in thread "main" java.lang.NullPointerException
    at org.hibernate.tuple.AbstractEntityTuplizer.createProxy(AbstractEntityTuplizer.java:372)
    at org.hibernate.persister.entity.AbstractEntityPersister.createProxy(AbstractEntityPersister.java:3121)
    at org.hibernate.event.def.DefaultLoadEventListener.createProxyIfNecessary(DefaultLoadEventListener.java:232)
    at org.hibernate.event.def.DefaultLoadEventListener.proxyOrLoad(DefaultLoadEventListener.java:173)
    at org.hibernate.event.def.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:87)
    at org.hibernate.impl.SessionImpl.fireLoad(SessionImpl.java:862)
    at org.hibernate.impl.SessionImpl.load(SessionImpl.java:781)
    at org.hibernate.impl.SessionImpl.load(SessionImpl.java:774)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at org.springframework.orm.hibernate3.HibernateTemplate$CloseSuppressingInvocationHandler.invoke(HibernateTemplate.java:1282)
    at $Proxy0.load(Unknown Source)
    at hibernate.EmployeeDao$1.doInHibernate(EmployeeDao.java:25)
    at org.springframework.orm.hibernate3.HibernateTemplate.doExecute(HibernateTemplate.java:406)
    at org.springframework.orm.hibernate3.HibernateTemplate.execute(HibernateTemplate.java:339)
    at hibernate.EmployeeDao.getEmployee(EmployeeDao.java:29)
    at hibernate.SpringHibernateTest.main(SpringHibernateTest.java:26)

问题答案:
I am not able to understand the difference between load and get

主要区别在于:如果load()在缓存或数据库中找不到对象,则会引发异常。load()方法从不返回null。如果找不到对象,则get()方法返回null。另一个不同之处是load()方法可以返回代理而不是实际实例,但是get()从不返回代理。

the following piece of code doesn't work when i give session.load. It gives null pointer exception. But same does work when i am using session.get() .

如果未找到对象,则load方法将引发异常,但不会获得异常。

编辑: 要详细说明,

  1. 调用get()方法时,它将直接访问数据库,获取结果并返回。如果找不到匹配的字段,它将很乐意返回null。

  2. 但是当load()执行时,首先它将在缓存中搜索所需的对象。如果找到,一切都很好。但是,如果在缓存中找不到对象,则load()方法将返回一个代理。您可以将此代理视为数据库查询执行的快捷方式。记住,还没有数据库命中。现在,当您实际访问对象时,将跟踪代理并进行数据库命中。

让我们考虑一个简单的例子。

User user=(User)session.load(User.class, new Long(1));//Line 1
System.out.println(user.getPassword());//Line 2

如果会话中没有具有主键1的User对象,则load()方法将在第1行为数据库设置代理。现在,当调用“
user”对象的实际值(即第2行)时,该代理将为跟踪,数据库将被命中。

希望这会有所帮助。



 类似资料:
  • 问题内容: 从API中,我可以看到它与代理有关。但是我找不到关于代理的大量信息,也不了解调用和之间的区别。有人可以解释一下或将我定向到参考页面吗? 谢谢!! 问题答案: 在Hibernate论坛中: 摘自《hibernate中的行动》一书。好人读过这个.. 通过标识符检索对象以下Hibernate代码段从数据库检索User对象: get()方法很特殊,因为标识符唯一地标识一个类的单个实例。因此,应

  • 问题内容: 有一个结构。我想以这种方式链接这三个实体:公司应包含ID,公司名称和部门列表,每个部门都有一个工人列表,ID和部门名称。每个工人都有名字,身份证。 我试图与一对多和多对一建立联系,但未成功。 公司 部门 工人 我从开始: 它填充公司,但不填充其他表,也没有创建任何联接(映射)错误: 问题答案: 除了Glenn Lane的答案中提到的级联,您还需要了解双向关联是如何工作的。 它们有一个所

  • 问题内容: 什么是最佳解决方案? 制作视频的人相信 在许多情况下,hibernate过大 基本的sql是一种很好的语言,它可以使hibernate抽象化 我听说过其他一些ORM实现,例如 https://github.com/rufiao/persist http://ormlite.com/ http://www.simpleorm.org/ 我想听听他们如何比较,以及每个人的优缺点。 问题答案

  • 问题内容: 我试图将JavaFX BooleanPropety添加到我的模型中,该模型由Hibernate保留,但出​​现以下错误。 JavaFX StringProperty可以很好地保持持久,所以我有点困惑。 我的模型课如下 问题答案: 重命名 至 解决了问题。原因是在Java中,布尔字段的命名约定完全不同。在以下链接中对此进行了解释

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

  • 问题内容: 我有一个包含三个字段的表,例如a,b,c。我想添加一个约束,以确保如果a不为null,那么b和c也不为null。我已经使用以下SQL做到了 有没有一种方法可以使用hibernate注释@Check达到相同的效果? 我找不到带有该注释的有用示例,开发人员是否倾向于完全不使用它? 问题答案: 是的,可以在类级别使用,例如: (请注意,我使用@jarlh注释重写了您的情况。)该条款注释需要参