码迷,mamicode.com
首页 > Web开发 > 详细

Hibernate 知识点梳理

时间:2015-07-16 19:20:31      阅读:137      评论:0      收藏:0      [点我收藏+]

标签:

1、对持久化对象的要求

    1)提供一个无参构造器

    2)提供一个标识属性,如id,通常映射为数据库表的主键字段。

    3)为持久化类的字段提供get、set方法。

        注:但不一定所有字段都这么做,对于不提供get、set方法的字段,在映射文件(*.hbm.xml)中要进行处理。

        例如某个属性description未设置get、set方法,则其映射为:

                 <property name="description"  type="string"  column="descri" access="field"></property>

   4)类不能定义为final的

   5)若要把持久化类的实例放到set中,应重写持久化类的equals()、hashCode()方法

 

2、使用基本数据类型和包装类型的区别

    1)基本数据类型和包装类型对应的hibernate映射类型相同(映射是一样的);

    2)但基本类型可以直接运算、无法表达null、默认为0;

    3)包装类默认为null,对于默认值有实际业务意义的要使用包装类

    例如:Student类有一个int类型的score属性,表示学生的考试分数.int类型的score属性无法表达这样的业务需求:

       * 如果score的属性为null,表示该学生的成绩是未知的,有可能得了100分,也有可能得了0分,只是暂时还不知道成绩

       * 如果scope属性为0,表示学生考试成绩为0分.

       * 在上面的情况中必须使用包装类型

 

3、 持久化类属性的策略  

    propertye (默认值):

    表明hibernate通过getXXX和setXXX来访问类属性。推荐使用。提高域(对象)模型透明性。

    field

    hibernate通过java反射机制直接访问类属性。对于没有get与set方法的属性可设置该访问策略。

    noop

    它映射Java持久化类中不存在的属性,即主要用于HQL(用query接口测试,使用hql语句)中,当数据库中有某列,而实体中不存在的情况。

    

技术分享
1 <!-- 该属性在Customer类中有get与set方法 -->
2 <property name="name" column="name" type="string"/>
3 
4 <!-- 该属性在Customer类中不存在get和set方法 -->
5 <property name="name" column="name" type="string" access="field" />
6 
7 <!-- 该属性在Customer类中不存在,但在数据库存在该字段。
8 使用noop处理,查询的时候忽略该字段-->
9 <property name="name" column="name"  type="string" access="noop"/>
属性策略示例

 

4、Java语言按内存地址(==)或equals()方法区分不同的对象

     Hibernate中用对象标识符(OID)来区分对象

5、主键

    1)必备条件

         不能为null。

         唯一,不能重复。

         永远不会改变。

    2)主键分类  

       业务主键(自然主键):在数据库表中把具有业务逻辑含义的字段作为主键,称为“自然主键(Natural Key)”。

       逻辑主键(代理主键):在数据库表中采用一个与当前表中逻辑信息无关的字段作为其主键,称为“代理主键”。 

       复合主键(联合主键):通过两个或者多个字段的组合作为主键。

       自然主键:把具有业务含义的字段作为主键叫做自然主键。

       代理主键:不具备业务含义的字段,该字段一般取名为“id”。(推荐)

   3)生成策略

        Increment

        increment 标识符生成器由 Hibernate 以递增的方式为代理主键赋值

        Hibernate 会先读取表中的主键的最大值,向表中插入记录时, 就在 max(id) 的基础上递增,增量为1。

        适用范围:

           a  由于 increment生存标识符机制不依赖于底层数据库系统,因此它适合所有的数据库系统。

           b  适用于只有单个 Hibernate 应用进程访问同一个数据库的场合,在多线程情况下会有问题。

           c  OID必须为long、int或 short 类型,如果把OID定义为byte类型,在运行时会抛出异常。

       Identity

       identity 标识符生成器由底层数据库来负责生成标识符, 它要求底层数据库把主键定义为自动增长字段类型。

       适用范围:

        a  由于 identity 生成标识符的机制依赖于底层数据库系统,因此,要求底层数据库系统必须支持自动增长字段类型。支持自动增长字段类型的数据库包括:DB2、        Mysql、MSSQLServer、Sybase等。

        b  OID 必须为 long, int 或 short 类型, 如果把 OID 定义为 byte 类型, 在运行时会抛出异常。

 

      Sequence

      sequence  标识符生成器利用底层数据库提供的序列来生成标识符.

      Hibernate 在持久化一个 News 对象时, 先从底层数据库的 news_seq 序列中获得一个唯一的标识号, 再把它作为主键值

      适用范围:

        a  由于 sequence 生成标识符的机制依赖于底层数据库系统的序列,因此,要求底层数据库系统必须支持序列。支持序列的数据库包括:DB2 Oracle 等。

        b  OID 必须为 long, int 或 short 类型, 如果把 OID 定义为 byte 类型, 在运行时会抛出异常。

     

      Hilo

      hilo 标识符生成器由 Hibernate 按照一种 high/low 算法*生成标识符, 它从数据库的特定表的字段中获取 high 值,默认情况下,采用hibernate_unique_key表的next_hi字段。

      Hibernate 在持久化一个 News 对象时, 由 Hibernate 负责生成主键值. hilo 标识符生成器在生成标识符时, 需要读取并修改 HI_TABLE 表中的 NEXT_VALUE 值.

      适用范围:

              a  由于 hilo 生存标识符机制不依赖于底层数据库系统, 因此它适合所有的数据库系统

              b  OID 必须为 long, int 或 short 类型, 如果把 OID 定义为 byte 类型, 在运行时会抛出异常

     

     Native

     native 标识符生成器依据底层数据库对自动生成标识符的支持能力, 来选择使用 identity, sequence 或 hilo 标识符生成器.

     适用范围:

        a  由于 native 能根据底层数据库系统的类型, 自动选择合适的标识符生成器, 因此很适合于跨数据库平台开发

        b  OID 必须为 long, int 或 short 类型, 如果把 OID 定义为 byte 类型, 在运行时会抛出异常

     

     UUID

     适用于代理主键。Hibernate采用128位的UUID算法来生成标识符。该算法能够在网络环境中生成唯一的字符串标识符,这种策略并不流行,因为字符串类型的主键比整数类型的主键占用更多的数据库空间。

     适用范围:

         a  不依赖于底层数据库系统, 因此它适合所有的数据库系统

         b  OID 必须为String类型

     Assigned

      表示手工指定主键的值,适用于自然主键

Hibernate 知识点梳理

标签:

原文地址:http://www.cnblogs.com/java-wgm/p/hibernate.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!