`

关于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中实现oracle的自动增长

    在hibernate中实现oracle的自动增长

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

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

    Java代码生成工具新版

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

    Java代码生成工具(傻瓜式操作无需教程的代码生成工具) v2.0.zip

    支持自增主键,复合主键,外键关联。  生成hibernate pojo类,dao类,service类,action类。  生成保存,删除,修改,批量保存,批量修改,批量删除,按条件查询,分页查询等功能。  生成各大主流框架配置文件...

    JPA学习笔记-EJB-03JPA主键生成策略总结

    总结一下关于JPA的主键生成策略,JPA是用@GeneratedValue标记来注释的。一般的我把主键生成分成两大类。第一个就是简单的单字段主键类型,一个就是复杂的复合主键类型。我们分2种情况分别讨论。 第一种单字段主键...

    Hibernate注解

    * 9.increnment 插入数据的时候hibernate会给主键添加一个自增的主键,但是一个hibernate实例就维护一个计数器,所以在多个实例运行的时候不能使用这个方法。 * 例:@GeneratedValue(generator = ...

    Struts2 Spring3 Hibernate3.3框架整合

    Struts2 Spring3 Hibernate3.3框架整合,增删改查,包含有数据库建表语句,包含有JAR包,包含有源代码。...使用的是Oracle的序列来提供的主键自增,建表和建立序列的sql语句,已经放在工程里面的WEBROOT目录下面了。

    AHibernate1.1

    4.实现功能:实现了主键自增和不自增控制方法的重载.默认使用主键自增, //insert(entity)方法Id会自增,相当于调用insert(entity,true); //使用insert(entity,false)这样方式可以插入有固定Id的数据 5.支持代码混淆...

    spring_demo:Spring MVC示范项目

    自增主键必须设置以下注解,否则报错 @GeneratedValue(strategy = GenerationType.IDENTITY) 在更新或删除数据时,必须调用getHibernateTemplate().flush(); 且在web.xml中添加 &lt;filter&gt;openSessionInViewFilter ...

    解决Hibernate JPA中insert插入数据后自动执行select last_insert_id()

    )Hibernate: select last_insert_id()表中有个主键是自增列。可是在以往的项目中,没发现有这样的问题。于是在网上各种找也找不到原因。心想可能是配置问题。 最终在persistence.xml配置文件中找

    Java学习指南21 MyBatis框架

    * 基于 MyBatis 的插入,自增主键的配置 * 基于 MyBatis 的更新与删除操作 * ResultMap 自定义结果映射 * Dynamic SQL 动态可变的SQL * 注解方式的 Mapper定义 * MyBatis 在Web项目中的应用,全局工厂实例的...

    教务管理系统(概要设计及详细设计).doc

    持久(PO)层是由hibernate架构实现的,它包括关于整体数据 库的,通过Spring集成模板HibernateTemplate提供DAO 来使用PO。在Spring 的配置文件(applicationContext. xml)中配置sessionFactory的bean 来管理...

    Spring.3.x企业应用开发实战(完整版).part2

    11.2.2 返回数据库的表自增主键值 11.2.3 批量更改数据 11.2.4 查询数据 11.2.5 查询单值数据 11.2.6 调用存储过程 11.3 BLOB/CLOB类型数据的操作 11.3.1 如何获取本地数据连接 11.3.2 相关的操作接口 11.3.3 插入...

    Spring3.x企业应用开发实战(完整版) part1

    11.2.2 返回数据库的表自增主键值 11.2.3 批量更改数据 11.2.4 查询数据 11.2.5 查询单值数据 11.2.6 调用存储过程 11.3 BLOB/CLOB类型数据的操作 11.3.1 如何获取本地数据连接 11.3.2 相关的操作接口 11.3.3 插入...

    Java学习笔记-个人整理的

    {1.8.1}自增运算}{28}{subsection.1.8.1} {1.8.1.1}Postincrement}{28}{subsubsection.1.8.1.1} {1.8.1.2}Preincrement}{28}{subsubsection.1.8.1.2} {1.8.1.3}复合赋值运算}{28}{subsubsection.1.8.1.3} {...

Global site tag (gtag.js) - Google Analytics