hibernate官方文档:http://docs.jboss.org/hibernate/core/3.6/reference/zh-CN/html_single/
一、hibernate的5种查询方式总结:
Hibernate 的检索方式主要有 5 种,分别为导航对象图检索方式、OID 检索方式、HQL 检索方式、QBC 检索方式和 SQL 检索方式
1、对象图导航检索:
2、OID 检索方式:
3、HQL 检索:
①、基本语法:
②、排序:
③、条件:
命名占位符
④、分页:
⑤、聚合:
⑥、投影:
hql多表:
4、QBC检索:
①、基本语法:
②、排序:
③、条件:
④、分页:
⑤、聚合:
离线Criteria对象:
不需要session,可以"凭空"获得的Criteria对象.
用法:
api:
5、sql检索:
6.使用总结:
根据id查询=>OID查询
查询已有对象的关联属性=>对象视图导航
单表条件查询=>Criteria
简单多表 => HQL(不推荐)
复杂多表=> SQL
二、hibernate查询优化(hibernate查询策略):
1、对象(类)级别:涉及方法:load方法
原理:懒加载策略时,load方法不执行查询,会先返回一个代理对象.代理对象中会封装当前的session对象.当我们访问代理对 象的属性时,代理对象会根据session查询数据库初始化对象中的属性
.
懒加载策略生成代理时,使用的代理技术是第三方代理技术=>CGLIB代理该代理生成的代理对象是被代理对象的子类.被final 修饰的类不能被CGLib代理.
2、关联级别:
①、 集合查询: 一对多|多对多:
②、关联属性:多对一:
3、结论:懒加载效率高.全部使用默认值即可.
三、注意问题:
1、no-session问题:
注意:代理对象的初始化不能放在session关闭之后.不然,会抛出异常:no-session
2、关于实体类唯一标识问题:
如果我们希望使用 Hibernate 提供的所有特性,那么所有的持久化实体(persistent entity)类(这里也包括一些次要依赖 类)都需要一个唯一的标识符属性
3、批量插入问题:
这段程序大概运行到 50,000 条记录左右会失败并抛出内存溢出异常(OutOfMemoryException) 。这是因为 Hibernate 把所有新插入的客户(Customer)实例在 session 级别的缓存区进行了缓存的缘故
四、Hibernate运行过程:
1.通过Configuration().configure();读取并解析hibernate.cfg.xml配置文件
2.由hibernate.cfg.xml中的<mappingresource="com/xx/User.hbm.xml"/>读取并解析映射信息
3.通过config.buildSessionFactory();//创建SessionFactory
4.sessionFactory.openSession();//打开Sesssion
5.session.beginTransaction();//创建事务Transation
6.persistent operate持久化操作 //一般指Save这个方法
7.session.getTransaction().commit();//提交事务
8.关闭Session
9.关闭SesstionFactory