1.简要说说hibernate的几种检索方式?
1.导航对象图检索方式。(根据已经加载的对象,导航到其他对象。)
利用类与类之间的关系来检索对象。譬如我们要查找一份订单,就可以由订单对象自动导航找到订单所属的客户对象。前提是在对象-关系映射文件上配置了它们的多对一的关系。
2. OID检索方式。(按照对象的OID来检索对象。)
主要指用Session的get()和load()方法加载某条记录对应的对象。
Customer customer = (Customer)session.get(Customer.class,1);
Customer customer = (Customer)session.load(Customer.class,1);
3. HQL检索方式。(使用面向对象的HQL查询语言。)
HQL(Hibernate Query Language)是面向对象的查询语言,它和SQL查询语言有些相似。在Hibernate提供的各种检索方式中,HQL是使用最广的一种检索方式。它具有以下方式:
4. QBC检索方式。(使用QBC(Qurey By Criteria) API来检索对象。)
主要由Criteria接口、Criterion接口和Expression类组成,它支持在运行时动态生成查询语句。
5.本地SQL检索方式。(使用本地数据库的SQL查询语句。)
采用HQL或QBC检索方式时,Hibernate生成标准的SQL查询语句,使用于所有的数据库平台,因此这两种检索方式都是跨平台的。有的应用程序可能需要根据底层数据库的SQL方言,来生成一些特殊的查询语句。在这种情况下,可以利用Hibernate提供的SQL检索方式。
2.怎么实现级联删除,需要怎样配置?
<set name="voteitems" cascade="delete" order-by="title asc" inverse="true">
<key column="vote_id"></key>
<one-to-many class="Voteitems"/>
</set>
3.简要说说session.load()和session.get()的区别
1:在立即加载对象(当hibernate在从数据库中取得数据组装好一个对象后会立即再从数据库取得数据此对象所关联的对象)时,如果对象存在,load()和get()方法没有区别,都可以取得已初始化的对象;但如果当对象不存在且是立即加载时,使用get()方法则返回null,而使用load()则抛出一个异常。因此使用load()方法时,要确认查询的主键ID一定是存在的,从这一点讲它没有get方便!
2:在延迟加载对象(Hibernate从数据库中取得数据组装好一个对象后,不会立即再从数据库取得数据组装此对象所关联的对象,而是等到需要时,都会从数据库取得数据组装此对象关联的对象)时,get()方法仍然使用立即加载的方式发送SQL语句,并得到已初始化的对象,而load()方法则根本不发送SQL语句,它返回一个代理对象,直到这个对象被访问时才被
初始化。
load()方法的执行顺序如下:
a):首先通过id在session缓存中查找对象,如果存在此id的对象,直接将其返回
b):在二级缓存中查找,找到后将 其返回。
c):如果在session缓存和二级缓存中都找不到此对象,则从数据库中加载有此ID的对象
因此load()方法并不总是导致SQL语句,只有缓存中无此数据时,才向数据库发送SQL
主要有以下三项区别:
① 如果没有找到符合条件的记录,get方法返回null,load方法抛出异常。
② get方法直接返回实体类对象,load方法返回实体类对象的代理。
③ 在Hibernate 3之前,get方法只在一级缓存中进行数据查找,如果没有找到对应的数据则越过二级缓存,直接发出SQL语句完成数据读取;load方法则可以从二级缓存中获取数据;从Hibernate 3开始,get方法不再是对二级缓存只写不读,它也是可以访问二级缓存的。
说明:对于load()方法Hibernate认为该数据在数据库中一定存在可以放心的使用代理来实现延迟加载,如果没有数据就抛出异常,而通过get()方法获取的数据可以不存在。