`

hibernate映射对象标识符

 
阅读更多

(一)、标示符的概念

Java按内存地址区分同一个类的不同对象,关系数据库用主键区分同一个表的不同记录,Hibernate使用OID(对象标识符)来建立内存中的对象和数据库中记录的对应关系。

对象的OID和数据库表的主键对应。为保证OID的唯一性和不可变性,应该让Hibernate而不是应用程序来为OID赋值。


(二)、关系数据库按主键区分不同记录

主键必备条件:

1、不允许null

2、唯一,不重复

3、值永远不会改变

  • 自然主键:把具有业务含义的字段作为主键叫做自然主键。
  • 代理主键:不具有业务含义,推荐使用。

(三)、hibernate的对象标示符

OID是关系数据库中的主键在java对象模型中的等价物。在运行时,hibernate根据OID来维持java对象和数据库记录的对应关系。

Customer c1 = (Customer)session.get(Customer.class,newLong(1));
Customer c2 = (Customer)session.get(Customer.class,newLong(1));
Customer c3 = (Customer)session.get(Customer.class,newLong(3));
c1 == c2 ?
c1 == c3 ?

1、对象标示符的类型:


标识符生成器

描述

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的。尽量避免使用自然主键。


2、Hibernate内置标识符用法

(1)、Increment

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

selectmax(id) from table;

<idname=“id” type=“long” column=“ID”>      <generator class=“increment”/></id>

适用范围:

1。由于不依赖与底层数据库,适合所有的数据库系统。

2。单个进程访问同一个数据库的场合,集群环境下不推荐适用。

3。OID必须为long、int或short类型,如果把OID定义为byte类型,抛异常。


(2)、Identity

identity方式表示数据库的主键生成方式为采用数据库的主键生成机制,例如SQLServer或MySQL的自动主键生成机制。

由底层数据库生成标识符.需要把字段定义成自增型。

my sql 中为auto_increment

ms sql server中为identity


使用mysql

<generatorclass="identity">
           <param name="identity">auto_increment</param>
      </generator>

mysql表:

createtable CUSTOMER(
     ID int NOT NULL auto_incrementprimary key,
     NAME varchar(15)not null,
     EMAIL varchar(128)not null
);

(3)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>

适用范围:

底层数据库要支持序列。OracleDB2 SAP等。

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

(4)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 idgenerator generates

Long、integer、short。


(5)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 idgenerator generates

Long、integer、short。


(6)assinged:

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

<id name=“id” column=“ID”>
      <generator class=“assinged” />
</id>
(7)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 的

"segmentkey"

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>

3、映射符合主键

(1)在实体类中直接映射符合主键(embeded)

<composite-id>
<key-propertyname="name"/>
<key-propertyname="email"/>
</composite-id>
(2)使用独立的标识类(mapped),复合主键在标识类和实体类中都存在

<composite-idclass="CompositeId"mapped="true">
<key-propertyname="name"/>
<key-propertyname="email"/>
</composite-id>
(3)使用独立的标识类(mapped),复合主键在标识类中存在

<composite-idclass="CompositeId" name="id" mapped="false">
  <key-property name="name" />
  <key-property name="email" />
</composite-id>
注意:标识类必须实现Serializable接口,最好实现equals方法和hashcode方法;必须初始化持久化类的实例,填充它的标识符属性,再 load()组合关键字关联的持久状态。这种方法称为 embedded(嵌入式)的组合标识符.

Session session = HibernateUtil.getSession();
Customer cus1 = new Customer();
cus1.setEmail("itcast@126.com");
session.load(Customer.class, cus1);
Customercus2=(Customer)session.get(Customer.class,cus1);


分享到:
评论

相关推荐

    精通hibernate:对象持久化技术孙卫琴第二版part2

    2.4.3 Hibernate映射类型接口 41 2.4.4 可供扩展的接口 42 2.5 小结 43 2.6 思考题 45 第3章 第一个Hibernate应用 47 本章通过简单的helloapp应用例子,演示如何利用Hibernate来持久化Java对象。 3.1 创建...

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

     11.1.3 Java大对象类型的Hibernate映射类型  11.1.4 JDK自带的个别Java类的Hibernate映射类型  11.1.5 使用Hibernate内置映射类型  11.2 客户化映射类型  11.2.1 用客户化映射类型取代Hibernate组件  11.2.2 ...

    精通Hibernate:对象持久化技术第二版part3

    2.4.3 Hibernate映射类型接口 41 2.4.4 可供扩展的接口 42 2.5 小结 43 2.6 思考题 45 第3章 第一个Hibernate应用 47 本章通过简单的helloapp应用例子,演示如何利用Hibernate来持久化Java对象。 3.1 创建...

    Hibernate的ppt

    hibernate入门;java对象持久化;对象-关系映射基础;映射对象标识符;映射一对多关联关系;映射一对一关联关系;映射多对多关联关系;操纵持久化对象;...hibernate映射类型;hibernate的检索策略等等。

    hibernate入门与概述

    hibernate入门与概述。介绍对象-关系 映射基础,映射对象标识符,映射一对多关联关系,操纵持久化对象,hibernate的检索策略。

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

     11.1.3 Java大对象类型的Hibernate映射类型  11.1.4 JDK自带的个别Java类的Hibernate映射类型  11.1.5 使用Hibernate内置映射类型  11.2 客户化映射类型  11.2.1 用客户化映射类型取代Hibernate组件  11.2.2 ...

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

     11.1.3 Java大对象类型的Hibernate映射类型  11.1.4 JDK自带的个别Java类的Hibernate映射类型  11.1.5 使用Hibernate内置映射类型  11.2 客户化映射类型  11.2.1 用客户化映射类型取代Hibernate组件  11.2.2 ...

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

     11.1.3 Java大对象类型的Hibernate映射类型  11.1.4 JDK自带的个别Java类的Hibernate映射类型  11.1.5 使用Hibernate内置映射类型  11.2 客户化映射类型  11.2.1 用客户化映射类型取代Hibernate组件  11.2.2 ...

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

     6.1.3 映射标识符bag   6.1.4 映射list   6.1.5 映射map   6.1.6 排序集合和有序集合  6.2 组件的集合   6.2.1 编写组件类   6.2.2 映射集合   6.2.3 启用双向导航   6.2.4 避免非空列   6.3 用...

    Hibernate+中文文档

    5. 对象/关系数据库映射基础(Basic O/R Mapping) 5.1. 映射定义(Mapping declaration) 5.1.1. Doctype 5.1.2. hibernate-mapping 5.1.3. class 5.1.4. id 5.1.5. composite-id 5.1.6. 鉴别器...

    Hibernate Annotations 中文文档

    2.4.2. 标识符 2.4.3. 属性 2.4.3.1. 访问类型 2.4.3.2. 公式 2.4.3.3. 类型 2.4.3.4. 索引 http://docs.jboss.org/hibernate/annotations/3.4/reference/zh_cn/html_single/#d0e2309 2.4.3.6. 生成的属性 ...

    hibernate3.2中文文档(chm格式)

    5. 对象/关系数据库映射基础(Basic O/R Mapping) 5.1. 映射定义(Mapping declaration) 5.1.1. Doctype 5.1.2. hibernate-mapping 5.1.3. class 5.1.4. id 5.1.5. composite-id 5.1.6. 鉴别器...

    HibernateAPI中文版.chm

    5. 对象/关系数据库映射基础(Basic O/R Mapping) 5.1. 映射定义(Mapping declaration) 5.1.1. Doctype 5.1.2. hibernate-mapping 5.1.3. class 5.1.4. id 5.1.5. composite-id 5.1.6. 鉴别器...

    hibernate annotation 中文文档

    2.4.2. 标识符 2.4.3. 属性 2.4.3.1. 访问类型 2.4.3.2. 公式 2.4.3.3. 类型 2.4.3.4. 索引 2.4.3.5. @Parent 2.4.3.6. 生成的属性 2.4.4. 继承 2.4.5. 关于单个关联关系的注解 2.4.5.1. 延迟选项和获取模式 2.4.6. ...

    Hibernate中文详细学习文档

    5. 对象/关系数据库映射基础(Basic O/R Mapping) 5.1. 映射定义(Mapping declaration) 5.1.1. Doctype 5.1.2. hibernate-mapping 5.1.3. class 5.1.4. id 5.1.5. composite-id 5.1.6. 鉴别器...

    Hibernate 中文 html 帮助文档

    5. 对象/关系数据库映射基础(Basic O/R Mapping) 5.1. 映射定义(Mapping declaration) 5.1.1. Doctype 5.1.1.1. EntityResolver 5.1.2. hibernate-mapping 5.1.3. class 5.1.4. id 5.1.4.1. Generator 5.1.4.2. 高...

    最全Hibernate 参考文档

    5. 对象/关系数据库映射基础(Basic O/R Mapping) 5.1. 映射定义(Mapping declaration) 5.1.1. Doctype 5.1.2. hibernate-mapping 5.1.3. class 5.1.4. id 5.1.4.1. Generator 5.1.4.2. 高/低位算法(Hi/Lo ...

    hibernate 教程

    Hibernate 映射 17.3. Hibernate 代码 18. 示例:不同的映射 18.1. 雇员/雇主(Employer/Employee) 18.2. 作者/著作(Author/Work) 18.3. 客户/订单/产品(Customer/Order/Product) 19. 最佳...

    hibernate 体系结构与配置 参考文档(html)

    5. 对象/关系数据库映射基础(Basic O/R Mapping) 5.1. 映射定义(Mapping declaration) 5.1.1. Doctype 5.1.2. hibernate-mapping 5.1.3. class 5.1.4. id 5.1.4.1. Generator 5.1.4.2. 高/低位算法(Hi/Lo ...

Global site tag (gtag.js) - Google Analytics