OID,唯一性的标志

关系数据库用主键区分是否是同一条记录。

Hibernate使用OID来建立内存中的对象和数据库中记录的对应关系。对象的OID和数据库的表的主键对应。为保证OID的唯一性,应该让Hibernate来为OID赋值。

主键必备条件:

1,不能为null

2,唯一,不能重复。

3,永远不会改变。

二, 自然主键和代理主键

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

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



 三, 数据库中的主键介绍

关系数据库按主键区分不同记录

 

把主键定义为自动增长类型

my SQL中,把字段设为auto_increment类型,数据库会自动为主键赋值。

ms SQL server中,把字段设为identity类型,数据库会自动为主键赋值。

 

oracle从序列(sequence)中获取自动增长的描述符

create sequence seq_customer increment by 2 start with 1

insert into customers  values(seq_customer.curval,’..’)

 四,java与Hibernate如何区分对象

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

 

Hibernate中用对象表示符(OID)来区分对象

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

Hibernate使用OID来区分对象,不是equals()方法!所以不重写持久化类的hashCode()equals()方法Hibernate也可以正确运行(但要放到HashSet等集合中时要注意需要重写这两个方法)。

五。ID和 generator元素配置说明

配置示例:

<id name=“id” type=“long” column=“ID”>

      <generator class=“increment” />

</id>

 

<id>元素说明:

设定持久化类的 OID 和表的主键的映射,可以有以下属性:

¨ name: 标识持久化类 OID 的属性名  

¨ column: 设置标识属性所映射的数据列的列名(主键字段的名字). 

¨ unsaved-value:若设定了该属性, Hibernate 会通过比较持久化类的 OID 值和该属性值来区分当前持久化类的对象是否为临时对象,Hibernate3中几乎不再需要.

¨ type:指定 Hibernate 映射类型. Hibernate 映射类型是 Java 类型与 SQL 类型的桥梁如果没有为某个属性显式设定映射类型, Hibernate 会运用反射机制先识别出持久化类的特定属性的 Java 类型然后自动使用与之对应的默认的 Hibernate 映射类型

¨ Java 的基本数据类型和包装类型对应相同的 Hibernate 映射类型基本数据类型无法表达 null, 所以对于持久化类的 OID 推荐使用包装类型

 

<generator>元素说明

设定持久化类设定标识符生成器,可以有一个class属性:

¨ class: 指定使用的标识符生成器全限定类名或其缩写名。

 

<generator>元素的class属性可以指定的值说明(主键生成策略)

主键生成器

描述

increment

适用于代理主键。由hibernate自动以递增的方式生成表识符,每次增量为1

identity

适用于代理主键。由底层数据库生成表识符。条件是数据库支持自动增长数据类型。

sequence

适用于代理主键。Hibernate根据底层数据库序列生成标识符。条件是数据库支持序列。

hilo

适用于代理主键。Hibernate根据hign/low算法生成标识符。Hibernate把特定表的字段作为“hign”值。默认情况下,采用hibernate_unique_key表的next_hi字段。

native

适用于代理主键。根据底层数据库对自动生成表示符的能力来选择identitysequencehilo

uuid.hex

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

assigned

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值