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

下载本文档

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

文档简介

Hibernate.cfg.xml配置文件(包括主键生成策略介绍)Hibernate.cfg.xml配置文件: java:comp/env/jdbc/quickstart net.sf.hibernate.connection.DatasourceConnectionProvider net.sf.hibernate.dialect.SQLServerDialect !- jdbc jdbc:microsoft:sqlserver:/localhost:1433;SelectMethod=cursor;DatabaseName=pubs com.microsoft.jdbc.sqlserver.SQLServerDriver sa - 50 30 true 数据库表主键的知识点: Generator 为每个 POJO 的实例提供唯一标识。一般情况,我们使用“native”。class 表示采用由生成器接口net.sf.hibernate.id.IdentifierGenerator 实现的某个实例,其中包括: “assigned” 主键由外部程序负责生成,在 save() 之前指定一个。 “hilo” 通过hi/lo 算法实现的主键生成机制,需要额外的数据库表或字段提供高位值来源。 “seqhilo” 与hilo 类似,通过hi/lo 算法实现的主键生成机制,需要数据库中的 Sequence,适用于支持 Sequence 的数据库,如Oracle。 “increment” 主键按数值顺序递增。此方式的实现机制为在当前应用实例中维持一个变量,以保存着当前的最大值,之后每次需要生成主键的时候将此值加1作为主键。这种方式可能产生的问题是:不能在集群下使用。 “identity” 采用数据库提供的主键生成机制。如DB2、SQL Server、MySQL 中的主键生成机制。 “sequence” 采用数据库提供的 sequence 机制生成主键。如 Oralce 中的Sequence。 “native” 由 Hibernate 根据使用的数据库自行判断采用 identity、hilo、sequence 其中一种作为主键生成方式。 “uuid.hex” 由 Hibernate 基于128 位 UUID 算法 生成16 进制数值(编码后以长度32 的字符串表示)作为主键。 “uuid.string” 与uuid.hex 类似,只是生成的主键未进行编码(长度16),不能应用在 PostgreSQL 数据库中。 “foreign” 使用另外一个相关联的对象的标识符作为主键。 以下举例: 1、指定参数的情况: SEQ_CHILD 使用的是sequence,适合oracle数据库; 2、对于sql server2000中的数据库子增字段,在配置文件使用下列方法实现: 这里主要是:identity:代表由sql server2000数据库自己提供子增字段.如果要hibernate自己提供,则用increment关键字来实现 3、如果表中的主键用字符串类型:可以用hibernate自己提供的方法实现主键唯一: 使用的是uuid.hex: 采用128位的算法来生成一个32位字符串。最通用的一种方式。适用于所有数据库。 重要的知识点: 1. 如果有部门表,有员工表,员工表中有dep_id,则表部门类和员工类是one-to-many的关系: 可以使用: ( 在部门类department中使用下列) Department类: /* 部门的所有员工 */ private Set staffs = 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_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操作时,写了 session.delete(from Right as right where right.id=+id); 程序死活报错,我折腾了半天,跟踪到底,才恍然大悟,hibernate在解析sql语句的时候把 其中的right,当成了数据库中的右连接(保留字),唉,这种关键字,不能随便用啊,:) 5. hibernate中HQL语言的查询根据你的sql的不同而返回不同的对象类型. 如果你使用session.find(String hql) 一般会返回一个List,如:from Staff staff;返回的是包含所有的员工对象的集合 如你的hql为:select count(*) 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 阅读(117) 评论(0) 编辑 收藏 Hibernate有很多值得学习的地方,这里我们主要介绍Hibernate主键,包括介绍Assigned方式、Increment方式和Foreign GUID等方面。Hibernate主键介绍1.AssignedAssigned方式由程序生成主键值,并且要在save()之前指定否则会抛出异常特点:主键的生成值完全由用户决定,与底层数据库无关。用户需要维护主键值,在调用session.save()之前要指定主键值。2.HiloHilo使用高低位算法生成主键,高低位算法使用一个高位值和一个低位值,然后把算法得到的两个值拼接起来作为数据库中的唯一主键。Hilo方式需要额外的数据库表和字段提供高位值来源。默认请况下使用的表是hibernate_unique_key,默认字段叫作next_hi。next_hi必须有一条记录否则会出现错误。特点:需要额外的数据库表的支持,能保证同一个数据库中主键的唯一性,但不能保证多个数据库之间主键的唯一性。Hilo主键生成方式由Hibernate 维护,所以Hilo方式与底层数据库无关,但不应该手动修改hi/lo算法使用的表的值,否则会引起主键重复的异常。3.IncrementIncrement方式对主键值采取自动增长的方式生成新的主键值,但要求底层数据库的支持Sequence。如Oracle,DB2等。需要在映射文件xxx.hbm.xml中加入Increment标志符的设置。特点:由Hibernate本身维护,适用于所有的数据库,不适合多进程并发更新数据库,适合单一进程访问数据库。不能用于群集环境。4.IdentityIdentity当时根据底层数据库,来支持自动增长,不同的数据库用不同的主键增长方式。特点:与底层数据库有关,要求数据库支持Identity,如MySQl中是 auto_increment, SQL Server 中是Identity,支持的数据库有MySql、SQL Server、DB2、Sybase和HypersonicSQL。 Identity无需Hibernate和用户的干涉,使用较为方便,但不便于在不同的数据库之间移植程序。5.SequenceSequence需要底层数据库支持Sequence方式,例如Oracle数据库等特点:需要底层数据库的支持序列,支持序列的数据库有DB2、PostgreSql、Qracle、SAPDb等在不同数据库之间移植程序,特别从支持序列的数据库移植到不支持序列的数据库需要修改配置文件6.NativeNative主键生成方式会根据不同的底层数据库自动选择Identity、Sequence、Hilo主键生成方式。特点:根据不同的底层数据库采用不同的主键生成方式。由于Hibernate会根据底层数据库采用不同的映射方式,因此便于程序移植,项目中如果用到多个数据库时,可以使用这种方式。7.UUIDUUID使用128位UUID算法生成主键,能够保证网络环境下的主键唯一性,也就能够保证在不同数据库及不同服务器下主键的唯一性。特点;能够保证数据库中的主键唯一性,生成的主键占用比较多的存贮空间8.Foreign GUIDForeign用于一对一关系中。GUID主键生成方式使用了一种特殊算法,保证生成主键的唯一性,支持SQL Server和MySQL。以上介绍Hibernate主键。滕州预售 11:18:20 Hibernate 主键生成策略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内置的生成器,这些生成器都有简写的名字,这些名字和它们的区别稍后介绍(5)配置生成器类需要的配置值或初始化参数下面让我们看一下几种常用的主键生成方式:1、自动增长identity:适用于MySQL、DB2、MS SQL Server,采用数据库生成的主键,用于为long、short、int类型生成唯一标识使用SQL Server 和 MySQL 的自增字段,这个方法不能放到 Oracle 中,Oracle 不支持自增字段,要设定sequence(MySQL 和 SQL Server 中很常用)数据库中的语法如下:MySQL:create table t_user(id int auto_increment primary key, name 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序列,保证每次取到的值唯一,如:insert into tbl_name(id, name) values(seq_name.nextval, Jimliu); seq_name 如果我们没有指定sequence参数,则Hibernate会访问一个默认的sequence,是hibernate_sequence,我们也需要在数据库中建立这个sequence此外,sequence还可以有另外一个参数是paramters,可以查看Hibernate的API了解它的用法,见org.hibernate.id.SequenceGenerator调用数据库的sequence来生成主键,要设定序列名,不然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) values(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(比较少用) 我们也可以自己设置自定义的表名和字段名 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、increme

温馨提示

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

评论

0/150

提交评论