日期:2014-05-20  浏览次数:20705 次

Java面试之hibernate

Java面试之hibernate


Hibernate之我见:

Hibernate的核心思想就是ORM了,即对象到关系的映射。也就是将数据表中的数据表映射为对象,同时通过hibernate也能够把对象自动持久化到关系数据库中。hibernate主要就是充当业务逻辑层与数据库层之间的一个桥梁作用。也是对jdbc思想的一个实现吧。
具体的来说:个人觉得hibernate干了两个事情。
1. 就是hibernate将传统的MVC中的业务逻辑层进一步的进行分层。单独分出了持久化层负责数据的持久化操作。
2. Hibernate 封装了数据库的访问细节,并且维护着实体类与数据库之间的映射关系。使得业务处理程序通过Hibernate API可以进行数据库操作。

Hibernate执行流程:
大体上分为两个部分:
1. Session对象的创建。hibernate通过Configuration类的configure方法加载Hibernate配置信息,默认加载hibernate.cfg.xml文件。加载完毕后通过configuration类的buildSessionFactory方法创建SessionFactory对象。SessionFactory是一个生产session对象的工厂。当需要session对象时从此工厂中获取即可。
2. Session对象对数据进行增删改查的操作。Hibernate框架对JDBC作了轻量级的封装,使用hibernate对数据进行操作时,不需要再写繁琐的JDBC代码,完全面向对象的思维模式,其中还加入了对事务的控制。流程如:
A. 或许session对象
B. 开启事务
C. 数据操作? 有异常? 回滚事务? 没有下一步
D. 提交事务
E. 关闭session对象

Hibernate缓存以及延迟加载

Hibernate中缓存分为两种:Session缓存和SessionFactory缓存。详见:
1. Session缓存(一级缓存)
Session级的缓存,生命周期很短,与session对应。调用session的load,get,save等方法时,hibernate会对实体对象进行缓存;当在同一个session中时再次调用时,hibernate会首先到缓存中查询,找到直接使用。就就不需要发出sql语句到数据库查询。

2. SessionFactory缓存(二级缓存)
二级缓存是sessionFactory级的缓存,生命周期与sessionFactory对应,可以在多个session之间共享。Hibernate中二级缓存需要使用相关的插件。需要进行配置。记不太清了。就是需要把使用二级缓存的属性设置为true。一般的对不是经常更新的数据进行二级缓存,如:热点新闻。 如果经常变化的话,使用二级缓存就得不偿失了。

3. Hibernate的延迟加载策略(get和load的区别)
Hibernate通过代理机制实现了延迟加载技术。也就是使用延迟加载的对象,在获取对象的时候返回的是对象的代理,并不是对象的真正引用,只有在对象真正被调用的时候,hibernate才会对其进行查询,返回真正的对象。

Hibernate的关系映射问题

1. 关联关系映射
多对一单向:

<many-to-one> 标签使用在多的一端,并使用<column >name属性一的一端的主键标识。


多对一双向:
????????????????? 多的一端没有变化,一的一端需要映射文件需要使用<set>标签进行映射。

               <set name=”books”>
		<key culume=”categoryId”>
		<ont-to-many class=”Book”>
	</set>


一对一主键关联:

??????????? ?????????? User文件中:? <one-to-one name=”idCard”>????
????????????????????? ?idCare文件中:<one-to-one name=”user” constrained=”true”>
???????????????????? ? //constrained属性用于建立一个约束。


一对一外键关联:?

??????????????????? User文件中:<many-to-one name=”idCard” unique=”true”>


多对多关联映射:?
?????????????????需要借助第三张表。持久化类中分别加上了set集合。

???????????????? 持久化配置文件为:
??

<set name=”course” table=”tb_studeng_course”>
				<key column=”studentId”></key>
				<many-to-many class=”Course” column=”courseId”>
			</set>
			//table用于指定第三张表。另外一张表同理。


2. 级联操作
级联操作通过cascade属性来实现。属性值可选值:none,save-update,delete,all。

3. 继承映射
有三种方法:
1. 映射成一张表
2. 每个子类映射成一张表
3. 每个具体类映射成一张表

Hibernate的hql语句查询

这块涉及到暑假库的知识,看着就闹心。数据库是一块永远的痛啊! 等以后心情好了,再看吧!


?