传智播客——hibernate细节(二)

一 映射对象标识符
1)java按地址区分同一个类的不同对象关系数据库用主键区分同一条记录.Hibernate使用OID来建立内存中的对象和数据库中记录的对应关系。对象的OID和数据库的表的主键对应。为保证OID的唯一性,该让Hibernate来为OID付值。
2)关系数据库按主键区分不同记录
主键必备条件:
1. 不允许null
2.唯一,不重复
3.之永远不会改变
  自然主键:把具有业务含义的字段作为主键叫做自然主键
关系数据库按主键区分不同记录
3)把主键定义为自动增长类型
在my SQL中,把字段设为auto_increment类型,数据库会自
动为主键付值。
在ms SQL server中,把字段设为identity类型,数据库会自
动为主键付值。
从序列(sequence)中获取自动增长的描述符
create sequence seq_customer
increment by 2 start with 1
insert into customers
values(seq_customer.curval,’..’)
3)Hibernate中用对象表示符(OID)来区分对象OID是关系数据库中的主键在java对象模型中的等价物。在运行时,hibernate根据OID来维持java对象和数据库记录的对应关系。
Customer c1 = (Customer)session.load(Customer.class,new Long(1));
Customer c2 = (Customer)session.load(Customer.class,new Long(1));
Customer c3 = (Customer)session.load(Customer.class,new Long(3));
c1 == c2 ?
c1 == c3 ?
<id name=“id” type=“long” column=“ID”>
<generator class=“increment” />
</id>
<generator>子元素用来设定表示符生成器。Hibernate提供了表识符生成器接
口:net.sf.hibernate.id.IdentifierGenerator,并提供了多种内置的实现。
二 表示符生成器 描述
1)Increment 适用于代理主键。由hibernate自动以递增的方式生成表识符,每次增量为1
2)Identity 适用于代理主键。由底层数据库生成表识符。条件是数据库支持自动增长数据类型。
3)Sequence 适用于代理主键。Hibernate根据底层数据库序列生成标识符。条件是数据库支持序列。
4)Hilo 适用于代理主键。Hibernate根据hign/low算法生成标识符。Hibernate把特定表的字段作为“hign”值。默认情况下,采用hibernate_unique_key表的next_hi字段。
Native 适用于代理主键。根据底层数据库对自动生成表示符的能力来选择identity、sequence、hilo
Uuid.hex 适用于代理主键。Hibernate采用128位的UUID算法来生成标识符。该算法
能够在网络环境中生成唯一的字符串标识符,这种策略并不流行,因为字符串类型的主键比整数类型的主键占用更多的数据库空间。
5)assigned 适用于自然主键。由java程序负责生成标识符。不能把setID()方法声明为
6)Private的。尽量避免使用自然主键。
三 Hibernate内置标识符用法
1)increment的参数会让hibernate执行以下语句
select max(id) from table;
<id name=“id” type=“long” column=“ID”>
<generator class=“increment”/>
</id>
适用范围:
1。由于不依赖与底层数据库,适合所有的数据库系统。
2。单个进程访问同一个数据库的场合,集群环境下不推荐适用。
3。OID必须为long、int或short类型,如果把OID定义为byte类型,抛异常。
2)Identity
由底层数据库生成标识符.需要把字段定义成自增型。
my sql 中为auto_increment
ms sql server中为identity
<generator  class=“identity” />
3)sequence
<id name=“id” type=“long” column=“ID”>
<generator class=“sequence”>
<param name=“sequence”>tester_id_seq</param>
</generator>
</id>
适用范围:
地层数据库要支持序列。Oracle DB2 SAP等。
OID必须为long、int或shot类型。
4)hilo
<id name=“id” type=“long” clomn=“ID”>
<generator class=“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类型的话,会抛出异常。
Net.sf.hibernate.id.IdentifierGeneratorException:this id generator generates
Long、integer、short。
学习总结:hibernate让我很纠结,很晕很晕。信春哥,不死身

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值