hibernate映射文件--主键生成策略_第1页
hibernate映射文件--主键生成策略_第2页
hibernate映射文件--主键生成策略_第3页
hibernate映射文件--主键生成策略_第4页
hibernate映射文件--主键生成策略_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

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

文档简介

1、Hibernate.cfg.xml 配置文件(包括主键生成策略介绍) Hibernate.cfg.xml 配置文件: java:comp/env/jdbc/quickstart net.sf.hibernate.connection.DatasourceConnectionP rovider net.sf.hibernate.dialect.SQLServerDialect !- jdbc jdbc:microsoft:sqlserver:/localhost:1433;SelectMethod=curso r;DatabaseName=pubs com.microsoft.jdbc.sqls

2、erver.SQLServerDriver sa - 50 30 true 数据库表主键的知识点: Generator为每个POJO的实例提供唯一标识。一般情况,我们使用 native 。class 表示采 用由生成器接口 net.sf.hibernate.id.IdentifierGenerator 实现的某个实例,其中包括: assigned 主键由外部程序负责生成,在 save() 之前指定一个。 hilo 通过hi/lo 算法实现的主键生成机制,需要额外的数据库表或字段提供高位值来源。 seqhilo 与hilo 类似,通过hi/lo 算法实现的主键生成机制,需要数据库中的 Seque

3、nce ,适用于支持 Sequence 的数据库,如 Oracle 。 increment 主键按数值顺序递增。此方式的实现机制为在当前应用实例中维持一个变量,以保存着当前的 最大值,之后每次需要生成主键的时候将此值加 1作为主键。这种方式可能产生的问题是: 不能 在集群下使用。 identity 采用数据库提供的主键生成机制。如 DB2 SQL Server、MySQL中的主键生成机制。 _ 刀 sequence 采用数据库提供的 sequence机制生成主键。如 Oralce 中的Sequence。 native 由Hibernate 根据使用的数据库自行判断采用 identity 、hi

4、lo、sequence其中一种作为主键 生成方式。 uuid.hex 由Hibernate 基于128位UUID算法 生成16进制数值(编码后以长度 32的字符串表示)作 为主键。 uuid.string 与uuid.hex 类似,只是生成的主键未进行编码 (长度16),不能应用在PostgreSQL数据库中。 foreign 使用另外一个相关联的对象的标识符作为主键。 以下举例: 1、指定参数的情况: SEQ_CHILD 使用的是sequence,适合oracle数据库; 2、对于sql server2000 中的数据库子增字段,在配置文件使用下列方法实现: 这里主要是:identity:

5、代表由sql server2000 数据库自己提供子增字段 .如果要hibernate自己 提供,则用increment关键字来实现 3、如果表中的主键用字符串类型:可以用hibernate自己提供的方法实现主键唯一: 使用的是uuid.hex: 采用128位的算法来生成一个32位字符串。最通用的一种方式。适用于所有 数据库。 重要的知识点: 1.如果有部门表,有员工表,员工表中有dep_id,则表部门类和员工类是 one-to-many的关系: 可以使用:( 在部门类department中使用下列) Department 类: /* 部门的所有员工 */ private Set staffs

6、 = new TreeSet(); xml 的文件: 如果是list,需要用索引 , 具体其中的含义,不是很明白.待以后研究 2. 如果部门要有一个负责人,即部门表(tb_department)中有一个字段:staff_id. 那么表示部门和负责人之间的关系是 many-to-one的关系 Department 类: /* 部门负责人id */ private Staff staff; xml 文件 3. 多对多关系,一般我们是做一个中间关联表.我用角色和权限做了个例子 , Right(id,name) Role(id,name) 中间表:tb_role_right(role_id,right

7、_id) Right 类中有一个 Role 的集合:private Set roles=new TreeSet(); Role 类中也有一个 Right 的集合:private Set rights=new TreeSet(); 则两者是明显的多对多关系 .使用many-to-many来实现; xml 文件中 right.hbm.xml: 如下: role.hbm.xml 文件中类似: 4.几个值得注意的问题: a) 在xml?映射文件中,写类的名字时一定用类的全名 :即:包+类名 如:(hbp.sys.data.Staff), 这个错误使我费了半天劲 .:( b) 我在写实现基本DAO作时,

8、写了 session.delete(from Right as right where right.id=+id); 程序死活报错,我折腾了半天,跟踪到底,才恍然大悟,hibernate在解析sql语句 的时候把 其中的right,当成了数据库中的右连接(保留字),唉,这种关键字,不能随便用 啊,:) 5. hibernate 中HQ邸言的查询根据你的sql的不同而返回不同的对象类型 如果你使用 session.find(String hql) 一般会返回一个List,如:from Staff staff; 返回的是包含所有的员工对象的集合 如你的 hql 为:select count(*)

9、from Staff staff; 则返回的是一个 Integer 对象 如果你使用的 hql 为:select count(distinct ),count(*) from Staff staff; 则返回的是一个Object 即Object,需要先把他转换成Object,然后在取0,1. 这种设计我不知道hibernate是如何处理的,感觉既好也不好.好的是可以使用一个 find获得任意查询 不好在于根据hql来处理返回结果,容易出错. 滕州预售11:17:15 hibernate 主键生成策略 Posted on 2010-07-29 10:59 Charleehu

10、阅读(117)评论(0) 编辑 收藏 Hibernate有很多值得学习的地方, 这里我们主要介绍 Hibernate主键,包括介绍Assigned方式、 Increment 方式和 Foreign GUID 等方面。 Hibernate主键介绍 1. Assigned Assigned方式由程序生成主键值,并且要在 save()之前指定否则会抛出异常 特点:主键的生成值完全由用户决定,与底层数据库无关。用户需要维护主键值,在调用 session.save() 之前要指定主键值。 2. Hilo Hilo使用高低位算法生成主键,高低位算法使用一个高位值和一个低位值,然后把算法得到的 两个值拼接起

11、来作为数据库中的唯一主键。 Hilo方式需要额外的数据库表和字段提供高位值来 源。默认请况下使用的表是 hibernate_unique_key ,默认字段叫作next_hi。next_hi必须有一条记录否则会出现错误。 特点:需要额外的数据库表的支持,能保证同一个数据库中主键的唯一性,但不能保证多个数 据库之间主键的唯一性。Hilo主键生成方式由Hibernate 维护,所以Hilo方式与底层数据库无 关,但不应该手动修改 hi/lo算法使用的表的值,否则会引起主键重复的异常。 3.Increment Increment方式对主键值采取自动增长的方式生成新的主键值,但要求底层数据库的支持 S

12、equence。如Oracle , DB辱。需要在映射文件 xxx.hbm.xml中加入Increment标志符的设置。 特点:由Hibernate本身维护,适用于所有的数据库,不适合多进程并发更新数据库,适合单一 进程访问数据库。不能用于群集环境。 4.Identity Identity当时根据底层数据库,来支持自动增长,不同的数据库用不同的主键增长方式。 特点:与底层数据库有关,要求数据库支持Identity ,如MySQ中是auto_increment, SQLServer 中是 Identity ,支持的数据库有 MySql、SQLServer、DB2 Sybase 和 Hyperso

13、nicSQL。 Identity 无需Hibernate和用户的干涉,使用较为方便,但不便于在不同的数据库之间移植程序。 5.Sequence Sequence需要底层数据库支持Sequence方式,例如Oracle数据库等 特点:需要底层数据库的支持序列,支持序列的数据库有 DB2、PostgreSql、Qracle、SAPDb? 在不同数据库之间移植程序,特别从支持序列的数据库移植到不支持序列的数据库需要修改配 置文件 6. Native Native主键生成方式会根据不同的底层数据库自动选择 Identity 、Sequence、Hilo主键生成方 式。 特点:根据不同的底层数据库采用不

14、同的主键生成方式。 由于Hibernate会根据底层数据库采用 不同的映射方式,因此便于程序移植,项目中如果用到多个数据库时,可以使用这种方式。 7. UUID UUI附用128位UUID算法生成主键,能够保证网络环境下的主键唯一性, 也就能够保证在不同数 据库及不同服务器下主键的唯一性。 特点;能够保证数据库中的主键唯一性,生成的主键占用比较多的存贮空间 8. Foreign GUID Foreign用于一对一关系中。 GUIDfc键生成方式使用了一种特殊算法,保证生成主键的唯一性, 支持SQL Server和MySQL以上介绍Hibernate主键。 滕州预售11:18:20 Hibern

15、ate 主键生成策略2009-10-25 22:50 先来看看主键映射的标签: (4) (5)param_value (1) 标识类中的属性名,实际对应的是 setter/getter 方法,符合规范的Java类可以直接写属性名 (2) 表中主键字段的名字 (3) Hibernate映射类型的名字 (4) generator子元素的class属性,是Java类的名字,这个类会为持久化类生成唯一标识,所有的 生成器类都实现 org.hibernate.id.IdentifierGenerator 接口,我们往往使用 Hibernate内置的 生成器,这些生成器都有简写的名字,这些名字和它们的区别

16、稍后介绍 (5) 配置生成器类需要的配置值或初始化参数 下面让我们看一下几种常用的主键生成方式: 1、 自动增长identity : 适用于MySQL DB2、MSSQLServer,采用数据库生成的主键,用于为 long、short、int类型生 成唯一标识 使用SQLServer和MySQL的自增字段,这个方法不能放至V Oracle 中,Oracle不支持自增字 段,要设定sequence (MySQL和SQL Server 中很常用) 数据库中的语法如下: MySQL create table t_user(id int auto_increment primary key, name

17、 varchar(20); SQL Server : create table t_user(id int identity(1,1) primary key, name varchar(20); 2、 sequence : DB2 Oracle均支持的序列,用于为 long、short或int生成唯一标识 数据库中的语法如下: Oracle : create sequence seq_name increment by 1 start with 1; 需要主键值时可以调用 seq_name.nextval或者seq_name.curval得到,数据库会帮助我们维护这 个sequence序列,

18、保证每次取到的值唯一,如: insert into tbl_name(id, name) values(seq_name.nextval, Jimliu ); seq_name 如果我们没有指定 sequence参数,贝U Hibernate会访问一个默认的sequence ,是 hibernate_sequence ,我们也需要在数据库中建立这个 sequence 此外,sequence还可以有另外一个参数是 paramters,可以查看 Hibernate的API了解它的用法, 见 org.hibernate.id.SequenceGenerator 调用数据库的sequence来生成主键

19、,要设定序列名,不然 hibernate无法找到: NAME_SEQ (Oracle 中很常用) 3、hilo : 使用一个高/低位算法生成的long、short或int类型的标识符,给定一个表和字段作为高位值的 来源,默认的表是hibernate_unique_key ,默认的字段是next_hi。它将id的产生源分成两部分, DB曲存,然后按照算法结合在一起产生 id值,可以在很少的连接次数内产生多条记录, 提高效 率 MySQL create table hi_value(next_hi integer not null); insert into hi_value(next_hi) v

20、alues(1); hi_value next_hi 100 在hibernate持久化的时候,由hibernate负责生成低位值。hilo标识符生成器在生成标识符时 需要从hi_value表中取出next_hi的当前值,然后修改该值,这个操作是在单独的事务中完成的。 最大的低值在属性max_lo中配置,但在Hibernate内存中生成的低位值超过此值时, 就有需要到 数据库的hi_value表中再次读取高位值了。 使用hilo生成策略,要在数据库中建立一张额外的表, 默认表名为hibernate_unique_key, 默认 字段为integer类型,名称是next_hi (比较少用) 我们

21、也可以自己设置自定义心名和字段名 4、 native : 会根据底层数据库的能力,从 identity 、sequence、hilo中选择一个,灵活性更强,但此时, 如果选择sequence或者hilo,则所有的表的主键都会从 Hibernate默认的sequence或者hilo表中 取。并且,有的数据库对于默认情况主键生成测试的支持,效率并不是很高 对于oracle 采用Sequence 方式,对于 MySQL和SQL Server采用identity (自增主键 生成机制),native就是将主键的生成工作交由数据库完成, hibernate不管(很常用) 5、 seqhilo : sequence和hilo的结合,hilo的高位由sequence产生,所以也需要底层数据库的支持 通过hilo算法实现,但是主键历史保存在 Sequence中,适用于支持 Sequence的数据库,如 Oracle (比较少用) seq_name 100 6、 increment : 这个是由Hibernate在内

温馨提示

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

评论

0/150

提交评论