`
jeffleee
  • 浏览: 7629 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
文章分类
社区版块
存档分类

hibernate自增变量的操作(原+转)

阅读更多

最近初学Hibernate,遇到调用HibernateTemplate的save方法时,如果PO的ID字段没有手工设置无法保存的问题。

程序背景是,使用MySQL数据库,库表的ID字段设置为auto_increment,使用MyEclipse插件自动生成XX.hbm.xml文件以及相应的DAO,自动生成的DAO中用HibernateTemplate进行持久化的操作,如save();库表的ID字段需要自增,无需程序员手工维护,应该由Hibernate后台去完成生成操作。

这时出现一个问题,由IDE自动生成的XX.hbm.xml文件中,ID字段(主键,自增)的属性为<generator class="assinged"/>,如果使用的是Mysql数据库又需要hibernate自动生成自增变量,上述属性应改为<generator class="identity" />,这时问题就迎刃而解了!

查了相关资料,Hibernate主键会因为后台数据库的不同而需要不同的配置,下为转帖:
[size=x-large] Hibernate主键详解

HIbernate主键详解------Assigned Assigned方式由程序生成主键值,并且要在save()之前指定否则会抛出异常 特点:主键的生成值完全由用户决定,与底层数据库无关。用户需要维护主键值,在调用session.save()之前要指定主键值。主键由外部程序负责生成,无需Hibernate参与。
HIbernate主键详解------Hilo  Hilo使用高低位算法生成主键,高低位算法使用一个高位值和一个低位值,然后把算法得到的两个值拼接起来作为数据库中的唯一主键。Hilo方式需要额外的数据库表和字段提供高位值来源。默认请况下使用的表是通过hi/lo 算法实现的主键生成机制,需要额外的数据库表保存主键生成历史状态。hibernate_unique_key,默认字段叫作next_hi。next_hi必须有一条记录否则会出现错误。特点:需要额外的数据库表的支持,能保证同一个数据库中主键的唯一性,但不能保证多个数据库之间主键的唯一性。Hilo主键生成方式由Hibernate维护,所以Hilo方式与底层数据库无关,但不应该手动修改hi/lo算法使用的表的值,否则会引起主键重复的异常。
HIbernate主键详解------Increment Increment方式对主键值采取自动增长的方式生成新的主键值,但要求底层数据库的支持Sequence。如Oracle,DB2等。需要在映射文件xxx.hbm.xml中加入Increment标志符的设置。 特点:由Hibernate本身维护,适用于所有的数据库,不适合多进程并发更新数据库,适合单一进程访问数据库。不能用于群集环境。
主键按数值顺序递增。此方式的实现机制为在当前应用实例中维持一个变量,以保存着当前的最大值,之后每次需要生成主键的时候将此值加1作为主键。这种方式可能产生的问题是:如果当前有多个实例访问同一个数据库,那么由于各个实例各自维护主键状态,不同实例可能生成同样的主键,从而造成主键重复异常。因此,如果同一数据库有多个实例访问,此方式必须避免使用。
HIbernate主键详解------Identity Identity当时根据底层数据库,来支持自动增长,不同的数据库用不同的主键增长方式。 特点:与底层数据库有关,要求数据库支持Identity,如MySQl中是auto_increment, SQL Server 中是Identity,支持的数据库有MySql、SQL Server、DB2、Sybase和HypersonicSQL。 Identity无需Hibernate和用户的干涉,使用较为方便,但不便于在不同的数据库之间移植程序。采用数据库提供的主键生成机制。如DB2、SQL Server、MySQL中的主键生成机制。
HIbernate主键详解------Sequence Sequence需要底层数据库支持Sequence方式,例如Oracle数据库等特点:需要底层数据库的支持序列,支持序列的数据库有DB2、PostgreSql、Qracle、SAPDb等在不同数据库之间移植程序,特别从支持序列的数据库移植到不支持序列的数据库需要修改配置文件采用数据库提供的sequence 机制生成主键。如Oralce 中的Sequence。与hilo 类似,通过hi/lo 算法实现的主键生成机制,只是主键历史状态保存在Sequence中,适用于支持Sequence的数据库,如Oracle。
HIbernate主键详解------Native Native主键生成方式会根据不同的底层数据库自动选择Identity、Sequence、Hilo主键生成方式 特点:根据不同的底层数据库采用不同的主键生成方式。由于Hibernate会根据底层数据库采用不同的映射方式,因此便于程序移植,项目中如果用到多个数据库时,可以使用这种方式。由Hibernate根据底层数据库自行判断采用identity、hilo、sequence其中一种作为主键生成方式。
HIbernate主键详解------UUID UUID使用128位UUID算法生成主键,能够保证网络环境下的主键唯一性,也就能够保证在不同数据库及不同服务器下主键的唯一性。 特点;能够保证数据库中的主键唯一性,生成的主键占用比较多的存贮空间由Hibernate基于128 位唯一值产生算法生成16 进制数值(编码后以长度32 的字符串表示)作为主键。
HIbernate主键详解------Foreign GUID Foreign用于一对一关系中。GUID主键生成方式使用了一种特殊算法,保证生成主键的唯一性,支持SQL Server和MySQL
uuid.string与uuid.hex 类似,只是生成的主键未进行编码(长度16)。在某些数据库中可能出现问题(如PostgreSQL)。
foreign使用外部表的字段作为主键。一般而言,利用uuid.hex方式生成主键将提供最好的性能和数据库平台适应性。
[/size]
分享到:
评论

相关推荐

    韩顺平hibernate3.3视频教程源码4-5day

    安装过程中,需要设置相关的环境变量,包括JDBC驱动和Hibernate库,并配置hibernate.cfg.xml文件,其中包含了数据库连接信息和Hibernate的配置参数。 教程中,韩顺平老师会详细讲解Hibernate的实体类设计,这是使用...

    HIBERNATE - Relational Persistence for Idiomatic Java

    Hibernate是Java领域中一款著名的对象关系映射(ORM)框架,它允许开发人员使用面向对象的方式来操作数据库,而无需直接编写SQL语句。"Relational Persistence for Idiomatic Java"这个标题表明Hibernate的核心功能...

    Struts2 + Hibernate 分页程序实例

    2. **编写DAO层**:利用Hibernate提供的API进行数据访问操作,如查询、更新等。 3. **实现分页逻辑**:在DAO层或Service层中实现分页查询的逻辑,可以通过设置SQL语句中的LIMIT关键字来实现。 4. **整合Struts2与...

    hibernate_annotation_中文帮助文档

    系统配置涉及环境变量设置,如JDBC驱动,以及Hibernate的配置文件(如`hibernate.cfg.xml`)。 2. **实体Bean映射** - **EJB3注解**:实体Bean是ORM的核心,EJB3注解提供了在Java类上直接声明数据库映射的方法。 ...

    Hibernate -annotation 学习笔记

    Hibernate 是一个流行的开源Java对象关系映射(ORM)框架,它极大地简化了数据库操作,使得开发人员可以使用面向对象的方式处理数据存储。Annotation是Hibernate提供的一种元数据方式,允许在Java类和字段上直接添加...

    hibernate框架学习笔记整理

    **Hibernate框架**是一种用于Java应用的**对象关系映射**(Object-Relational Mapping, ORM)解决方案,它允许开发者使用面向对象的方式操作数据库中的表(即执行CRUD操作),而无需直接编写SQL语句。 - **ORM**:...

    hibernate配置

    - **JDK安装**:Hibernate基于Java运行,所以首先确保已安装了Java Development Kit,并设置好环境变量。 - **Maven或Gradle**:大多数现代项目使用构建工具如Maven或Gradle管理依赖。在`pom.xml`或`build.gradle`...

    hibernate笔记心得

    Hibernate是一个对象关系映射(ORM)工具,它允许开发人员使用面向对象的方式来处理数据库操作,从而减轻了传统JDBC编程的繁琐工作。在本文中,我们将重点讨论通过注解方式使用Hibernate的心得体会。 在使用...

    AHibernate1.1

    参数替换为了传入的变量,sql能直接运行. 4.实现功能:实现了主键自增和不自增控制方法的重载.默认使用主键自增, //insert(entity)方法Id会自增,相当于调用insert(entity,true); //使用insert(entity,false)这样方式...

    hibernate_anoatation(中文版)

    Hibernate注解是用于标记Java类或其成员变量的一种特殊类型的数据元数据,用于定义持久化实体与数据库表之间的映射规则。通过注解,开发者可以清晰地定义实体类、属性、关联关系等如何映射到数据库表中,极大地提高...

    hibernate注解说明文档

    为了更好地集成 Hibernate 并简化开发过程,Hibernate 提供了一系列的注解,这些注解可以直接标注在 Java 类或其成员变量上,实现对数据库表结构和操作的配置。本文将详细介绍这些注解的功能及其使用方法。 #### 二...

    java 面试题

    5. **运算符优先级**:`+=`运算符具有更高的优先级,可以直接用于`short`变量的自增操作,如`short s1 = 1; s1 += 1;`,而`s1 = s1 + 1;`需要类型转换,因为加法运算结果是`int`。 6. **保留字`goto`**:`goto`在...

    手把手教您搭建SSH框架环境

    Hibernate是一个对象关系映射(ORM)框架,简化了Java应用与数据库之间的交互,允许开发者用面向对象的方式来操作数据库。 【SSH框架环境搭建步骤】 1. **数据库创建** - 代码创建:通过SQL语句创建名为`demouse`...

    SSH_CRUD整合实例

    SSH_CRUD整合实例是针对Java Web开发中的三大框架——Struts、Spring和Hibernate进行集成,实现数据的创建(Create)、读取(Read)、更新(Update)和删除(Delete)操作的一个经典案例。这个实例适用于初学者熟悉...

    java常见错误集

    在使用Hibernate自增ID时,确保高位表已正确配置。 20. **Syntax error**:在XML配置文件中,可能存在非法字符。在这种情况下,"module-role"表名中的连字符需要更改为下划线。 21. **集合插入错误**:在配置文件...

    面试题集2_opt1

    【short变量自增】 当试图将两个short类型的值相加并赋值回原来的short变量时,结果会默认为int类型,需要进行强制类型转换。例如: ```java short s1 = 1; s1 = (short) (s1 + 1); ``` 而使用`+=`运算符时,Java...

    javase javaee linux 大数据教程

    - ORM 框架如 Hibernate 用于简化数据库操作。 - **前端技术**: - HTML/CSS/JavaScript 用于构建用户界面。 - Ajax 技术实现局部刷新功能。 - jQuery 等 JavaScript 库简化客户端脚本编写。 - **Linux系统管理...

    SSH考试题目面试题目借鉴.pdf

    在系统中,Hibernate用于操作体育场馆、奥运门票和订票信息等数据库记录。 - **Spring**:提供依赖注入(DI)和面向切面编程(AOP)功能,管理应用程序的各个组件,包括事务管理和数据库事务控制。 2. **环境配置*...

Global site tag (gtag.js) - Google Analytics