JAVA技术综合面试题目(含参考答案)-Hibernate框架 - 高飞网
5人看过

JAVA技术综合面试题目(含参考答案)-Hibernate框架

2014-03-19 01:20:09

  1. Hibernate框架的工作流程

a. 读取并解析配置文件

b.读取并解析映射信息,创建SessionFactory

c.打开Sesssion
d.创建事务Transation
e.持久化操作
f.提交事务
g.关闭Session
h.关闭SesstionFactory

  1. Hibernate框架中的核心接口有哪些,这些接口的具体功能是什么

核心接口有:session,sessionFactory,transaction,query,configuration.

a) Session接口:Session接口负责执行被持久化对象的CRUD操作(CRUD的任务是完成与数据库的交流,包含了很多常见的SQL语句。)。

b) SessionFactory接口:SessionFactroy接口负责初始化Hibernate。它充当数据存 储源的代理,并负责创建Session对象。

c) Configuration接口:Configuration接口负责配置并启动Hibernate,创建SessionFactory对象。

d) Transaction接口:Transaction接口负责事务相关的操作。

e) Query和Criteria接口:Query和Criteria接口负责执行各种数据库查询。它可以使用HQL语言或SQL语句两种表达方式。

  1. Hibernate中的Session对象表示什么?它与Web程序中的Session是一样的机制吗

Hibernate中的Session对象代表与数据库之间的一次操作,它的概念介于Connection和Transaction之间,也称为持久化管理器,因为它是与持久化有关的操作接口。它通过SessionFactory打开,在所有的工作完成后,需要关闭。

它与Web层的HttpSession没有任何关系,Web层的HttpSession是指一个作用域。

  1. Hibernate.cfg.xml配置文件中,应该包含哪些具体的配置内容
    1. Hibernate运行的底层信息:数据库的URL、用户名、密码、JDBC驱动类,数据库Dialect, 连接池等。
    2. Hibernate映射文件(*.hbm.xml)。
  2. 简述Hibernate的主键机制,针对Oracle数据库,有几种主键机制可以适用

A, 数据库提供的主键生成机制。identity、sequence(序列)。

B, 外部程序提供的主键生成机制。increment (递增) ,hilo(高低位) ,seqhilo(使用序列的高低位 ),uuid.hex(使用了IP地址+JVM的启动时间(精确到1/4秒)+系统时间+一个计数器值(在JVM中唯一) ),uuid.string。

C, 其它。native(本地),assigned(手工指定),foreign(外部引用)

针对Oracle数据库,有sequence,uuid.hex,native,assigned,foreign主键机制可以适用

  1. 请简述Hibernate中cascade,inverse,constrained几个属性的区别

cascade(级联) :

是操作主表或者从表时,要不要自动操作从表或者主表,比如,保存主表的时候,要不要也默认保存从表,cascade 的值主要有四种:none,all,delete,save-update。

Inverse:

是指要不要交出控制权,值有true(交出控制权,不再维护双方的关系)和false(不交出控制权,继续维护双方的关系)。

constrained:

表示当前引用对象的主键是否作为当前对象的主键参考,true为是,false为否.

  1. Hibernate有几种数据查询方式,这几种数据查询方式的优缺点
    1. 使用主键id加载对象(load(),get());
    2. Criteria: 通过面向对象化的设计,将数据查询条件封装为一个对象。Criteria本身只是一个查询容器,查询条件通过criteria.add方法添加到criteria查询实例中。
    3. HQL(Hibernate Query Language)针对hibernate的查询语言,完全面向对象,理解继承,多态和关联之类的概念。HQL配备了很强大的查询语言,在语法结构上类似SQL,但HQL是面向对象的查询语言。
    4. Native sql: 使用数据库的原生sql语句来查询。

优缺点:

a) criteria 最适合动态查询,但不太适合统计查询,qbe还不够强大.只适合简单的查询.

b) hql功能很强大,适合各种情况,但是动态条件查询构造起来很不方便.

c) Native sql可以实现特定的数据库的sql.但是可移植性并不好.

  1. Hibernate中的延迟机制的原理,以及Hibernate中数据有几种延迟加载方式?

延迟加载机制是为了避免一些无谓的性能开销而提出来的,所谓延迟加载就是当在真正需要数据的时候,才真正执行数据加载操作。

Hibernate中提供了三种延迟加载方式分别是

A. 实体对象的延迟加载

B. 集合的延迟加载

C. 属性的延迟加载

  1. Hibernate中Load和Get两种方法查询数据的区别

load是采用延迟机制(load语句不读库,等使用非主键时才去读库),而get不采用延迟机制(get语句时马上读库)。

a.当数据库不存在对应ID数据时,调用load()方法将会抛出ObjectNotFoundException异常,get()方法将返回null.

b.当对象.hbm.xml配置文件<class>元素的lazy属性设置为true时,调用load()方法时则返回持久对象的代理类实例,此时的代理类实例是由运行时动态生成的类,该代理类实例包括原目标对象的所有属性和方法,该代理类实例的属性除了ID不为null外,所在属性为null值,查看日志并没有Hibernate SQL输出,说明没有执行查询操作,当代理类实例通过getXXX()方法获取属性值时,Hiberante才真正执行数据库查询操作。当对象.hbm.xml配置文件<class>元素的lazy属性设置为false时,调用load()方法则是立即执行数据库并直接返回实体类,并不返回代理类。而调用get()方法时不管lazy为何值,都直接返回实体类。

c.load()和get()都会先从Session缓存中查找,如果没有找到对应的对象,则查询Hibernate二级缓存,再找不到该对象,则发送一条SQL语句查询。

总之对于get和load的根本区别,一句话,hibernate对于load方法认为该数据在数据库中一定存在,可以放心的使用代理来延迟加载,如果在使用过程中发现了问题,只能抛异常;而对于get方法,hibernate一定要获取到真实的数据,否则返回null。

  1. Hibernate如何实现对象之间一对一的映射。一对一的映射有几种方式

A.以主键关联:关联的两个实体共享一个主键

具体映射:

(主表User)

<class name=”com.softfz.pojo.TUser” table=”T_USER”>

<id name=”userid” type=”java.lang.Long”>

<column name=”USERID” precision=”22″ scale=”0″ />

<generator class=”sequence”>

<param name=”sequence”>seq_t_user</param>

</generator>

</id>

<one-to-one name=”userInfo” cascade=”all”></one-to-one>

</class>

(从表UserInfo)

<class name=” com.softfz.pojo.UserInfo” table=”T_USERINFO ”>

<id name=”userid”>

<!– userInfo的主键来源user,也就是共享user的主键 –>

<generator class=”foreign”>

<param name=”property”>user</param>

</generator>

</id>

<!– one-to-one标签的含义,指示hibernate怎么加载它的关联对象,默认根据主键加载,constrained=”true”, 表明当前主键上存在一个约束,UserInfo的主键作为外键参照了user–>

<one-to-one name=”user” constrained=”true”/>

</class>

B.一对一以外键关联: 两个实体各自有不同的主键,但是一个实体有一个外键引用另一个实体的主键。

(从表UserInfo)

<class name=” com.softfz.pojo.UserInfo” table=”T_USERINFO ”>

<id name=”userInfoId” type=”java.lang.Long”>

<column name=”USERID” precision=”22″ scale=”0″ />

<!– userInfo的主键来源由序列生成 –>

<generator class=”sequence”>

<param name=”sequence”>seq_t_userinfo</param>

</generator>

</id>

<!—may-to-one表示user和userinfo是一对多的关系,userinfo的外键 – userid参考user的主键,unique 表示这是一种特殊的一对多->

<many-to-one name=”user” column=”userid” unique=”true”>

</many-to-one>

</class>

  1. Hibernate如何实现对象之间的一对多映射。并且如何对Set集合中的列表数据进行排序

(主表User)

<class name=”com.test.hibernate.User” table=”TBL_USER”>

<id name=”id” column=”userId”><generator class=”native”/></id>

<set name=”addresses” cascade=”all” inverse=”true” >

<!– 从表的外键字段 –>

<key column=”userid”/>

<one-to-many class=”com.test.hibernate.Address”/>

</set>

</class>

(主表Address)

<class name=”com.test.hibernate.Address” table=”TBL_ADDRESS”>

<id name=”id” column=”addressId”> <generator class=”native”/></id>

<!—column表示从表的外键字段userid参考了user的主键 –>

<many-to-one name=”user” class=”com.softfz.pojo.TUser” column=”userid”>

</many-to-one>

</class>

  1. Hibernate如何实现对象之间的多对多的映射

(主表User)

<class name=” com.softfz.pojo.User” table=”T_USER”>

<id name=”id” column=”userId”><generator class=”native”/></id>

<set name=”roles” table=”t_user_role” cascade=”save-update” >

<!– column指中间表的外键字段 –>

<key column=”useridd”></key>

<!– column指与从表相关联的中间表的外键字段 –>

<many-to-many class=”com.softfz.pojo.TRole” column=”roleidd”>

</many-to-many>

</set>

</class>

(从表role)

<class name=”com.softfz.pojo.TRole” table=”T_ROLE” >

<id name=”id” column=”userId”><generator class=”native”/></id>

<set name=”users” table=”t_user_role” cascade=”save-update”>

<!– column指中间表的外键字段 –>

<key column=”roleid”></key>

<!– column指与从表相关联的中间表的外键字段 –>

<many-to-many class=”com.softfz.pojo.TUser” column=”userid”>

</many-to-many>

</set>

</class>

  1. Hibernate框架中,如何实现对象数据之间的内连接操作

hql = ”Select a,b From Orderinfo a,Orderdetail b where a.autoid = b.orderid”;

特点:无需配置Orderinfo和Orderdetail的关联关系。

  1. Hibernate框架中,如何实现对象数据这间的左外连接操作

hql = ”Select a From Orderinfo a left join a.orderDetails”;

特点:必须配置Orderinfo与orderDetails之间的关联关系。

  1. 如何在Hibernate中实现对数据的批量删除和批量更新

通过Hibernate的session.delete(“from TUser”)进行批量操作有如下缺点:

(1) 占用大量内存,必须把1万个TUser对象先加载到内存,然后一一通过主键删除他们。

(2) 执行的delete语句的数目太多,每个delete语句只能更新一个Customer对象,必须通过1万条delete语句才能删除一万个TUser对象,频繁的访问数据库,会大大降低应用的性能。

直接通过Hibernate API进行批量更新和批量删除都不值得推荐。而直接通过JDBC API执行相关的SQL语句或调用相关的存储过程,是批量更新和批量删除的最佳方式,这两种方式都有以下好处:

(1) 无需把数据库中的大批量数据先加载到内存中,然后逐个更新或修改他们,因此不会消耗大量内存。

(2) 能在一条SQL语句中更新或删除大批量的数据。

上一篇:Hibernate面试题分析
下一篇:SSH面试题
还没有评论!
54.198.28.114