Hibernate主键生成策略详解:assigned、increment与hilo

需积分: 4 0 下载量 48 浏览量 更新于2024-09-08 收藏 74KB DOC 举报
`hibernate.hilo.table`>hibernate_hilo</param> </generator> </id> Hibernate使用高位+低位的方式生成主键,高位是保存在内存中的一个较大的整数,低位则是根据高位计算出来的较小的整数。高位在系统启动时从数据库的hi/lo表中读取,低位在内存中生成。这种方式减少了对数据库的访问,因为每次只需要修改或读取hi表的一条记录。但是,由于依赖于内存中的状态,如果服务器重启,需要重新初始化高位。适用于单数据库应用,不适用于分布式环境。 4、identity主键由数据库自动生成,如MySQL的自动增长字段,SQL Server的IDENTITY字段。这种方式依赖于数据库特性,不可跨数据库。 <id name="id" column="id"> <generator class="identity"/> </id> 在插入数据时,数据库会自动分配一个唯一的主键值。对于支持此特性的数据库,如MySQL和SQL Server,这是个简单且高效的解决方案。但不适用于所有数据库,例如Oracle不支持此方式。 5、sequence在支持序列的数据库(如Oracle、PostgreSQL)中,使用序列生成主键。序列在数据库中预先定义,每次调用时返回一个新值。 <id name="id" column="id"> <generator class="sequence"> <param name="sequence">my_sequence</param> </generator> </id> 序列生成器允许你在数据库级别控制主键的生成,这在数据库迁移和集群环境中很有用。 6、native Hibernate会选择最适合当前数据库的策略,如MySQL使用identity,PostgreSQL使用sequence,而其他不支持这些特性的数据库则使用increment。 <id name="id" column="id"> <generator class="native"/> </id> 这种方式方便了跨数据库的移植,但可能因数据库特性不同导致主键生成方式的变化,可能带来潜在问题。 7、uuid.hex生成一个128位的UUID,转换为16进制表示,共32个字符。 <id name="id" column="id"> <generator class="uuid.hex"/> </id> UUID是全局唯一的,适合分布式环境,但其长度较长,可能影响数据库列的宽度。 8、uuid二进制形式的UUID,长度较短,但不便于在SQL语句中直接使用。 <id name="id" column="id"> <generator class="uuid"/> </id> 总结:Hibernate的主键生成策略选择应基于数据库类型、并发需求以及是否需要跨数据库移植等因素。assigned策略灵活性最高,但可能导致主键冲突;increment策略适合单一进程;hilo策略减少数据库交互,但需额外表;identity和sequence依赖特定数据库;native策略自动适应;uuid适用于分布式环境。开发者应根据实际项目需求来选择合适的主键生成策略。