您的位置:首页 > 其它

Hibernate3.2(9):Hibernate的内置主键生成器

2013-07-09 18:02 330 查看
通常情况下,Hibernate建议为持久化类定义一个标识属性,用于唯一地标识某个持久化实例,而标识属性则需要映射到底层数据表的主键。

标识属性通过<id.../>元素来指定,<id.../>元素的name属性的值就是持久化类的标识属性名。除此之外,<id.../>元素还可指定如下几个可选属性:

<id.../>元素的可选属性

属性名说明
name如果不设置name属性,则表明该持久化类没有标识属性。如果设置了,name的值就是持久化类的

标识属性名。
type指定该标识属性的数据类型,该类型既可以是Hibernate的内建类型,也可以是Java类型。如果使用

Java类型则需要使用全限定类名。该属性是可选的,如果映射文件中没有指定该属性,则由Hibernate自行判断该标识属性的数据类型,通常建议设置该属性,这样会保证更好的性能。
column设置标识属性所映射的数据列的列名。默认情况下,该列的列名与该标识属性的属性名相同。
unsaved-value指定当某个实例刚刚创建,还未保存时的标识属性值。这个属性值可用于将这种实例和从以前的Session中装载过,但未再次持久化的实例区分开。在Hibernate3中,通常无须设置该属性。
access指定Hibernate访问该标识属性的访问策略,默认是property。该属性用于覆盖根元素<hibernate-mapping.../>中的default-access属性。
几乎所有现代的数据库建模理论都推荐不要使用具有实际意义的物理主键,而是推荐使用没有任何实际意义的逻辑主键。尽量避免使用复杂的物理主键,应考虑为数据库增加一列,作为逻辑主键。逻辑主键没有实际意义,仅仅用来标识一行记录。Hibernate为这种逻辑主键提供了主键生成器,它负责为每个持久化实例生成唯一的逻辑主键值。

主键生成器负责生成数据表记录的主键,通常有如下常见的主键生成器:

常见的主键生成器

名称说明
increment为long、short或者int类型主键生成唯一标识。只有在没有其他进程往同一张表中插入数据时才能使用。在集群下不要使用。
identity在DB2,MySQL,SQL Server,Sybase和HypersonicSQL等提供identity(自增长)主键支持的数据表中适用。返回的标识属性是long、short或int类型的。
sequence在DB2,PostgreSQL,Oracle,SAP DB,McKoi等提供sequence支持的数据表中适用。返回的标识属性值是long、short或int类型的。
hilo使用一个高低位算法高效地生成long、short或int类型的标识符。给定一个表和字段(默认分别是hibernate_unique_key和next_hi)作为高位值的来源。高低位算法生成的标识属性值只在一个特定的数据库中是唯一的。
seqhilo使用一个高低位算法高效地生成long、short或int类型的标识符,需要给定一个数据库sequence名。该算法与hilo稍有不同,它将主键历史状态保存在Sequence中,适用于支持Sequence的数据库,如Oracle。
uuid用一个128位的UUID算法生成字符串类型的标识符,这在一个网络中是唯一的(IP地址也作为算法的数据源)。UUID被编码成一个32位十六进制数的字符串。
guid在SQL Server和MySQL中使用数据库生成的GUID字符串。
native根据底层数据库的能力选择identity、sequence或者hilo中的一个。
assigned让应用程序在save( )之前为对象分配一个标识符。这相当于不指定<generator.../>元素时所采用的默认策略。
select通过数据库触发器选择某个唯一主键的行,并返回其主键值作为标识属性值。
foreign表明直接使用另一个关联的对象的标识属性值。这种主键生成器只在基于主键的1-1关联映射中才有用。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: