`

关于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联合主键的例子

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

    hibernate复合主键映射

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

    hibernate的主键生成策略

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

    hibernate中基于主键的one2one

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

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

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

    Hibernate主键策略-sequence

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

    Hibernate用UUID作为主键的Demo

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

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

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

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

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

    Hibernate复合主键.

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

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

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

    在hibernate中实现oracle的自动增长

    在hibernate中实现oracle的自动增长

    Hibernate主键生成

    数据库自身处理主键的自增,适用于long、short或int类型。不适用于所有数据库系统,只在特定数据库中可用。 3. **seqhilo**:针对Oracle、DB2等支持Sequence的数据库,用于long、short或int类型。Sequence是数据库...

    hibernate难点重点笔记

    native策略则是由数据库自身决定主键生成,比如在MySQL中通常是自增,这样在查找和删除数据时更为便捷,但在插入时会稍慢。assigned策略允许开发者自定义主键生成方式,可以在程序运行时手动设置,但需注意在save()...

    Java代码生成工具新版

    支持自增主键,复合主键,外键关联。 生成Hibernate POJO类,Dao类,Service类,Action类。 生成保存,删除,修改,批量保存,批量修改,批量删除,按条件查询,分页查询等功能。 生成各大主流框架配置文件及JSP页面...

    韩顺平.2011版.hibernate_ppt.zip

    3. **实体类与数据表映射**:Hibernate使用注解或XML文件来定义实体类与数据库表的映射关系,例如`@Entity`、`@Table`等注解用于标识实体类和表,`@Id`表示主键,`@GeneratedValue`处理自增主键。 4. **Session接口...

    HIBERNATE - Relational Persistence for Idiomatic Java

    Hibernate支持多种主键策略,如自增主键、联合主键等。 5. **持久化(Persistence)**: Hibernate提供了四种持久化操作:CRUD(创建、读取、更新、删除)。`Session`接口是主要的持久化接口,负责管理实体的生命...

    黑马程序员_hibernate框架开发2016版讲义和笔记资料_day03

    2. 实体类与数据表映射:通过Hibernate的注解,我们可以将Java类与数据库中的表进行映射,例如@Entity表示该类是一个实体,@Table指定对应的数据库表,@Id标记主键字段,@GeneratedValue处理自增主键等。 3. ...

    hibernate最新版jar包(全)

    在Hibernate中,主键通过`@Id`注解标记,并可以使用`@GeneratedValue`控制自增策略。 3. **持久化(Persistence)**: Hibernate通过`Session`接口实现对象的持久化,它可以保存、更新和删除实体对象,并将这些变化...

Global site tag (gtag.js) - Google Analytics