Hibernate使用对象标识符(OID)来建立内存中对象和数据库表中记录的对应关系,对象的OID和数据库的主键对应。为了保证OID的唯一性和不可变性,应该让Hibernate来为OID赋值。Hibernate通过标识符生成器来为OID赋值。
一、指定标识符生成器:
使用<id>元素的子元素<generator
class="increment"/>来指定。Hibernate提供的内置标识符生成器:
A、increment:适用于代理主键。由Hibernate自动以递增的方式生成标识符。
B、identity:适用于代理主键。由底层数据库生成。前提条件是底层数据库支持自动增长字段类型,比如:DB2\MySQL\MS SQL Server\Sybase\HypersonicSQL.
C、sequence:适用于代理主键。由底层数据库的序列生成。前提是底层数据库支持序列。如:DB2\PostgreSQL\Oracle\SAP DB;
D、hilo:适用于代理主键。Hibernate根据high\low算法生成标识符。
E、native:适用于代理主键。根据底层数据库对自动生成标识符的支持能力,来选择identity、sequence或hilo.
F、uuid.hex:适用于代理主键。Hibernate采用128位的UUID算法来生成。
G、assigned:适用于自然主键。由Java程序指定。
H、select:适用于遗留数据库中的代理主键或者自然主键。由数据库中的触发器来生成标识符。(具体机制不清楚)
I、foreign:(暂不了解)
二、increment标识符生成器:
Hibernate在插入记录时首先执行以下select
max(id) from
tableName;来获取当前最大的id值,然后在此基础上按照增量增加。
该机制在并发操作时可能会出现要插入的多条记录id值相同的情况,所以此种方式仅仅在只有单个Hibernate应用进程访问数据库的情况下才能有效工作。其他的涉及到并发插入的情况也会失效。
适用场景:
A、由于该机制生成标识符不依赖于底层数据库,因此适合于所有的数据库系统。
B、适用于只有单个Hibernate应用进程访问同一个数据库的场合(多线程应该也会失效),集群环境下不推荐使用。
C、OID必须为long、int或short类型。
三、identity标识符生成器:
该机制要求底层数据库把主键定义为自动增长的字段类型。
适用场景:
A、底层数据库支持自动增长类型的字段。
B、OID必须为long、int或short类型。
四、sequence标识符生成器:
适用场景:
A、底层数据库必须支持序列。
B、OID必须为long、int或short类型。
五、hilo标识符生成器:
适用场景:
A、由于该机制生成标识符不依赖于底层数据库,因此适合于所有的数据库系统。
B、OID必须为long、int或short类型。
C、high\low算法生成的标识符只能在一个数据库中保证唯一。
六、映射复合自然主键:
配置文件示例:
?
1 2 3 4 5 |
|
Java代码示例:
?
1 2 3 4 |
|
说明:
要使上面session的get()方法生效,要求Customer必须实现Serializable接口,且重写equals()和hashcode()方法。
七、总结:
?
1 2 3 4 |
|