hibernate中的session指的是什么,hibernate getsession

  hibernate中的session指的是什么,hibernate getsession

  hibernate中Session接口提供的get()和load()方法用于获取一个实体对象,在用法和查询性能上有一些区别。测试:休眠4.2.0。

  GetSession接口提供了四个重载的get方法,分别用于通过持久类主键、全类主键和锁选项获取实体对象。

  公共对象get(Class clazz,Serializable id);

  公共对象get(Class clazz,Serializable id,lock options lock options);

  公共对象get(String entityName,Serializable id);

  public Object get(String entity name,Serializable id,lock options lock options);1 @测试

  2 public void testGet()抛出异常{

  3 Session Session=Session factory . open Session();

  四

  5学生student=(学生)session.get(学生.班级,1L);

  6//Student Student=(Student)session . get( com . lt . CRM . entity . Student ,1L);

  7 System.out.println(学生);

  八

  9 session . close();

  10}向数据库发出sql查询语句,并返回结果。

  Load的调用方式和get一样,用一个重载方法:“一个持久类的空实例主键”用来获取实体对象。

  public void load(Object object,Serializable id);1 @测试

  2 public void testLoad()抛出异常{

  3 Session Session=Session factory . open Session();

  四

  5学生学生=新生();6 session.load(学生,1L);

  7 System.out.println(学生);

  八

  9 session . close();

  10}获取和加载之间的差异

  分别注释掉print语句,即只获得对象,而不使用对象。可以看到get方法发出了sql语句,而load方法没有。

  1 @测试

  2 public void testGet()抛出异常{

  3 Session Session=Session factory . open Session();

  四

  5学生student=(学生)session.get(学生.班级,1L);

  6 //System.out.println(学生);

  7 session . close();

  8 }

  会话关闭后,load方法抛出一个异常:org . hibernate . lazyinitializationexception。

  1 @Test 2 public void testLoad()引发异常{

  3 Session Session=Session factory . open Session();

  四

  5学生学生=(学生)session.load(学生.班级,1L);

  6 session . close();

  7 System.out.println(学生);

  8 }

  get方法会在调用后立即向数据库发出sql语句(不考虑缓存),并返回持久对象;load方法被调用后会返回一个代理对象,这个代理对象只保存实体对象的id,在使用对象的非主键属性之前不会发出sql语句。

  查询数据库中不存在的数据时,get方法返回null,load方法抛出异常:org . hibernate . objectnotfoundexception。

  如果我们使用load方法查询数据库中不存在的数据,在会话关闭后获取对象的id属性,会发生什么情况?

  1 @测试

  2 public void testLoad()抛出异常{

  3 Session Session=Session factory . open Session();

  四

  5学生student=(学生)session.load(学生.班级,4L);

  6 session . close();

  7 system . out . println(student . getid());

  8 }

  结果显示,调用load方法返回代理对象,代理对象中只保存id。只有获得了非主键属性,才会发出sql语句。因为没有执行sql语句,所以没有引发ObjectNotFoundException异常。

  关于延迟加载和缓存

  以上测试结果都是因为hibernate3默认开启了延迟加载:lazy=true 。get方法不使用延迟加载机制。首先查找会话缓存,然后二级缓存,然后查询数据库(hibernate3以前是跳过二级缓存直接查询数据库)。load方法先查找会话缓存,再查找二级缓存,如果找不到就返回代理对象,延迟发出sql语句在实际使用对象的非主键属性时加载对象。

  如果设置了lazy= false , SQL语句将在load返回代理对象后发出。如果找不到符合条件的记录,仍会引发ObjectNotFoundException异常。

  版权归作者所有:来自博客作者为温度原创作品。转载请联系作者获得授权,否则将追究法律责任。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: