1:hibernate的懒加载(通过asm和cglib包实现)代理对象实现
2:单个对象的查询
总之对于get和load的根本区别,一句话,hibernate对于load方法认为该数据在数据库中一定存在,可以放心的使用代理来延迟加载,如果在使用过程中发现了问题,只能抛异常;
而对于get方法,hibernate一定要获取到真实的数据,否则返回null。get()方法与load()方法的区别就在于不会查找二级缓存。
一般像在给另外一个对象设置关系时采用load方法获取对象
返回对象后session关闭再访问对象,会报无法初始化代理.可以通过反射查看类名(返回的是个代理对象)[下面的懒加载相同]
解决办法:通过hibernate.initialize(对象)初始化或者访问对象的属性;
3:一对一(对系统性能的提高影响不是很大)
hibernate默认情况下查询主对象不采用懒加载.
查询从对象时采用懒加载.(constrained等于"true" lazy等于"proxy(默认)/false/true" fetch等于"select(默认)【通过两次select查询,效率没有join高】/join")
fetch的配置如果为join,lazy会无效了.
4:一对多跟多对多
数据库查询的开销跟网络传输的开销
lazy跟fetch同上(默认就是懒加载)
5:懒加载时访问它的ID和Class不会去访问数据库,因为ID在另外一个对象中已经有了,呵呵
6:对属性的懒加载[比较麻烦,需要等编译后再修改,一般对大字段可能需要处理]
7:query的iterate方法(N+1问题)
工作原理如下:先取得所有的ID,然后根据ID从缓存中去读取
一级缓存跟二级缓存都找不到时,查数据库。【如果有10条记录,那么查询数据库就会执行11次,其中一次是查ID】
如果不能保证缓存中有数据,iterate方法效率比较低
8:Criteria(条件查询) 和 DetachedCriteria(离线条件查询)
session.createCriteria(User.class)
----------------
DetachedCriteria query = DetachedCriteria.forClass(User.class);
query.getExecutableCriteria(session);
9:Native查询
Query query s.createQuery(from 对象名称);
10:Query q s.createSQLQuery("select * from 表名")
q.list();
查出来的是Object数组
解决:
Query q s.createSQLQuery("select * from 表名").addEntity(User.alss);取得的为对象
hibernate的懒加载和查询
最新推荐文章于 2023-05-11 20:10:52 发布