`
xiaolongRen_will
  • 浏览: 28063 次
  • 性别: Icon_minigender_1
  • 来自: 天津
社区版块
存档分类
最新评论

Hibernate中标识符的类型和应用详解

阅读更多

标识符生成器                              描述
Increment 适用于代理主键。      由hibernate自动以递增的方式生成标识符,每次增量为1
Identity 适用于代理主键。         由底层数据库生成标识符。条件是数据库支持自动增长数据类型。
Sequence 适用于代理主键。      Hibernate根据底层数据库序列生成标识符。条件是数据库支持序列。
Hilo 适用于代理主键。               Hibernate根据hign/low算法生成标识符。Hibernate把特定表的字段作为“hign”值。  默认情况下,采用hibernate_unique_key表的next_hi字段。


Native 适用于代理主键。           根据底层数据库对自动生成标识符的能力来选择identity、sequence、hilo
Uuid.hex 适用于代理主键。         Hibernate采用128位的UUID算法来生成标识符。该算法能够在网络环境中生成唯一的字符串标识符,这种策略并不流行,因为字符串类型的主键比整数类型的主键占用更多的数据库空间。


assigned 适用于自然主键。        由java程序负责生成标识符。不能把setID()方法声明为Private的。尽量避免使用自然主键。

 

====================

ncrement:使用increment方式时,hibernate将按照递增的方式设定主键,具体的方式是,先获取当前记录主键的最大值,然后再将该值加1作为主键。

select max(id) from table;

<id name=“id” type=“long” column=“ID”>
      <generator class=“increment”/>
</id>
适用范围:
1。由于不依赖与底层数据库,适合所有的数据库系统。
2。单个进程访问同一个数据库的场合,集群环境下不推荐适用。
3。OID必须为long、int或short类型,如果把OID定义为byte类型,抛异常。

====================

Identity:identity方式表示数据库的主键生成方式为采用数据库的主键生成机制,例如SQL Server或MySQL的自动主键生成机制。
  由底层数据库生成标识符.需要把字段定义成自增型。
  my sql 中为auto_increment
  ms sql server中为identity
  <generator  class=“identity” />
//////////////////////////////////////////
使用mysql
      <generator class="identity">
           <param name="identity">auto_increment</param>
      </generator>
mysql表:
create table CUSTOMER(
     ID int  NOT NULL auto_increment primary key,
     NAME varchar(15) not null,
     EMAIL varchar(128) not null
);

====================

Sequence:这种方式针对由序列方式产生主键的数据库,例如Oracle。在<generator>的子元素<param name=“sequence”>指定用作产生
    主键的序列名称。
<id name=“id” type=“long” column=“ID”>
      <generator class=“sequence”>
              <param name=“sequence”>tester_id_seq</param>
      </generator>
</id>

适用范围:
底层数据库要支持序列。Oracle DB2 SAP等。
OID必须为long、int或shot类型,如果把OID定义为byte类型,运行时抛异常。

====================

Hilo:Hilo标识符生成器由Hibernate按照一种hign/low算法来生成标识符,它从数据库的特定表的字段中获取high值。
<id name=“id” type=“long” column=“ID”>
     <generator name=“hilo”>
             <param name=“table”>hi_value</param>
             <param name=“column”>next_value</param>
             <param name=“max_lo”>100</param>
     </generator>
</id>

使用范围:
该机制不依赖于底层数据库,因此适用于所有的数据库系统。
OID必须为long、int、short类型,如果为byte类型的话,会抛出异常。
org.hibernate.id.IdentifierGeneratorException:this id generator generates
Long、integer、short。

====================

Native:native方式意味着将主键的生成机制交由Hibernate决定,Hibernate会根据配置文件中的方言(Dialect)定义,采用不同的数据库特定的主键生成方式。

<id name=“id” type=“native” column=“ID”>
      <generator class=“native” />
</id>

 

适用范围:
该类型能根据底层数据库系统的类型,自动选择合适的标识符生成器,因此很适合于跨数据
库的平台,即在同一个应用中需要连接多种数据库系统的场合。
OID必须为long、int、short类型,如果为byte类型的话,会抛出异常。
Org.hibernate.id.IdentifierGeneratorException:this id generator generates
Long、integer、short。

====================

assinged:assinged方式意味着将主键的生成机制交由应用程序自己控制。只需要在持久化之前传入对象主键值即可。

<id name=“id” column=“ID”>
      <generator class=“assinged” />
</id>

====================

推荐的

hibernate增强的标识符生成器:org.hibernate.id.enhanced.TableGenerator:这个生成器定义了一个可以利用多个不同的键值记录存储大量不同增量值的表。

table_name(可选 — 默认是 hibernate_sequences):所用的表的名称
value_column_name(可选 — 默认为 next_val):用于存储这些值的表的字段的名字
segment_column_name(可选,默认为 sequence_name):用于保存 "segment key" 的字段的名

segment_value(可选,默认为 default):我们为这个生成器获取增量值的 segment 的
"segment key"
initial_value(可选 — 默认是 1):从表里获取的初始值
increment_size(可选 — 默认是 1):对表随后的调用应该区分的值


<id name="id" type="long" column="id">
 <generator class="org.hibernate.id.enhanced.TableGenerator">
  <param name="segment_value">customer</param>
 </generator>
</id>

====================

映射复合主键

<composite-id>
            <key-property name="firstname" type="java.lang.String">
                <column name="FIRSTNAME" length="16" />
            </key-property>
            <key-property name="lastname" type="java.lang.String">
                <column name="LASTNAME" length="16" />
            </key-property>
  </composite-id>

 

可以使用StudentsinfoId属性来设置联合主键
 <composite-id name="id" class="com.oristand.StudentsinfoId">
            <key-property name="firstname" type="java.lang.String">
                <column name="FIRSTNAME" length="16" />
            </key-property>
            <key-property name="lastname" type="java.lang.String">
                <column name="LASTNAME" length="16" />
            </key-property>
 </composite-id>
使用联合主键的持久化类需要实现serializable接口和覆盖equals()、
 hashCode()方法。

分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

    Hibernate配置文件中映射元素详解

    【Hibernate配置文件中映射元素详解】 在对象关系映射(ORM)框架Hibernate中,对象与数据库表之间的关联是通过一个XML配置文件来定义的。这个XML文件包含了映射元素,用于描述Java类如何转化为数据库中的表。映射...

    hibernate包详解+hibernatePPT

    总结来说,Hibernate作为Java中的主流ORM框架,简化了Java应用与数据库的交互,通过对象化的操作方式,使得开发者可以更加专注于业务逻辑,而不是底层的SQL操作。理解并掌握Hibernate的使用,对于提升Java Web开发...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part2

     11.1.2 Java时间和日期类型的Hibernate映射类型  11.1.3 Java大对象类型的Hibernate映射类型  11.1.4 JDK自带的个别Java类的Hibernate映射类型  11.1.5 使用Hibernate内置映射类型  11.2 客户化映射类型  ...

    hibernate。hbm.xml配置详解

    在 Hibernate 中,`hbm.xml` 文件是用于定义对象与数据库表之间映射的元数据文件。这篇文档将深入解析 `hbm.xml` 配置的各个方面。 ### 1. `hbm.xml` 文件结构 `hbm.xml` 文件的开头通常包含 XML 声明和 DTD 引用...

    Hibernate 参数配置详解

    ### Hibernate 参数配置详解 #### 一、概述 Hibernate 是一款流行的 Java 持久层框架,它通过提供一套丰富的 API 和配置选项来...希望本文能够帮助您更好地理解和应用 Hibernate 配置,为您的项目带来更大的价值。

    精通 Hibernate:Java 对象持久化技术详解(第2版).part4

     11.1.2 Java时间和日期类型的Hibernate映射类型  11.1.3 Java大对象类型的Hibernate映射类型  11.1.4 JDK自带的个别Java类的Hibernate映射类型  11.1.5 使用Hibernate内置映射类型  11.2 客户化映射类型  ...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part3

     11.1.2 Java时间和日期类型的Hibernate映射类型  11.1.3 Java大对象类型的Hibernate映射类型  11.1.4 JDK自带的个别Java类的Hibernate映射类型  11.1.5 使用Hibernate内置映射类型  11.2 客户化映射类型  ...

    hibernate持久化技术详解.孙卫琴.代码2

    **hibernate持久化技术详解** Hibernate是一款强大的Java对象关系映射(ORM)框架,它为开发者提供了在Java应用中操作数据库的强大工具。通过Hibernate,开发者可以将数据库操作转化为对Java对象的操作,大大降低了...

    hibernate配置参数详解

    ### Hibernate配置参数详解 #### 一、数据库连接配置 在Hibernate框架中,为了与数据库进行交互,必须正确地配置数据库连接参数。以下是一些关键的配置项及其含义: 1. **`hibernate.connection.driver_class`**:...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part1.rar

     11.1.2 Java时间和日期类型的Hibernate映射类型  11.1.3 Java大对象类型的Hibernate映射类型  11.1.4 JDK自带的个别Java类的Hibernate映射类型  11.1.5 使用Hibernate内置映射类型  11.2 客户化映射类型  ...

    hibernate[1].cfg.xml中配置信息详解

    本文将详细介绍`hibernate.cfg.xml`中各个配置项的意义及其可能的取值,帮助开发者更好地理解和应用这些配置。 #### 二、核心配置属性 ##### 1. `hibernate.dialect` **用途**:指定Hibernate使用的方言(Dialect...

    hibernate各种主健详解

    ### Hibernate 主键生成策略详解 在使用Hibernate框架进行持久化操作时,主键...此外,随着技术的发展和应用场景的变化,新的主键生成策略可能会不断出现,开发者也应关注这些新特性,以便更好地满足项目的实际需求。

    hibernate各种常用方法的详解

    ### Hibernate 常用方法详解 #### 一、前言 Hibernate 是一款强大的对象关系映射(ORM)框架,它简化了 Java 应用程序与数据库之间的交互过程。本文将详细介绍 Hibernate 中常用的几种方法,包括 `save`, `update`...

    Hibernate 中文api文档

    描述中的"博文链接:https://manboye.iteye.com/blog/1769261"提供了额外的资源,暗示可能存在一个相关的博客文章或者讨论,可能包含了作者对Hibernate的一些理解和应用实例,对于深入理解Hibernate可能是有价值的...

    Hibernate知识点总结

    它通过使用描述对象和数据库之间映射的元数据,将应用业务逻辑中使用的Java对象自动持久化到关系型数据库中。 **对象的持久化**:指将程序中的对象状态存储到持久存储设备(如磁盘)上,以便在后续的时间点可以恢复...

    Hibernate实战(第2版 中文高清版)

     10.1.2 Hibernate应用程序中的事务   10.1.3 使用Java Persistence的事务   10.2 控制并发访问   10.2.1 理解数据库级并发   10.2.2 乐观并发控制   10.2.3 获得额外的隔离性保证   10.3 非事务数据...

    hibernate详解

    它们需要包含用于访问字段的getter和setter方法,以及可选的标识符属性(主键)。Hibernate支持继承、生命周期回调、合法性检查等特性,以便更好地模拟对象行为。 4. **O/R Mapping基础**:映射声明是将Java类与...

Global site tag (gtag.js) - Google Analytics