Entity类中,主键尽量使用可以为null值的类型,比如Integer,Long,String等,不要用int,long等。因为如果主键为null,则表示该实体类还没有保存到数据库,是一个临时状态(Transient),而int,long不能设置为null,不具备该功能。
<!--以上抄书,待研究论证-->
<id name="属性名"column="数据库字段名" type="标识Hibernate类型的名字"
unsaved-value="null|any|none|undefined|id_value"
access="field|property|ClassName">
<generator class="assigned|increment|identity|sequence|hilo|seqhilo|native|uuid|guid|select|foreign"/>
</id>
如果 name属性不存在,会认为这个类没有标识属性
unsaved-value 参考
http://blog.csdn.net/chunkyo/article/details/660050
access(可选 - 默认为property): Hibernate用来访问属性值的策略。 (网上查不到什么资料)
generator
1、assigned:
在调用session.save()之前,必须手动setId(主键值),否则出错。
<generator>没有指定时的默认生成策略。
2、increment:自增长,为long, short或者int类型生成主键
自动增长,由hibernate维护,适用于所有的数据库,每次插入数据前先查询最大id(select max(id) from xxx),即使id已经设好值,无视。
缺点:不适合多进程并发更新数据库,适合单一进程访问数据库。不能用于群集环境。
3、identity:自增长
与increment不同的是:
a)identity不是由hibernate控制,而是由数据库控制自增长,所插入数据前不会查询最大id。
b)以Mysql为例,如果主键字段没有开启auto_increment,会抛异常"Field 'id' doesn't have a default value"。
c)increment的insert语句包括id,identity的insert语句没有id字段。
c)假设有五条数据,id分别为1、2、3、4,删除(3、4)后,用increment增加数据id为3,用identity增加数据id为5。
不同的数据库有不同的自增长方式。如MySql是auto_increment,SQL Server 中是Identity。支持的数据库:MySql、SQL Server、DB2、Sybase和HypersonicSQL。
优点: 不需要Hibernate和用户的干涉,使用较为方便。
缺点:但不便于在不同的数据库之间移植程序。
4、sequence:自增长
需要底层数据库支持Sequence方式。
实现了Sequence的数据库:Oracle、DB2、PostgreSQL。
没有实现Sequence的数据库: MySQL、SQL Server、Sybase。
如果在MySql中使用该方式,hibernate会根据Dialect判断报错。
5、hilo:hi/low(高低位)算法,高低位算法使用一个高位值和一个低位值,然后把算法得到的两个值拼接起来作为数据库中的唯一主键。Hilo方式需要额外的数据库表和字段提供高位值来源。默认请况下使用的表是hibernate_unique_key,默认字段叫作next_hi。next_hi必须有一条记录否则会出现错误。
<generator class="hilo" >
<param name="table">hi_value</param>
<param name="column">next_value</param>
<param name="max_lo">100</param>
</generator>
hibernate根据hilo生成器生成主键的过程:
(1)读取并记录数据库的hi_value表中next_value字段的值,数据库中此字段值加1保存
(2)hibernate取得lo值(0到max_lo-1循环,lo到max_lo时,执行步骤1,然后lo继续从0到max_lo循环)
(3)取得hi值和lo值后,根据下面的公式计算主键值:hi*(max_lo+1)+lo;
过程参考:
http://hi.baidu.com/sai5d/blog/item/88e5f4db09e90277d0164e30.html
个人感觉没有自增长好,不仅多维护一个表,每次插入数据都要进行查和修改next_value的值。
6、seqhilo基于sequence的hilo算法。
7、native:
Native主键生成方式会根据不同的底层数据库自动选择Identity、Sequence、Hilo主键生成方式
特点:根据不同的底层数据库采用不同的主键生成方式。由于Hibernate会根据底层数据库采用不同的映射方式,因此便于程序移植,项目中如果用到多个数据库时,可以使用这种方式。
疑问:什么时候选择Hilo?
7、uuid:
id必须是String类型。
使用128位UUID算法生成主键,能够保证网络环境下的主键唯一性,也就能够保证在不同数据库及不同服务器下主键的唯一性。
特点:能够保证数据库中的主键唯一性,生成的主键占用比较多的存贮空间。
8、guid
使用了一种特殊算法,保证生成主键的唯一性,支持SQL Server和MySQL。
MySql中,先执行select uuid()。 uuid()是MySql自带的函数,取得uuid值后再生成主键。
9、select:使用数据库触发器赋值
(待研究)
10、foreign:使用外键赋值,在一对一实体关系时,可以保证关系双方的id保持一致。
(待研究)
参考:
http://www.qqywf.com/view/b_54630.html
分享到:
相关推荐
以下是关于Hibernate主键生成方式的详细说明: 1. **Identity方式**:`<generator class="identity"/>` 这种方式依赖于数据库自身的自动增长机制。例如,在MySQL中,它可以与`AUTO_INCREMENT`属性配合使用。当...
### Hibernate 主键生成策略详解 #### 一、概述 Hibernate 是一款开源的对象关系映射 (ORM) 框架,它允许开发人员将 Java 对象映射到数据库表中的记录,从而极大地简化了数据访问层的开发工作。在 Hibernate 中,...
Hibernate作为一款流行的Java持久层框架,提供了多种自动生成主键的方法,以适应不同场景的需求。本文将深入探讨Hibernate中自动生成主键的几种常见策略及其应用场景。 ### 1. UUID.hex UUID(Universally Unique ...
实际上,在使用“native”策略时,Hibernate会根据当前数据库环境自动选择合适的主键生成策略。 ##### 3.2 Oracle数据库中的序列创建 为了使“native”策略正确地为Oracle数据库生成主键,还需要在数据库中预先...
- 自动生成的 UUID 是全球唯一的。 - 通常用于分布式系统或跨数据库的应用场景。 ##### 9. **UUID.String** - **简介**:`uuid.string` 策略生成一个 16 位的字符串表示的唯一标识符。 - **应用场景**:与 `uuid...
在Java的持久化框架Hibernate中,主键生成策略是一个至关重要的概念,它决定了数据库表中主键值如何自动生成。主键通常是表中唯一标识记录的一列,对于数据的完整性和一致性至关重要。以下是对Hibernate中主键生成...
- **定义**:表示新增数据操作时由Hibernate自动生成主键值。其生成的值为:先查询该主键列的最大值,然后在最大值的基础上加1。适用于采用代理主键形式的主键列,但不适用于主键列是自动增长的表。 - **优点**:...
而“Hibernate代码自动生成”则是指利用Hibernate的工具或者第三方库,自动生成与数据库表对应的Java实体类、DAO(数据访问对象)层、Service层以及相关的SQL语句,从而减少手动编写这些重复性代码的工作量,提高...
### Hibernate 主键生成策略与配置详解 #### 一、概述 在使用Hibernate进行持久化操作时,合理选择和配置主键生成策略对于确保数据的一致性和优化性能至关重要。本文将详细介绍几种常见的主键生成策略,并结合示例...
在Java的持久化框架Hibernate中,主键的生成策略是一个重要的概念,它涉及到数据库表记录的唯一标识如何自动生成。本篇文章将详细讲解Hibernate映射文件中关于主键生成的各种策略及其配置,帮助开发者更好地理解和...
### Hibernate 主键生成策略详解 Hibernate 是一款流行的 Java 持久层框架,它提供了对象关系映射(ORM)的功能,使得 Java 开发者能够更高效地与数据库进行交互。在 Hibernate 中,主键生成策略是一项核心功能,...
以下是对Hibernate主键生成策略的详细说明: 1. **assigned**: 这种策略要求用户在调用`save()`方法之前手动设置主键值。Hibernate不参与主键的生成,这意味着主键生成完全由应用控制,可以与数据库无关。这种...
"Hibernate自动生成持久化类和映射文件"这个话题主要涉及如何利用myEclipse这款集成开发环境的反向工程功能,快速地根据数据库中的表结构生成对应的Hibernate配置文件、映射文件以及持久化类。下面将详细介绍这一...
- **定义**:Hibernate会根据当前使用的数据库类型自动选择最适合的主键生成策略(如identity、hilo、sequence)。 - **应用场景**:适用于跨数据库平台的应用开发,可以避免因为数据库不同而导致的代码修改。 8....
**描述**:由 Hibernate 负责管理主键生成,它会从数据库中取出当前最大值,每次保存新记录时自动递增 1。这种策略不依赖于底层数据库,因此具有良好的跨数据库兼容性。 **配置示例**: ```xml ``` **特点**...
在本教程中,我们将探讨如何利用Hibernate的注解功能,通过实体类自动生成数据库中的表。这极大地简化了数据库建模过程,同时也减少了手动编写SQL语句的工作量。 首先,我们需要理解Hibernate的核心概念。ORM框架如...