Hibernate大纲答案

1、说出orm的作用

它的主要工作是将对象数据保存到关系数据库的表中,以及将关系数据库表中数据读入到对象中。

2、简述使用Hibernate的基本流程。

(1)启动Hibernate Configuration cfg=new Configuration().configure();

(2)写Hibernate的配置文件;

(3)写持久类的映射文件(*.hbm.xml);

(4)Configuration实例构建一个sessionFactory实例;

(5)创建Session实例;

(6)由Session实例创建Transaction的一个实例,开启事务;

(7)通过Session接口提供的各种方法操作数据库

(8)提交或回滚事务;

(9)关闭Session。

3、叙述Hibernate应用的主要接口和类

• 接口:SessionFactory接口、Session接口、Transaction接口

• 类:Configuration类

4、解释Hibernate全局配置文件中常用标记的使用(配置文件是什么及其作用)

connection.driver_class:设置连接数据库的驱动。
          connection.url:设置所需要连接数据库服务的URL。
          connection.username:连接数据的用户名。
          connection.password:连接数据的密码
          dialect:设置连接数据库使用的方言
          hbm2ddl.auto:设置当创建SessionFactory时,是否根据映射文件自动建立数据。
 
          一般hibernate.cfg.xml的配置文件如下(以SQL2005为例):
[html] 
<hibernate-configuration> 
    <session-factory> 
        <!-- 指定连接数据库所用的驱动 --> 
        <property name="connection.driver_class">com.microsoft.sqlserver.jdbc.SQLServerDriver</property> 
        <!-- 指定连接数据的url --> 
        <property name="connection.url">jdbc:sqlserver://localhost:1433;databaseName=test</property> 
        <!-- 指定连接数据库的用户名 --> 
        <property name="connection.username">sa</property> 
        <!-- 指定数据库的密码--> 
        <property name="connection.password">*****</property> 
        <!-- 指定连接池里最大的连接数 --> 
        <property name="hibernate.c3p0.max_size">200</property> 
        <!-- 指定连接池里最小的连接数 --> 
        <property name="hibernate.c3p0.min_size">1</property> 
        <!-- 指定连接池里连接的超时时长 --> 
        <property name="hibernate.c3p0.timeout">5000</property> 
        <!-- 指定连接池里最大缓存多少个Statement对象 --> 
        <property name="hibernate.c3p0.max_statements">100</property> 
        <property name="hibernate.c3p0.idle_test_period">3000</property> 
        <property name="hibernate.c3p0.acquire_increment">2</property> 
        <!-- 显示sql语句 --> 
        <property name="hibernate.show_sql">true</property> 
        <!-- 指定数据库方言 --> 
        <property name="dialect">org.hibernate.dialect.SQLServerDialect</property> 
        <!-- 根据需要自动创建数据表 --> 
        <property name="hbm2ddl.auto">create</property> 

5、解释对象关系映射文件中常用标记的使用

<!-- package表示所映射的类所在包 -->

<hibernate-mapping

package="com.hbsi.domain">

<class name="User" table="user">

<!-- unsaved-value的值来代表后面saveOrupdate方法的判断依据,如果为-1,是-1为脱管态,不是-1是瞬时态 -->

<id name="id"unsaved-value="-1">

<generator class="native"/>

</id>

<!-- 表示name 的属性 -->

<property name="name"/>

<property name="birthday"/>

</class>

</hibernate-mapping>

6、阐述常用对象标识符生成器的作用

标识符生成器描述

increment适用于代理主键。由Hibernate自动以递增方式生成。

identity适用于代理主键。由底层数据库生成标识符。

sequence适用于代理主键。Hibernate根据底层数据库的序列生成标识符,这要求底层数据库支持序列。

hilo适用于代理主键。Hibernate分局high/low算法生成标识符。

seqhilo适用于代理主键。使用一个高/低位算法来高效的生成long,short或者int类型的标识符。

native适用于代理主键。根据底层数据库对自动生成标识符的方式,自动选择identity、sequence或hilo。

uuid.hex适用于代理主键。Hibernate采用128位的UUID算法生成标识符。

uuid.string适用于代理主键。UUID被编码成一个16字符长的字符串。

assigned适用于自然主键。由Java应用程序负责生成标识符。

foreign适用于代理主键。使用另外一个相关联的对象的标识符。

7、解释Hibernate数据类型在Java数据类型与SQL数据类型之间的桥接作用

举例说明:当实体类中对象定义的是String类型时,映射文件中的type=string,数据库中的类型时varchar或char类型。

8、叙述Hibernate持久化生命周期及状态转换(Hibernate对象的三种状态是什么?)

(1)瞬时状态:数据库中没有数据与之对应,一般是new出来且与session没有关联的对象。

(2)持久化状态:数据库中可能有数据与之对应,当前与session有关联,并且相关联的session没有关闭,事务没有提交;

(3)托管状态:数据库中可能有数据与之对应,但当前没有session与之关联;

状态转换:当对象状态是瞬时状态时,调用sava()或saveOrUpdate()方法时变成持久化状态;在持久化的状态下执行close()或clear()就会变成托管状态;反之,当是托管状态下执行lock()、saveOrUpdate()、update()就会变成持久化状态,执行delete()就又变回瞬时状态。

9、编写一个CRUD示例来运用Session中的常用方法

• 

10、说说Hibernate中的update()和saveOrUpdate()的区别。

(1)操作持久化对象—update():是一个托管对象变为持久化对象,并且计划执行一条update语句;

(2)saveOrUpdate():该方法同时包含save和update方法,如果参数是瞬时对象就用save方法,如果是托管对象就用update方法,如果是持久化对象就直接返回。

11、分类叙述出Set、Bag、List、Map的映射方式

1.在映射文件中选择映射方式是根据定义的集合来选择的:

2、Set:

    Set集合属性映射与List非常相似,但因为Set是无序的,不可重复的集合。因此set元素无须使用index元素来指定集合元素次序。映射文件与List相似,区别在于使用set元素时,无须增加index列来保存集合的次序。映射 Set 集合属性时,如果 element 元素包括 not-null = “true” 属性,则集合属性表以关联持久化类的外键和元素列作为联合主键,否则该表没有主键。但 List 集合属性不会,List 集合属性总是以外键列和元素此序列作为联合主键。

       <set name="定义的集合名 " table=" 列名">

       <key column="外键列名"/>

       <element type="集合值的类型" column="键名"/>

    </set>

3、(1)List:

•  List是有序集合,因此持久化到数据库时也必须增加一列来表示集合元素的次序在作相应映射时,list元素要求用list-index的子元素来映射有序集合的次序列。集合的属性的值会存放有另外的表中,不可能与持久化类存储在同一个表内。因此须以外键关联,用Key元素来映射该外键列。如果要设置列的添加顺序在映射文件中使用<list>.如果由于习惯不在映射文件中设置列的添加顺序则在映射文件中使用<bag>

 

       <list name="" table=”">

    <key column=" "/>

    <list-index column=" "/><!--指定某一列添加顺序-->

    <element type=" " column=" "/>

   

    </list>

(2)bag: 使用bag元素都将被映射成无序集合,而集合属性对应的表没有主键。Bag 元素只需要 key 元素来映射外键列,使用 element 元素来映射集合属性的每个元素

<bag name=" " table=" ">

       <key column=" "/>

       <element type=" " column=" "/>

    </bag>

4、map:map集合设置的是键值对。不仅需要映射属性值,还需要映射属性Key。映射Map集合属性时,同样需要指定外键列,同时还必须指定Map的Key列。系统将以外键列和Key列作为联合主键。 Map集合属性使用map元素映射时,该map元素需要key和map-key两个子元素。其中key子元素用于映射外键列,而map-key子元素则用于映射Map集合的Key。而map-key和element元素都必须确定type属性 

 

 其映射文件为:

<map name=" " table=" ">

<key column=" "/>外键列

        <map-key type="键的类型" column="键名 "/> map中的键

        <element type=" " column=" "/>map中的值

    </map>

12、编写订单和客户的单向多对一映射示例

<hibernate-mapping package="com.hbsi.many2one">

    <class name="Order" table="orderlist">

        <id name="id">

            <generator class="native" />

        </id>

        <property name="price" column="price" type="string"/>

        <property name="number" column="number" type="int"/>

        <many-to-one name="cus" column="cus_id"/>

    </class>

</hibernate-mapping>

13、编写客户与订单的单向一对多映射示例

<hibernate-mapping package="com.hbsi.one2many">

    <class name="Customer" table="customer">

        <id name="id">

            <generator class="increment" />

        </id>

        <property name="username" column="username" type="string"/>

        <property name="phone" column="phone" type="string"/>

        <set name="order" table="orderlist" cascade="save-update">

        <key column="cus_id"/>

        <one-to-many class="Order"/>

        </set>

        

    </class>

</hibernate-mapping>

14、编写客户与订单的双向一对多映射示例

<hibernate-mapping package="com.hbsi.one2manyboth">

    <class name="Customer" table="customer">

        <id name="id">

            <generator class="native" />

        </id>

        <property name="username" column="username" type="string"/>

        <property name="phone" column="phone" type="string"/>

        

        <set name="orders" table="orderlist" cascade="save-update,delete" inverse="true">

        <key column="cus_id"/>

        <one-to-many class="Order"/>

        </set>

    </class>

</hibernate-mapping>

15、叙述inverse属性的作用

作用:表示是否放弃维护关联关系;当inverse=true时表示放弃维护关联关系。

16、编写客人与房间的单向一对一基于主键的映射示例

<hibernate-mapping package="com.hbsi.one2one_pk">

   <class name="Citizien" table="citizien_pk">

      <id name="id" column="id">

        <generator class="foreign">

        <param name="property">idcard</param>

        </generator>

      </id>

      <property name="name" column="name" type="string"/>

      <one-to-one name="idcard" constrained="true" cascade="all"/>

   </class>

</hibernate-mapping>

17、编写客人与房间的单向一对一基于外键的映射示例

<hibernate-mapping package="com.hbsi.one2one_fk">

   <class name="Citizien" table="citizien">

      <id name="id" column="id">

        <generator class="native"/>

      </id>

      <property name="name" column="name" type="string"/>

      <many-to-one name="idcard" column="id_card" unique="true" cascade="save-update"/>

   </class>

</hibernate-mapping>

18、编写客人与房间的双向一对一映射示例

<hibernate-mapping package="com.hbsi.one2oneboth_fk">

   <class name="Citizen" table="citizen_fk">

      <id name="id" column="id">

        <generator class="native"></generator>

      </id>

      <property name="name" column="name" type="string"/>

      <many-to-one name="idcard" unique="true" column="id_card" cascade="all"/> 

   </class>

</hibernate-mapping

19、编写用户和角色的单向多对多映射示例

20、编写用户和角色的双向多对多映射示例

21、叙述三种常用继承映射的优缺点

(1)一个类继承体系一张表:优缺点:这种设计方式符合关系模型的设计原则,但有表中存在重复字段的问题。如果需要对基类进行修改,则需要对基类以及该类的子类所对应的所有表都进行修改,映射的灵活性很大,子类可以包括基类属性在内的每一个属性进行单独配置,对于子类的查询只需要访问单独的表,对父类查询怎需要检索所有的表,对于单个对象持久话操作只需要处理一个表

(2)每个子类一张表:优缺点:这种设计方式完全符合关系模型的设计原则,且不存在冗余,维护起来比较方便,对每个类的修改只需要修改其所对应的表,灵活性很好,完全是参照对象继承的方式进行配置,对于父类的查询需要使用左外链接,对于子类查询需要使用内链接,对于子类的持久话至少要处理两个表

(3)混合使用“一个类继承体系一张表”和“每个子类一张表” :优缺点:首先表中引入的区分子类的字段,也就是包括了描述其他字段的字段。其次,如果某个子类的某个属性不能为空,那么在数据库一级不能设置该字段not null(非空),维护起来方便,只需要修改一个表,灵活性差,表中冗余字段会随着子类的增多而越来越多,在任何情况下,都只需处理一个表,对于单个对象的持久话操作只需要处理一个表

22、Hibernate有哪几种查询数据的方式

(1)HQL查询、命名查询

(2)Criteria查询(条件查询)

(3)get查询、load查询、连接查询、抓取连接查询

(4)Sql原生态语句查询、分页查询、投影查询、子查询

23、阐述左连接查询和左连接抓取查询的异同

(1)不同点:左连接查询与左连接抓取查询的sql语句中左连接抓取查询多fetch

(2)连接多个表,左边的表的记录都能查询出来。

24、叙述Criteria的使用步骤

(1)创建Criteria对象;

(2)判断查询条件;如果条件符合使用add方法

(3)按条件排序

25、阐述事务管理的步骤

(1)在hibernate.cfg.xml中指定Hibernate事务为JDBCTransaction

(2)使用JTATransaction需要配置hibernate.transaction.factory_class参数,该参数缺省值是org.hibernate.transaction. JDBCTransactionFactory,当使用JTATransaction时需要将该参数改成org.hibernate.transaction.JTATransactionFactory,并配置jta.UserTransaction参数JNDI名(Hibernate在启动JTATransaction时要用该值到JNDI的上下文Context中去找javax.transaction.UserTransaction)。

26、解释并发引起的各种问题

(1)丢失更新

(2)脏读

(4)不可重复读

(5)幻读

27、编写程序来演示乐观锁的作用

28、叙述悲观锁的实现原理及使用步骤

• 实现方式是由数据库来实现,采用独占锁来锁定资源。使用get(),load(),是可以显示指定锁定模式:LockMode.UPGRADE

     Session.get(Student.class,1,LockMode.UPGRADE);

29、分析各种延迟加载策略的异同点

(1)对象的延迟加载

(2)对象里的属性延迟加载

(3)集合延迟加载

30、鉴别各种抓取策略的异同点

(1)单端关联<many-to-one><ont-to-many>上的抓取策略

 可以给单端关联的映射元素添加fetch属性。fetch属性 有2个可选值

   (a)select:是默认值,它的策略是当需要使用到关联对象的数据时,另外单独发送一条select语句      抓取当前对象的关联对象的数据。即延迟加载。

   (b)join:它的策略是在同一条select语句使用连接来获得对象的数据和它关联对象的数据,此时关      联对象的延迟加载失效。

(2)集合属性上的抓取策略

在集合属性的映射元素上可以添加fetch属性,它有3个可选值

   (a)select:作为默认值,它的策略是当需要使用所关联集合的数据时,另外单独发送一条select语句抓取当前对象的关联集合,即延迟加载。   

   (b)join:在同一条select语句使用连接来获得对方的关联集合。此时关联集合上的lazy会失效。

  (3)subselect:另外发送一条查询语句(或子查询语句)抓取在前面查询到的所有实体对象的关联集合。这个策略对HQL的查询也起作用。

31、简述hibernate的缓存机制

•    Hibernate中提供两级缓存,第一级别的缓存是Session级别的缓存,它是属于事务范围的缓存。 

•    第二级别的缓存是SessionFactory级别的缓存,它是属于进程范围范围的缓存,这一级别的缓存可以进行配置和更改,并且可以动态加载和卸载。

•    Hibernate还为查询结果提供一个查询缓存,它依赖于二级缓存。

32、归纳一级缓存的管理方式

• Session级别的缓存由hibernate自动管理。

33、session的load()和get()的区别。

 (1)load()是延迟加载;get()是立即加载;

 (2)延迟加载时输出不能放在session.close()之后;必     须使用在session之内产生一个代理对象;

 (3)只需要访问对象标识符属性时,只需要用load加载;

34、说明Hibernate应用优化的手段

(1)延迟加载技术

(2)管理数据抓取策略

(3)进行缓存管理

posted @ 2013-01-09 15:21  流-星-追-月  阅读(181)  评论(0编辑  收藏  举报