发布网友 发布时间:2022-04-13 20:57
共2个回答
懂视网 时间:2022-04-14 01:18
Key Generator主键产生器 lt;generatorgt;元素用来设定标识生成器。Hibernate提供了标识符生成器接口: org.hibernate.id.Ident
Key Generator主键产生器
标识符生成器
说 明
increment
identity
)
sequence
hilo
native
uuid.hex
assigned
主键由外部程序负责生成,无需Hibernate参与。
算法实现的主键生成机制,需要额外的数据库表保存主键生成历史状态。
类似,通过hi/lo 算法实现的主键生成机制,只是主键历史状态保存在Sequence中,适用于支持Sequence的数据库,如Oracle。
作为主键。这种方式可能产生的问题是:如果当前有多个实例访问同一个数据库,那么由于各个实例各自维护主键状态,不同实例可能生成同样的主键,从而造成主键重复异常。因此,如果同一数据库有多个实例访问,此方式必须避免使用。
、SQL Server、MySQL中的主键生成机制。
机制生成主键。如Oralce 中的Sequence。
根据底层数据库自行判断采用identity、hilo、sequence其中一种作为主键生成方式。
8)
基于128 位唯一值产生算法生成16 进制数值(编码后以长度32 的字符串表示)作为主键。
类似,,只是生成的主键未进行编码(长度16)。在某些数据库中可能出现问题(如PostgreSQL)。
方式生成主键将提供最好的性能和数据库平台适应性。
另外由于常用的数据库,如Oracle、DB2、SQLServer、MySql 等,都提供了易用的主键生成机制(Auto-Increase 字段或者Sequence)。我们可以在数据库提供的主键生成机制上,采用generator-class=native的主键生成方式。
不过值得注意的是,一些数据库提供的主键生成机制在效率上未必最佳,大量并发insert数据时可能会引起表之间的互锁。数据库提供的主键生成机制,往往是通过在一个内部表中保存当前主键状态(如对于自增型主键而言,此内部表中就维护着当前的最大值和递增量),之后每次插入数据会读取这个最大值,然后加上递增量作为新记录的主键,之后再把这个新的最大值更新回内部表中,这样,一次Insert操作可能导致数据库内部多次表读写操作,同时伴随的还有数据的加锁解锁操作,这对性能产生了较大影响。因此,对于并发Insert要求较高的系统,推荐采用uuid.hex 作为主键生成机制。
increment:生成long, short或者int类型的主键,不能在cluster环境下使用。适用于所有数据库
identity:生成long, short或者int类型的主键。适用于DB2, MySQL, MS SQL Server, Sybase and HypersonicSQL
sequence :生成long, short或者int类型的主键。适用于DB2, PostgreSQL, Oracle, SAP DB, McKoi,Interbase.
hilo:生成long, short或者int类型的主键。需要提供一个数据库的表来存放生成的主键信息。当采用应用服务器的JTA提供的数据库连接或者用户自定义的数据库连接的时候,不要使用这种主键生成方式。适用于所有数据库
seqhilo:采用给定的数据库的sequence来生成long, short或者int类型的主键。适用于DB2, PostgreSQL, Oracle, SAP DB, McKoi,Interbase.
uuid.hex:采用128位的算法来生成一个32位字符串。最通用的一种方式。适用于所有数据库
uuid.string:同样采用128位的UUID算法。将生成的字符编码位16位。适用于除PostgreSQL.以外的数据库
native:根据具体连接的数据库从identity, sequence或者hilo选择一种来生成主键。适用的数据库根据选择的生成方式确定。
assigned: 交给应用自己给主键赋值。要注意的是赋值必须在调用save()方法之前完成。适用的数据库根据选择的生成方式确定。
热心网友 时间:2022-04-13 22:26
首先得知道,这个主键有代理主键和业务主键之分,例如有一个对象student,属性name,age,如果把name当做主键,那么就是业务主键,如果再加一个id属性,没有任何意义,就是代理主键,而设置主键(代理主键)的生成方式,是因为,不同的生成方式,有不同的使用范围,同时还和底层数据库支持有关!追问在使用常规方法连接数据库的时候,没有设置主键的策略。是不是因为hibernate是可以跨越数据库的,而且它可以自动生成表,所以要设置这个主键的生成策略?以供不同的数据库建立主键?而常规方法,我用的Oracle会先建立表,并且设置了主键而不同?追答你说的有一定道理!但是hibernate对多数据库的兼容性应该不是设置主键的主要原因!主键应该是插入数据是,给代理主键赋值吧!这根生成表没有关系吧!对于hibernate的研究不是很深,希望有大牛能够解答吧