Hibernate的Session生命周期是介于Connection和traceaction之间的。当Session需要操作数据库时,(一般使用连接池)会绑定到一个Connection上。
Hibernate的各种特性都是通过一级缓存实现的,当我们使用hibernate的各种api操作对象时,所产生的效果都是先在一级缓存中记录所做的更改,当session执行flush操作时,hibernate会根据缓存中的对象和记录更改的数据进行比较,从而决定执行什么样的操作。
例如:多次save一个持久化状态的对象是不起任何作用的、update一个托管状态的对象时,是否会真正执行update操作,其实就是将对象变成持久化状态,是否执行update操作要看对象的属性是否发生改变。
Hibernate在事物提交时会自动的执行flush操作(flush操作用于清理缓存[根据记录的快照和session的对象比较,决定执行相应的操作],执行sql)
Hibernate提供了多态查询:根据父类查询的结果可以区分真正的类型。
多态查询分为显示多态和隐式多态,显示多态是指通过配置文件显示的指定了对象直接的继承关系,隐式多态是指虽然对象模型中存在继承,但是没有在配置文件中体现,每个实体都有自己独立的配置文件。
Hibernate的get和hql是支持显示多态的,当取消延迟加载时,load也是支持显示多态查询的(因为load默认采用是通过继承方式生产一个代理对象代替真是对象的)。
Hibernate的get和load是不支持隐式多态查询的,但是hql支持隐式多态查询。
Hibernate中的 fetch 属性除了集合上的subselect之外的所有配置都只影响get和load方法,对hql没有任何的影响。如果使用subselect时,使用get和load那么subselect的效果和select一样,当使用hql时,subselect的作用是发出一条语句把所有结果的关联对象全部查询出来,而select是为每一个对象都发出一条select语句查询关联对象。
如果使用hql查询对象时,为了提高效率,可以设置batch-size属性,批量抓取关联的对象。单端关联时在被关联的对象上设置batch-size属性,如果是关联多的一方,则在集合上使用batch-size(此时如果设置了subselect,那么subselect将失效)