映射对象标识符_第1页
映射对象标识符_第2页
映射对象标识符_第3页
映射对象标识符_第4页
映射对象标识符_第5页
已阅读5页,还剩21页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、映射对象标识符1主要内容2介绍Java语言、Hibernate如何识别对象以及关系数据库识别不同的记录。Hibernate提供的几种内置标识符成生器的用法。2关系数据库按主键区分不同的记录在关系数据库表中,用主键来识别记录并保证每条记录的唯一性。作为主键的字段必须满足以下条件:不允许为null。每条记录具有唯一的主键值,不允许主键值重复。每条记录的主键值永远不会改变。主键字段一般取名为ID,常为整型类型。3关系数据库按主键区分不同的记录把主键定义为自动增长标识符类型在MySQL中,如果把表的主键设为auto_increment类型,数据库会自动为主键赋值: ID int auto_increm

2、ent primary key not null 在MS SQL Server中,如果把表的主键设为identity类型,数据库会自动为主键赋值。 ID int identity(1,1) primary key not null 4关系数据库按主键区分不同的记录从序列(Sequence)中获取自动增长的标识符在Oracle数据库系统中,可以为每张表的主键创建一个单独的序列,然后从这个序列中获得自动增加的标识符,把它赋值给主键。 例如,以下语句创建了一个名为CUSTOMERS_ID_SEQ的序列,这个序列的起始值为1,增量为2。 create sequence CUSTOMERS_ID_SEQ

3、 increment by 2 start with 1 一旦定义了序列,就可以访问序列的curval(序列的当前值)和nextval(先增加序列的值,然后返回增加后的序列值)属性。 create table TABLE1( ID int primary key not null, NAME varchar(15);insert into TABLE1 values(CUSTOMERS_ID_SEQ.curval, Tom);insert into TABLE1 values(CUSTOMERS_ID_SEQ.nextval, Mike);select ID, NAME from TABLE1

4、 ID NAME 1 Tom 3 Mike5Java语言按内存地址区分不同的对象在Java语言中,判断两个对象引用变量是否相等,有以下两种比较方式比较两个变量所引用的对象的内存地址是否相同,“=”运算符就是比较的内存地址。此外,在Object类中定义的equals(Object o)方法,也是按内存地址来比较的。Customers c1 = new Customers(Tom);Customers c2 = new Customers(Tom);Customers c3 = c1; c3.setName(Mike);TomTomc1c2c3MikeTomc1c2c36Java语言按内存地址区分

5、不同的对象在Java语言中,判断两个对象引用变量是否相等,有以下两种比较方式比较两个变量所引用的对象的值是否相同,Java API中的一些类覆盖了Object类的equals(Object o)方法,实现按对象值比较。这些类包括:String类、Date类以及Java包装类 String s1 = new String(hello); String s2 = new String(hello); s1= s2 - false s1.equals(s2) - true7Java语言按内存地址区分不同的对象在Java语言中,判断两个对象引用变量是否相等,有以下两种比较方式用户自定义的类也可以覆盖O

6、bject类的equals(Object o)方法,从而实现按对象值比较。例如,在Customers类中添加equals(Object o)方法,使它按客户的姓名来比较两个Customers对象是否相等。 public boolean equals(Object o) if(this = o ) return ture; if( !o instanceof Customers) return false; final Customers other = (Customers) o; if(this.getName().equals(other.getName() return true; re

7、turn false; Customers c1 = new Customers (Tom); Customers c2 = new Customers (Tom); c1= c2 - false c1.equals(c2) - true8Hibernate用对象标识符来区分对象由于关系数据库和Java语言区分对象的方式不统一。Hibernate通过使用对象标识符OID来解决两者之间的矛盾OID是关系数据库中的主键(通常为代理主键)在Java对象模型中的等价物。在运行时,Hibernate根据OID来维持Java对象和数据库表中记录的对应关系。9Hibernate用对象标识符来区分对象Tran

8、saction tx = session.beginTransacton(); Customers c1 = (Customers)session.get( Customers.class,new Long(1); Customers c2 = (Customers)session.get( Customers.class,new Long(1); Customers c3 = (Customers)session.get( Customers.class,new Long(3); System.out.println(c1=c2); System.out.println(c1=c3); mi

9、t();10Hibernate用对象标识符来区分对象与表的代理主键对应,OID也是整型类型,Hibernate允许在持久化类中把OID定义为这些整型类型:short(Short)、int(Integer)、long(Long)为了保证持久化对象的OID的唯一性和不可变性,通常由Hiberante或底层数据库来给OID赋值。因此,可以把持久化类的OID的setId()方法设为private类型,以禁止Java应用程序随便修改OID。getId()设为public类型。在对象-关系映射文件中,元素用来设置对象标识符: 11Hibernate内置标识符生成器increment标识符生成器以递增的方式

10、由Hibernate自行生成标识符属性值,增量为1。(首先取得最大的主键值)适用范围:OID必须为short、int和long数据类型以及它们的包装类。不依赖于数据库底层实现,适合于所有的数据库系统。适用于只有单个Hibernate应用进程访问同一个数据库的场合,在集群环境下不推荐使用它。12Hibernate内置标识符生成器identity标识符生成器适用于代理主键,由底层数据库生成标识符,它要求底层数据库把主键定义为自动增长字段类型。适用范围:依赖于底层数据库,因此,要求底层数据库系统必须支持自动增长字段类型。数据库包括:DB2、MySQL、MS SQL Server、Sybase、Inf

11、ormix等。OID必须为short、int和long数据类型以及它们的包装类。13Hibernate内置标识符生成器sequence标识符生成器利用底层数据库提供的序列来生成标识符。 tester_id_seq 适用范围:要求底层数据库系统必须支持序列。数据库包括:DB2、Oracle、SAP DB、PostgreSQL等。OID必须为short、int和long数据类型以及它们的包装类。14Hibernate内置标识符生成器hilo标识符生成器由Hibernate按照一种high/low(高低位方式)算法来生成标识符,它从数据库的特定表的字段中获取high值。 hi_value next_

12、value 100 /指定低位的最大值 15Hibernate内置标识符生成器hilo标识符生成器也可以省略table和column配置,其默认的表为hibernate_unique_key,列为next_hi。hilo生成器生成主键的过程(以hibernate_unique_key表,next_hi列为例):获得hi值:读取并记录数据库的hibernate_unique_key表中next_hi字段的值,数据库中此字段值加1保存。获得lo值:从0到max_lo循环取值,差值为1,当值为max_lo值时,重新获取hi值,然后lo值继续从0到max_lo循环。根据公式 hi * (max_lo

13、+ 1) + lo计算生成主键值。16Hibernate内置标识符生成器hilo标识符生成器注意:当hi值是0的时候,那么第一个值不是0*(max_lo+1)+0=0,而是lo跳过0从1开始,直接是1、2、3。那max_lo配置多大合适呢?这要根据具体情况而定,如果系统一般不重启,而且需要用此表建立大量的主键,可以吧max_lo配置大一点,这样可以减少读取数据表的次数,提高效率;反之,如果服务器经常重启,可以吧max_lo配置小一点,可以避免每次重启主键之间的间隔太大,造成主键值主键不连贯。特点:跨数据库,hilo算法生成的标志只能在一个数据库中保证唯一。17Hibernate内置标识符生成器

14、native标识符生成器依据底层数据库对自动生成标识符的支持能力,来选择使用identity、sequence或hilo标识符生成器。native能自动判断底层数据库提供的生成标识符的机制。 适用范围:适合于跨数据库平台开发,即同一个Hibernate应用需要连接多种数据库系统的场合。OID必须为short、int和long数据类型以及它们的包装类。18Hibernate内置标识符生成器assigned标识符生成器由应用程序负责生成主键标识符,往往使用在数据库中没有代理主键,使用的主键与业务相关的情况。与Hibernate和底层数据库都无关,可以跨数据库。在存储对象前,必须要使用主键的sett

15、er方法给主键赋值,至于这个值怎么生成,完全由自己决定,这种方法应该尽量避免。 其缺点为在执行新增操作时,需查询数据库判断生成的主键是否已经存在。19Hibernate内置标识符生成器uuid标识符生成器UUID:Universally Unique Identifier,是指在一台机器上生成的数字,它保证对在同一时空中的所有机器都是唯一的。按照开放软件基金会(OSF)制定的标准计算,用到了以太网卡地址、纳秒级时间、芯片ID码和许多可能的数字,标准的UUID格式为:xxxxxxxx-xxxx-xxxx-xxxxxx-xxxxxxxxxx (8-4-4-4-12)其中每个 x 是 0-9 或 a

16、-f 范围内的一个十六进制的数字。特点:uuid长度大,占用空间大,跨数据库,不用访问数据库就生成主键值,所以效率高且能保证唯一性,移植非常方便,推荐使用。20Hibernate内置标识符生成器guid标识符生成器GUID:Globally Unique Identifier全球唯一标识符,也称作UUID,是一个128位长的数字,用16进制表示。算法的核心思想是结合机器的网卡、当地时间、一个随即数来生成GUID。从理论上讲,如果一台机器每秒产生10000000个GUID,则可以保证(概率意义上)3240年不重复。Hibernate在维护主键时,先查询数据库,获得一个uuid字符串,该字符串就是

17、主键值,该值唯一,缺点长度较大,支持数据库有限,优点同uuid,跨数据库,但是仍然需要访问数据库。特点:需要数据库支持查询uuid,生成时需要查询数据库,效率没有uuid高,推荐使用uuid。21Hibernate内置标识符生成器guid标识符生成器CREATE FUNCTION dbo.fun_getUUID32( newid varchar(36) RETURNS VARCHAR(32)ASBEGINDECLARE id VARCHAR(32);select id=SUBSTRING(newid,1,8) +SUBSTRING(newid,10,4)+SUBSTRING(newid,15,

18、4)+ SUBSTRING(newid,20,4)+SUBSTRING(newid,25,12)RETURN idENDselect dbo.fun_getUUID32(NEWID(); 22Hibernate内置标识符生成器联合主键映射如果一张表中存在联合主键,在hibernate中会把联合主键封装成一个类,然后在实体类中引用此联合主键类。联合主键类需要实现序列化,重写equals以及hashcode方法。create table student( name varchar(20), phone int, age int, constraint STUDENTKEY primary key(name,phone)23Hibernate内置标识符生成器联合主键映射1. 类中的每个主键属性都对应到数据表中的每个主键列。Hibernate要求具有联合主键的实体类实现S

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论