实体类的编写规则
l 实体类必须具备无参构造方法
l 实体类必须具备数据库标识
l 通常选用无业务意义的逻辑主键作为数据库标识,通常是int/long/String类型
l 通常由Hibernate来自动生成数据库标识值
Session对实体对象的管理
l 瞬时对象是没有数据库标识,没有被任何session所管理,数据库没有对应的记录的对象
l 持久化对象是被某个session管理,而且必定拥有数据库标识,在数据库中有对应的记录
l 离线对象是拥有数据库标识,没有被session所管理的对象,而且在数据库中也有对应的记录
l Save方法用于将一个实体对象从瞬时状态转换为持久化状态
l Update方法用于将一个实体对象从离线状态转换为持久化状态
l saveOrUpdate方法由Hibernate自动判断
l Flush方法用于将内存中由session管理的持久化对象的状态强制同步到数据库(发出insert/update/delete语句)
l Evict方法用于将一个持久化对象转换为离线对象
l Clear方法用于将session中所管理的所有持久化对象转换为离线对象
l Merge方法用于把一个离线对象的属性值拷贝到跟它相对应的持久化对象中
l Hibernate会尽可能的延迟SQL语句的发出(insert/update/delete/select)
l 同一个session中,不允许存在两个以上具有相同数据库标识的同种类型的实体对象
l 处于持久化状态的对象,不允许引用到一个瞬时对象
l 懒加载策略只在session打开期间有效(即只对处于持久化状态的实体对象有效),如果尝试获得一个离线对象中尚未被加载的属性,将会抛出懒加载异常!
关联映射
l 关于equals和hashcode方法
l 在一对多双向关联中,通常设置“一”的一端inverse=”true”(这意味着我们通常在“多”的一端维护关联)
l 在一对多双向关联中,其外键字段名请保持一致
l 在Hibernate中,实体类的集合类型请使用接口定义(如:Set、List、Map),而不要使用具体的实现类型(如:HashSet、ArrayList、HashMap)
l 多对多关联通常会拆分成两个多对一关联
l 单表继承映射的限制
l 具体类表继承(union-subclass)映射策略的限制
HQL查询
l HQL是面向对象的查询语句,在HQL语句中,使用类名、属性名来进行查询(而不是表名、字段名)
l 注意HQL语句的大小写敏感性
l 用?来表示索引参数,给参数赋值时,从第0个索引开始赋值
l 用“:参数名称”的方式,在HQL语句中,定义命名参数,赋值时,直接按照名称赋值
l 空值查询,建议使用is null来判断空值
l 可以使用集合(或数组)作为参数传给HQL语句,注意使用setParameterList方法
l 传递的参数类型必须与属性的数据类型匹配
l 在HQL语句中,不能使用select* from ... 这样的语法!
l 投影查询(查询部分属性)
l SQL语法中的统计函数可以在HQL语句中直接使用
l 假如查询的结果集至多只有一条记录,则可以调用Query中的uniqueResult方法直接把对象取出
l 可以将查询结果集转换为各种不同类型的对象
l 多态查询
l 分页查询
l Query.iterate()方法
l Query.scroll()方法,返回ScrollableResults,利用数据库游标的支持进行查询
l 条件查询:如果利用Example对象,构建查询条件更加方便
l 连接查询
缓存策略
l 一级缓存
l 一级缓存的管理
l 二级缓存
l 查询缓存
抓取策略
l 基本概念
l 单端关联(many-to-one)上设置fetch
l 单端关联(many-to-one)的批量抓取
l 集合关联上设置fetch
l 集合关联的批量抓取
l 【注意:设置了fetch=”join”之后,关联上的懒加载策略将失效】
其它
l Version用于乐观锁定策略
l 适当调整hibernate.jdbc.batch_size和hibernate.jdbc.fetch_size参数,可以极大提高大批量数据处理的性能