Hibernate有很多特性,这里不多说,只说几个和本次内容相关的特性。
1、同一Session中的同一实例确保只加载一次
具体来说就是在同一个Session中,调用多次session.get(id, Class) / session.load(id, Class),都只发生一次实际的数据库操作(即第一次调用时访问数据库,后续的访问直接从session的缓存中返回了)。这个特性在多个Service/多个方法的时候尤其便捷,可以不用考虑直接调用get或load方法获取数据,而不用担心是否会对数据库造成性能影响。
2、对不需要的实例使用代理延迟加载
Hibernate 3中,对于@ManyToOne,如果没有手动设置@ManyToOne(fetch=FetchType.LAZY),则每次都会自动加载这个One,如果手动配置了,则只是产生一个代理对象(可认为是占位符)。
3、继承机制自动实例化相应的具体子类实例
继承机制在Hibernate中有N种(N>3)配置方式,但不论是哪种配置方式,在进行get / load (id, Class)时,都能够自动返回相应的具体子类实例,相当的智能
以上3个特性都是非常好的也是大家所熟知的,但当这三者结合在一起在某个特殊的情况下,可能会出现你不希望的情况。
先描述一下我所说的特殊情况: