hibernate中session的get跟load方法的比较【转载】
来源:互联网 发布:高级编程语言 自然语言 编辑:程序博客网 时间:2024/05/21 17:17
load读取:
Java代码
Users user = (Users)session.load(Users.class, userId);
get读取:
Java代码
Users user = (Users)session.get(Users.class, userId);
区别1:
1. load()方法从来就是假定数据在数据库中是存在的,在使用时如果不存在则会抛出ObjectNotFoundException;而get()方法不会假定数据在数据库中存在,如果不存在则返回null
2. load()方法返回的是实体类的代理类,因此load()可以使用延迟加载策略来加载对象
get()方法返回的不一定是实体类,可能是代理类,因为get()方法如果在session缓存(一级缓存)中找到了该id对应的对象,如果刚好该对象前面是被代理过的,如被load方法使用过,或者被其他关联对象延迟加载过,那么返回的还是原先的代理对象,而不是实体类对象。
3. load()方法查询数据时会先从session缓存(一级缓存)中查找,如果没有找到则会创建代理类,该代理类仅仅初始化了OID属性,当第一次访问其他属性值时,则会依次从二级缓存-->数据库查找,直到找到数据,最后将所有属性值赋给代理类。而get()方法则会直接按照一级缓存-->二级缓存-->数据库的顺序查找。
4. 也许别人把数据库中的数据修改了,load如何在缓存中找到了数据,则不会再访问数据库,而get则会返回最新数据
也就是说:
Java代码
Users user = (Users)session.load(Users.class, userId);
这句代码不会去执行数据库查询,只有用到user时才会去执行数据库查询。
而:
Java代码
Users user = (Users)session.get(Users.class, userId);
则立即去执行数据库查询。 所以Users user = (Users)session.load(Users.class, userId);不会执行任何sql。
注意:
Java代码
Users user = (Users)session.load(Users.class, userId);
System.out.println(user.getId());
上面这2句代码,不会去执行数据库操作。因为load后会在hibernate的一级缓存里存放一个map对象,该map的key就是userId的值,但是当你getId()时,它会去一级缓存里拿map的key值,而不去执行数据库查询。所以不会报任何错。不会执行任何数据库操作。
并且注意:这两个方法的第二个参数id,它必须是实现了java.io.Serializable接口,也就是可序列化的。
Java代码
Users user = (Users)session.load(Users.class, userId);
get读取:
Java代码
Users user = (Users)session.get(Users.class, userId);
区别1:
1. load()方法从来就是假定数据在数据库中是存在的,在使用时如果不存在则会抛出ObjectNotFoundException;而get()方法不会假定数据在数据库中存在,如果不存在则返回null
2. load()方法返回的是实体类的代理类,因此load()可以使用延迟加载策略来加载对象
get()方法返回的不一定是实体类,可能是代理类,因为get()方法如果在session缓存(一级缓存)中找到了该id对应的对象,如果刚好该对象前面是被代理过的,如被load方法使用过,或者被其他关联对象延迟加载过,那么返回的还是原先的代理对象,而不是实体类对象。
3. load()方法查询数据时会先从session缓存(一级缓存)中查找,如果没有找到则会创建代理类,该代理类仅仅初始化了OID属性,当第一次访问其他属性值时,则会依次从二级缓存-->数据库查找,直到找到数据,最后将所有属性值赋给代理类。而get()方法则会直接按照一级缓存-->二级缓存-->数据库的顺序查找。
4. 也许别人把数据库中的数据修改了,load如何在缓存中找到了数据,则不会再访问数据库,而get则会返回最新数据
也就是说:
Java代码
Users user = (Users)session.load(Users.class, userId);
这句代码不会去执行数据库查询,只有用到user时才会去执行数据库查询。
而:
Java代码
Users user = (Users)session.get(Users.class, userId);
则立即去执行数据库查询。 所以Users user = (Users)session.load(Users.class, userId);不会执行任何sql。
注意:
Java代码
Users user = (Users)session.load(Users.class, userId);
System.out.println(user.getId());
上面这2句代码,不会去执行数据库操作。因为load后会在hibernate的一级缓存里存放一个map对象,该map的key就是userId的值,但是当你getId()时,它会去一级缓存里拿map的key值,而不去执行数据库查询。所以不会报任何错。不会执行任何数据库操作。
并且注意:这两个方法的第二个参数id,它必须是实现了java.io.Serializable接口,也就是可序列化的。
- hibernate中session的get跟load方法的比较【转载】
- hibernate中session的get()、load()方法比较
- hibernate中session的get()、load()方法比较
- hibernate中session的get()、load()方法比较
- hibernate中session的get()、load()方法比较
- hibernate中session的get()、load()方法比较
- hibernate 中 session的get 和load方法比较
- hibernate中session的get、load比较
- hibernate的session.get/load方法的比较
- Hibernate中session.get()和session.load()方法的异同
- Hibernate中Session.get()方法和load()方法的详细比较
- Hibernate中Session.get()方法和load()方法的详细比较
- Hibernate中Session.get()方法和load()方法的详细比较
- Hibernate中Session.get()方法和load()方法的详细比较
- Hibernate中Session.get()方法和load()方法的详细比较
- Hibernate中session 的get()方法和load()方法
- Hibernate中session的get和load方法的区别
- Hibernate中Session的load()和get()方法
- Servlet获取页面数据部分出现乱码
- Android泡泡聊天界面的实现
- 【重点:Lock】把sychronized改为lock的方法
- find out gcc/clang head file search paths
- java级联删除
- hibernate中session的get跟load方法的比较【转载】
- <c:forEach varStatus="status">中 varStatus的属性简介
- declare global data ptr
- Linux环境下段错误的产生原因及调试方法小结
- Android SDK更新以及ADT更新出现问题的解决办法
- 机房收费系统简单的逻辑(下)组合查询我不愁
- 在Windows平台下使用Qt Creator,出现找不到mingwm10.dll错误提示
- 谈eager跟lazy标签
- NoSQL之【memcached】学习