`

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 映射文件自动生成

    【压缩包子文件的文件名称列表】:“hibernate映射文件自动生成.doc”很可能是这篇博文的文档形式,其中详细介绍了具体的操作步骤、使用工具或者自定义脚本,以帮助开发者理解并应用自动化的映射文件生成过程。...

    用Hibernate映射继承关系

    ### 用Hibernate映射继承关系 #### 14.1 继承关系树的每个具体类对应一个表 在Hibernate中映射继承关系时,一种常见的策略是将继承关系树的每个具体类映射到单独的数据库表中。这种方法称为**表/类映射**(Table/...

    Hibernate内置标识符生成器

    Hibernate 是一个流行的对象关系映射(ORM)框架,它允许开发者用 Java 对象的方式来操作数据库。在 Hibernate 中,对象的唯一标识符(OID)是非常重要的,因为它用来区分数据库中的不同记录。OID通常被称为主键...

    精通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 映射模板

    总结来说,Hibernate映射模板是实现ORM的关键,它定义了Java对象和数据库表之间的对应关系,包括字段映射、关系映射等。通过熟练掌握和应用这些模板,开发者可以更高效地进行数据库操作,提高开发效率。在实际开发中...

    Hibernate 映射文件 结构

    【标题】"Hibernate映射文件结构"涉及到的是Java持久化框架Hibernate的核心概念,它用于将对象与数据库表之间的关系进行定义。映射文件是Hibernate工作的重要组成部分,它们以XML格式编写,通常命名为`.hbm.xml`,并...

    Hibernate映射导致的几个异常

    标题与描述概述的知识点主要集中在Hibernate映射过程中可能遇到的各种异常情况,这涉及到数据库与对象模型之间的映射问题,以及Hibernate框架在处理这些映射时可能产生的错误。下面将对这些异常进行详细的解释和分析...

    深入理解hibernate映射文件

    ### 深入理解Hibernate...总之,Hibernate映射文件是实现对象关系映射的核心组件之一,通过对映射文件的合理配置,可以高效地完成Java对象与数据库表之间的映射,从而简化数据库操作并提高代码的可维护性和可扩展性。

    Hibernate映射

    【标题】:“Hibernate映射” 在Java开发领域,Hibernate是一个非常重要的对象关系映射(ORM)框架,它简化了数据库操作,将Java类与数据库表之间的关系进行了抽象,使得开发者可以像操作对象一样操作数据库。...

    Hibernate 映射关系! 基础封装

    在深入探讨Hibernate映射关系和基础封装之前,我们先了解几个关键概念。Hibernate是一个流行的Java对象关系映射(ORM)框架,它允许开发者将数据库操作转换为面向对象的编程。对象的状态在Hibernate中有三种:...

    Hibernate Tutorial 03 (Object Identifier).pdf

    在Hibernate映射文件中,我们可以这样配置: ```xml &lt;hibernate-mapping package="com.metaarchit.bookshop"&gt; &lt;!-- 其他属性 --&gt; &lt;/hibernate-mapping&gt; ``` 这里,我们使用`&lt;generator&gt;`标签来指定...

    Hibernate的ppt

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

    Hibernate映射继承关系的三种方案.docx

    总结来说,Hibernate的继承映射策略提供了灵活的方法来处理对象模型与数据库模型之间的关系,开发者可以根据项目的特性和需求选择最适合的映射方式。在实现时,需要确保配置文件(如hibernate.cfg.xml)的正确设置,...

    精通 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的映射文件配置

    总之,Hibernate映射文件的配置是实现高效、准确的对象关系映射的关键,理解并熟练掌握其配置规则对于使用Hibernate框架进行持久化操作至关重要。通过合理配置主键策略和属性映射,可以显著提高应用程序的数据访问...

    精通 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 ...

Global site tag (gtag.js) - Google Analytics