hibernate的懒加载和查询

本文详细介绍了Hibernate中的懒加载机制,包括懒加载的实现原理、get与load方法的区别、一对一、一对多和多对多关系的懒加载配置、查询优化及N+1问题。此外,还讨论了Criteria查询、DetachedCriteria、Native查询和SQL查询的使用方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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);取得的为对象

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值