`

关于hibernate产生的自增主键

阅读更多
Hibernate中domain配置文件

将主键改成自增长类型:

Oracle设置<generator class="increment" />


SQLServer 2000设置<generator class="identity" />

―――――――――例如SQLServer 2000中――――――――――――――――――
<id name="userid" type="java.lang.Integer">
            <column name="userid" />
            <generator class="identity" />
</id>
―――――――――――――――――Oracle中――――――――――――――――――
<id name="userid" type="java.lang.Integer">
            <column name="userid" />
            <generator class="increment" />
</id>






hibernate提供了产生自动增长类型主键的多种策略,这里以increment为例说明具体用法:
1、在数据库中建立表,主键名称为ID,类型为varchar2(字符串型)
2、在**.hbm.xml(hibernate映射文件)中配置如下
<class name="com.jat.bisarea.ho.Test" table="BA_VVTEST">
<id name="id" type="int" column="ID">
//该句指定使用hibernate自带的increment策略生成主键
<generator class="increment"/>
</id>
<property name="uname" type="java.lang.String" column="UNAME"/>
</class>
3、在java文件中对表增加记录时,只需添加除ID外的其他字段,然后save即可,相关java代码如下:
Session s = HibernateUtil.currentSession();
Transaction tx = s.beginTransaction();
Test test = new Test();
String uname = httpServletRequest.getParameter("uname");
test.setUname(uname);
//只需对uname进行set,id由hibernate生成
s.save(test);
tx.commit();
4、使用其它策略的方法基本一致,例如hilo、seqhilo等

Generator 为每个 POJO 的实例提供唯一标识。一般情况,我们使用“native”。class 表示采用由生成器接口net.sf.hibernate.id.IdentifierGenerator 实现的某个实例,其中包括:
“assigned”
主键由外部程序负责生成,在 save() 之前指定一个。
“hilo”
通过hi/lo 算法实现的主键生成机制,需要额外的数据库表或字段提供高位值来源。
“seqhilo”
与hilo 类似,通过hi/lo 算法实现的主键生成机制,需要数据库中的 Sequence,适用于支持 Sequence 的数据库,如Oracle。
“increment”
主键按数值顺序递增。此方式的实现机制为在当前应用实例中维持一个变量,以保存着当前的最大值,之后每次需要生成主键的时候将此值加1作为主键。这种方式可能产生的问题是:不能在集群下使用。
“identity”
采用数据库提供的主键生成机制。如DB2、SQL Server、MySQL 中的主键生成机制。
“sequence”
采用数据库提供的 sequence 机制生成主键。如 Oralce 中的Sequence。
“native”
由 Hibernate 根据使用的数据库自行判断采用 identity、hilo、sequence 其中一种作为主键生成方式。
“uuid.hex”
由 Hibernate 基于128 位 UUID 算法生成16 进制数值(编码后以长度32 的字符串表示)作为主键。
“uuid.string”
与uuid.hex 类似,只是生成的主键未进行编码(长度16),不能应用在 PostgreSQL 数据库中。
“foreign”
使用另外一个相关联的对象的标识符作为主键。




1. native
我最常用的。可以保证多个数据库之间的可移植性。但是有可能有时候会有问题:因为不能控制id值,在数据倒表的时候可能无法满足业务需要。
2. sequence
这种地方可以解决上面用native时候的问题,但是需要堆数据库做一些其他配置。
3. uuid
理论上可以保证多个数据库生成的ID在一个系统里唯一,有时候挺有用。但是效率稍微低点(其实都无所谓)。
4. increment
最好不要用。如果有其他程序访问、修改数据库,那就恐怖了。
5. assigned
没怎么用过。一般不会用手工方式赋值主键,除非有特殊的需求。
6.  foreign
在one-to-one的时候可能会用到。
7. 在使用数据库自动生成主键的时候,SQL语句会有所不同:有些数据库不许你填主键,有些要求你该字段必须为null,有些会完全忽略你写的主键的值。
分享到:
评论

相关推荐

    hibernate联合主键全攻略

    在探讨Hibernate中联合主键的使用时,我们首先需要理解什么是联合主键以及它在Hibernate框架中的实现方式。联合主键(Composite Primary Key),是指在数据库表中使用两个或多个字段共同作为主键来唯一标识每一行...

    Hibernate联合主键的例子

    - 在使用联合主键时,通常不需要生成自增的ID,因为主键是通过组合多个字段生成的。 - 联合主键的每个字段通常都会设置为`@Column(nullable = false)`,确保它们在数据库中都是非空的。 通过以上步骤,你就可以在...

    hibernate复合主键映射

    在Java的持久化框架Hibernate中,复合主键(Composite Key)是一种特殊的数据模型,它用于表示由多个属性共同构成的唯一标识。这种设计通常出现在实体类的某些属性组合起来才能唯一确定一个对象的情况下。本篇文章将...

    Hibernate主键生成策略

    ### Hibernate 主键生成策略详解 #### 一、概述 Hibernate 是一款开源的对象关系映射 (ORM) 框架,它允许开发人员将 Java 对象映射到数据库表中的记录,从而极大地简化了数据访问层的开发工作。在 Hibernate 中,...

    hibernate映射主键生成策略native

    ### Hibernate映射主键生成策略native #### 一、引言 在ORM(对象关系映射)技术中,Hibernate作为一款流行的Java持久层框架,在处理数据持久化方面提供了丰富的功能和灵活性。其中,主键生成策略是Hibernate配置...

    hibernate中基于主键的one2one

    但也有需要注意的地方,比如当两个表的主键是自增的,可能会因为并发插入导致主键冲突,这时需要特殊处理。 此外,一对一关联还可以通过外键实现,这种方式下,一个实体的主键成为另一个实体的外键,但这里我们主要...

    hibernate主键生成策略

    - 对于 MySQL 和 SQL Server 数据库,则采用 `Identity` 方式生成自增主键。 - **特点**: - 实现简单,无需过多配置。 - 高度兼容不同数据库。 - 是最常用的主键生成策略之一。 ##### 2. **Assigned** - **...

    hibernate的主键生成策略

    在Hibernate中,主键生成策略是确保实体类中的主键字段具有唯一标识的关键部分。以下是对Hibernate主键生成策略的详细说明: 1. **assigned**: 这种策略要求用户在调用`save()`方法之前手动设置主键值。Hibernate...

    JPA主键策略(针对数据库自增字段重置后无效检查项)

    increment是一种插入数据的时候hibernate会给主键添加一个自增的主键的策略。这种策略维护一个计数器,所以在多个实例运行的时候不能使用这个方法。 foreign foreign是一种使用另外一个相关联的对象的主键的策略。...

    Hibernate主键策略-sequence

    Hibernate还提供了其他主键生成策略,如`increment`(适用于单线程环境),`identity`(数据库自增,如MySQL),`table`(通过独立的主键生成表)等,开发者应根据具体需求选择合适的策略。 6. **跨数据库兼容性**...

    hibernate 主键生成策略

    对于 MySQL 和 SQL Server,则使用 identity(自增主键生成机制)。这种方法非常灵活,通常推荐使用。 - **应用场景**:适用于多种数据库环境,尤其是当项目可能跨越不同类型的数据库时。 #### 2. Assigned - **...

    Hibernate用UUID作为主键的Demo

    - **隐私保护**:相比自增整型主键,UUID更难以关联到特定的用户或记录。 ### 3. 使用UUID的配置 在Hibernate中,我们可以通过定义主键生成策略来实现UUID的使用。具体做法是在实体类的主键字段上使用`@...

    Hibernate各种主键生成策略与配置详解

    increment策略由Hibernate在内存中自增生成主键,不依赖于数据库。它通过查询当前表的最大ID值,然后在内存中递增生成新的主键。由于这个过程不是线程安全的,因此在多JVM环境下可能会导致主键冲突。仅适用于单个...

    Hibernate的主键生成方式

    - **应用场景**:适合于高并发环境下,且数据库不支持自增主键的场景。 3. **seqhilo** - **定义**:与hilo类似,但是使用数据库序列(sequence)来实现高位值的管理。主要用于Oracle等支持序列的数据库。 - **...

    hibernate应用[包括示例,映射,主键自增,各种查询操作方式以及配置文档以及 Annotation示例]

    - **hibernate 非主键自增.doc**:关于非主键字段如何实现自动增长的策略。 - **Struts和Hibernate之间搭起桥梁.doc**:解释如何在Struts或Struts2框架下整合Hibernate,实现数据持久化。 - **hibernate 主键生成器...

    Hibernate复合主键.

    然而,对于复合主键,一般不推荐使用自增策略,因为复合主键通常由业务数据决定,而不是自动递增。 四、复合主键的持久化操作 在进行增删改查操作时,由于复合主键的存在,我们需要确保所有关联的主键值都被正确...

    真实项目中关于主键生成方式的剖析(JPA)

    而在MySQL和Microsoft SQL Server等数据库中,系统会自动创建并管理自增主键,无需用户干预。 在Oracle中,创建序列并获取下一个值通常通过`Sequence.nextval`方法完成,可以预定义或采用系统默认的参数。序列在...

Global site tag (gtag.js) - Google Analytics