1.为什么使用hibernate
- 对JDBC访问数据库的代码做了封装,简化了数据访问层繁琐的重复性代码
- hibernate 是一个基于jdbc的主流持久化框架,是一个优秀的orm实现,能很大程度简化dao层的编码工作
- hibernate使用java反射机制,而不是字节码增强程序来实现透明性
- hibernate的性能非常好,因为它是个轻量级框架,映射的灵活性很出色,支持各种关系数据库,从一对一到多对多的各种复杂关系
2.什么是orm框架
对象-关系映射(object-relational mapping,简称orm),主要实现程序对象到关系数据库数据的映射
3.hibernate 的查询方式
- hql查询
- sql查询
- 条件查询
hql:hibernate query language,面向对象的写法
Query query = session.createQuery("from A where where name = ?');
query.setParameter(0, "a");
query.ilist();
sql:
SQLQuery query = session.createSQLQuery("select * from A");
List<Object[]> list = qurey.list();
SQLQuery query = session.createSQLQuery("select * from A");
query.addEntity(A.class);
List<A> list = query.list();
qbc:Query By Criteria(条件查询)
Criteria criteria = session.createCriteria(A.class);
criteria.add(Restrictions.eq("name", "a"));
List<A> list = criteria.list();
hql和sql的区别:
hel是面向对象查询操作的
sql是结构化查询语言,是面向数据库表结构的
4.hibernate实体类可以被定义为final吗
可以,但并不好。因为hibernate会使用CGLib创建代理对象在延迟关联的情况下提高性能,如果实体类定义成final后,hibernate无法使用代理。
如果实体类继承某个接口,那么hibernate会使用jdk进行代理,就不会有上述情况
5.hibernate中使用integer和int做映射有什么区别
在hibernate中,如果将主键定义为integer类型,那么hibernate就可以根据其值是否为null而判断一个对象是否是临时的,如果字段定义为int类型,还需要在hbm映射文件中设置unsaved-vaue属性为0
6.hibernate的工作原理
- 通过Configuration config = new Configuration().configure();读取并解析hibernate.cfg.xml配置文件
- 在由hibernate.cfg.xml中的<mapping resource="com/xxx/xxx.hbm.xml"/>读取并解析映射信息
- 创建SessionFactory,通过SessionFactory sf = config.buildSessionFactory();
- 打开session,通过Session session = sf.openSession();
- 创建并启动事务,Transaction tx = session.beginTransaction();
- 持久化操作数据(persistent operate)
- 提交事务,tx.commit()
- 关闭session
- 关闭sessionFactory
7.get()和load()的区别
- get()没有使用对象的其他属性时,也会生成sql,立即加载
- load()没有使用对象的其他属性时,不会生成sql,延迟加载
8.hibernate的缓存机制
- 一级缓存:session级别的缓存,在事务范围内有效,是内置的不能被卸载。
- 二级缓存:sessionFactory级别的缓存,从应用启动到应用结束有效。是可选的,默认没有二级缓存,需要手动开启。保存数据库后,缓存在内存中保存一份,如果更新了数据库就要同步更新
什么样的数据适合存放到二级缓存中
- 很少被修改的数据,如帖子的最后回复时间
- 经常被查询的数据,物流的地址
- 不是很重要的数据,允许出现偶尔并发的数据
- 不会被并发访问的数据
- 常量数据
hibernate的二级缓存默认不支持分布式缓存,可使用memcache,redis等中央缓存来代替
9.hibernate对象的状态
- transient(瞬时):对象刚new出来,还没设置id,但设了其他值
- persistent(持久):调用了save()、saveOrUpdate()后,对象则为此状态,有id
- detached(托管):当session.close()后变成此状态
10.hibernate中getCurrentSession和openSession的区别
openSession:打开新的session对象,而且每次使用都是打开一个新的session,如果连续使用多次,则获得的session不是同一个对象,并且使用完需要调用close方法关闭session
getCurrentSeesion:获取当前上下文一个session对象,第一次使用时,自动产生session对象,在连续使用的情况下,得到的session对象是同一个
11.hibernate实体类必须要有无参构造函数吗?为什么?
必须,因为hibernate框架会调用这个默认构造方法来创建对象,即Class类的newInstance方法,该方法就是通过调用默认构造方法来创建实例对象的。