标签:oid
在数据库中区分两条数据是否是同一条,靠的是主键pk
在jvm中,有一块内存区域叫hibernate内存,jvm中并hibernate内存外面是可以存在多个相同的对象的,区分两个对象是否是同一个对象靠的是地址(object中的equals方法,)在hibernate内存中靠的是什么呢?
oid对象唯一标示符
oid的使用原则:让hibernate使用数据库的能力去维护
Hibernate中定义的主键类型包括:自然主键和代理主键:
自然主键:具有业务含义 字段 作为主键,比如:学号、×××号
代理主键:不具有业务含义 字段作为主键(例如 自增id),比如:mysql自增主键,oracle序列生成的主键、uuid()方法生成的唯一序列串
我一般采用代理主键
在hbm.xml中可以设置的主键生成策略如下:
increment 代理主键。
由hibernate维护一个变量,每次生成主键时自动以递增。
问题:如果有多个应用访问一个数据库,由于每个应用维护自己的主键,所以此时主键可能冲突。建议不采用。
hibernate会先去数据库查询主键是多少,然后再自增,然后给实体类赋值,在去插入,这样就会有线程安全问题,如果两个人在同时插入数据,那么很有可能,有一个人插入失败
identity 代理主键。
由底层数据库生成表识符。条件是数据库支持自动增长数据类型。比如:mysql的自增主键,oracle不支持主键自动生成。
如果数据库支持自增建议采用。
sequence 代理主键。
Hibernate根据底层数据库序列生成标识符。条件是数据库支持序列。比如oracle的序列。
如果数据库支持序列建议采用。
native 代理主键。
根据底层数据库对自动来选择identity、sequence、hilo
由于生成主键策略的控制权由hibernate控制,所以不建议采用。
uuid 代理主键。
Hibernate采用128位的UUID算法来生成标识符。该算法
能够在网络环境中生成唯一的字符串标识符。
此策略可以保证生成主键的唯一性,并且提供了最好的数据库插入性能和数据库平台的无关性。
建议采用。
assigned 自然主键。
由java程序负责生成标识符。
不建议采用。
hilo 代理主键。
使用高低位算法生成主键。必须是long、int、short类型。该算法生成的标识符只能在一个数据库中保证唯一。
标签:oid
原文地址:http://blog.51cto.com/13579086/2083785