1、Hibernate中get和load有什么不同之处? hibernate get和load区别(面试) 1)发送sql时机 get:立即发送sql load:延迟发送sql,用对象里的非id属性会发送sql 2)返回对象是什么 get:返回持久化类本身 load:返回子类代理,子类代理javassist-3.18.1-GA.jar,这个包在struts2里同样,整合,高版本的 3)如果查询oid在数据库中不存在? get:返回null load:异常 2、hibernate常用主键生成策略 1)identity:支持自动增长(mysql,sqlserver), 2) sequence:数据库支持序列(oarcle,db2) 默认:create sequence hibernate_sequence
自定义序列 <id name="id"> <generator class="sequence"> <param name="sequence_name">seq_tt</param> </generator> </id>
3) uuid:只要数据库支持字符 就可以,优点:效率高,移值性强,char(32) 4) native:缺点:效率低,扩展性强,支持自动增长,序列 3、定义一简单的注解实体类 @Entity // 定义了一个实体 @Table(name = "t_book") public class Book {
@Id // 主键 // @GeneratedValue //native @GeneratedValue(strategy = GenerationType.IDENTITY) // identity private Integer id; // 主键
private String name; 4、hibernate查询操作,实际开发中的一个应用场景, 1、OID查询 修改, 2、HQL查询 不适合大量的关联查询 , 3、Criteria 不适合大量的关联查询 ,而且一两张表的之间,而且查询sql条件多,sql可读性差,条件多比较乱 4、SQL 适合大量的关系查询,复杂的sql语句,写的复杂sql我们一般需要在数据库工具中 select * from left join left join left join left join 增加修改删除 ,我们建议用save,update,delete 5、Hibernate中的Session指的是什么? 可否将单个的Session在多个线程间进行共享? 前面的问题问完之后,通常就会接着再问这两个问题。问完SessionFactory的问题后就该轮到Session了。Session代表着Hibernate所做的一小部分工作,它负责维护者同数据库的链接而且 不是线程安全的,也就是说,Hibernage中的Session不能在多个线程间进行共享。虽然Session会以主动滞后的方式获得数据库连接,但是Session最好还是在用完之后立即将其关闭。 6、说说 Hibernate 的缓存: Hibernate缓存包括两大类:Hibernate一级缓存和Hibernate二级缓存: 1). Hibernate一级缓存又称为“Session的缓存”,它是内置的,不能被卸载。由于Session对象的生命周期通常对应一个数据库事务或者一个应用事务,因此它的缓存是事务范围的缓存。在第一级缓存中,持久化类的每个实例都具有唯一的OID。 2).Hibernate二级缓存又称为“SessionFactory的缓存”,由于SessionFactory对象的生命周期和应用程序的整个过程对应,因此Hibernate二级缓存是进程范围或者集群范围的缓存,有可能出现并发问题,因此需要采用适当的并发访问策略,该策略为被缓存的数据提供了事务隔离级别。第二级缓存是可选的,是一个可配置的插件,在默认情况下,SessionFactory不会启用这个插件。 当Hibernate根据ID访问数据对象的时候,首先从Session一级缓存中查;查不到,如果配置了二级缓存,那么从二级缓存中查;如果都查不到,再查询数据库,把结果按照ID放入到缓存删除、更新、增加数据的时候,同时更新缓存。 |