|
1.assigned标识符生成器 assigned标识符生成器指定由应用程序生成并维护持久化对象的标识符。在这种情况下,标识符生成器使用应用程序分配给对象的标识符值。一般情况下,assigned生成器使用一个自然键(包含对象的业务属性)做主键。
assigned标识符生成器使用应用程序生成的标识符属性值,不涉及底层数据库实现细节,适合于各种数据库;持久化类的标识符可以采用任何Java支持的数据类型。但Hibernate不推荐使用assigned标识符生成器。因为assigned标识符生成器使用了包含业务信息的主键,系统扩展性不强。
2.increment标识符生成器 increment标识符生成器以递增的方式由Hibernate自行生成标识符属性值,增量为1。其中持久化类的标识符可以采用short、int和long数据类型以及它们的包装类。
increment适用于只有一个线程向数据库插入数据的情况,多个线程使用increment标识符生成器向同一数据库插入数据时,极易产生冲突,最终导致系统崩溃。虽然increment标识符生成器不依赖于数据库底层实现,适合于所有的数据库系统,但是只能局限于单个进程对同一数据库的操作,因而不推荐在生产环境中使用,尤其不推荐在集群中使用。
3.identify标识符生成器 identify标识符生成器根据数据库底层机制,实现主键地自动增长。主键的增长方式在生成数据库表时进行定义。不同的数据库实现自动增长的方式有所不同,因而主键的定义方式也有所不同。其中持久化类的标识符可以采用short、int和long数据类型以及它们的包装类型。
使用identify标识符生成器,需要依赖于底层数据库的主键生成机制。只要数据库支持自动增长的主键生成方式,就可以使用identify标识符生成器。
4.sequence标识符生成器 sequence标识符生成器使用序列获取主键,根据序列值保证主键的唯一性。序列是一个数据库对象,不依赖于特定的表。其中持久化类的标识符可以采用short、int和long数据类型以及它们的包装类型。
使用sequence标识符生成器时,需要底层数据库具备生成序列的能力。只要数据库支持序列,就可以使用sequence标识符生成器。使用sequence标识符生成器时,需要注意一个问题:每次数据的插入,都会产生两条sql语句,第一条获取序列值,第二条才真正插入数据。
5.hilo标识符生成器 hilo标识符生成器使用hi/lo算法生成主键。其中持久化类的标识符可以采用short、int和long数据类型以及它们的包装类型。
由于hi/lo算法根据数据库的表生成主键,不依赖于特定的数据库,所以hi/lo对象标识符生成器可以适用于所有的数据库。
6.uuid标识符生成器 uuid标识符生成器使用一个128位的全局唯一标识符(Universally Unique Identifier,UUID)算法生成字符串类型的标识符。UUID包含本机的IP地址、本机JVM的信息,相对于同一时空中的所有机器都是唯一的。uuid标识符生成器由Hibernate维护并生成uuid值,不依赖于底层数据库的实现细节,因而可以适用于所有数据库。
使用uuid标识符生成器需要注意以下的问题:由于UUID的值是完全随机的,因此在数据库中,不能确定记录的顺序。另外,uuid标识符生成器使用32位16进制字符串,需要占用更多的空间,索引的效率也比较低。
7.guid标识符生成器 guid包含当前日期、时间、时钟序列和全局唯一的IEEE机器识别号等,在全局是唯一的。
使用guid标识符生成器保存数据时,标识符生成器从数据库中获取guid作为对象标识符的值和记录的主键。使用guid需要底层数据库的支持。
8.native标识符生成器 native标识符生成器本身不具备生成主键的能力,是为了扩展hibernate的跨平台支持能力而引入的特性。native标识符生成器根据底层数据库的支持能力自动从identify、sequence和hilo三者之中选择合适的标识符生成器。如果底层数据库支持标识字段的主键,如MySQL数据库,native标识符生成器选择使用identify标识符生成器;如果底层数据库支持序列方式生成主键,如Oracle数据库,native标识符生成器将选择使用sequence标识符生成器。使用时,只需要设置generator元素的classic属性为native,就可以使Hibernate具备跨平台的支持能力。
在支持序列的数据库中使用native标识符生成器时,如果Hibernate配置为启动时自动生成数据库模式,那么应用程序将自动生成序列hibernate_sequence,并在整个Hibernate应用中,共享序列hibernate_sequence。否则,需要手工创建序列,并在映射定义文件中指定序列的名称
---------------------
原文:https://blog.csdn.net/tiercel2008/article/details/7687535
程序猿的技术大观园:www.javathinker.net
[这个贴子最后由 flybird 在 2020-02-23 11:41:17 重新编辑]
|
|