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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。