最近做数据库的时候,没有设置自动增加的主键。一开始没看出毛病,等做到修改的时候傻眼了!hibernate是根据ID来取出数据,保存也是根据ID。报错了:Batch update returned unexpected row count from update: 0 actual row count: 0 expected: 1。(主键设置为自增长,而在我们插入记录的时候设置了ID的值也会导致此错误)
查阅之后,原来这样违背了hibernate的原理。只能在数据库中再设置为一个自动增加的主键,不涉及到业务层!
附上hibernate主键设置的一篇文章(下面来自CSDN博客:http://blog.csdn.net/xiaomo2008/archive/2008/01/07/2029344.aspx)
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,有些会完全忽略你写的主键的值。
分享到:
相关推荐
这样,不同的数据库环境只需配置相应的连接参数,而无需修改核心的配置文件。 4. **大字段处理** - 当处理大量数据或大字段时,如BLOB或CLOB类型,需要注意内存管理和数据库性能。可以使用`lob`类型映射,或者考虑...
2. 复合主键的属性应尽可能选择不会更改的字段,以避免后续操作的复杂性。 3. 在使用复合主键时,要注意避免在多对一或一对多关系中直接使用复合主键作为外键,这可能导致映射问题。 总结,Hibernate对复合主键的...
- **更新**:对已存在的实体进行修改后,调用`Session`的`update()`方法来更新数据库。 - **删除**:通过`Session`的`delete()`方法移除数据库中的记录。 - **查询**: - `Session`的`get()`和`load()`方法根据...
在探讨Hibernate中联合主键的使用时,我们首先需要理解什么是联合主键以及它在Hibernate框架中的实现方式。联合主键(Composite Primary Key),是指在数据库表中使用两个或多个字段共同作为主键来唯一标识每一行...
例如,`create`会根据实体类自动创建数据库表,`update`则会在已有表的基础上更新结构,而`validate`只会验证数据库结构是否与实体类匹配,不进行任何修改。 6. **数据库连接**:Hibernate需要数据库连接才能执行...
2. **映射文件(Mapping Files)**:.hbm.xml文件定义了数据库表与实体类之间的映射规则,包括字段映射、主键生成策略等。 3. **配置文件(Configuration Files)**:如hibernate.cfg.xml,用于配置数据库连接信息、...
在IT行业中,Hibernate是一个非常重要的Java持久化框架,它简化了与关系型数据库之间的交互,使得开发者能够以对象-关系映射(ORM)的方式处理数据。在这个“Hibernate连接数据库模拟”项目中,我们将会深入探讨如何...
本文将深入探讨如何修改AHibernate(可能是Hibernate的一个扩展或特定实现)来实现数据库自动新增表参数,并在新参数上添加version数据库版本号,以便于进行数据一致性管理和版本控制。 首先,理解Hibernate的基本...
### 常用Hibernate主键生成策略详解 #### 一、引言 在数据库设计与操作过程中,主键是确保数据唯一性的关键...无论是自然主键还是代理主键,Hibernate都能够提供灵活而强大的支持,使得数据库操作变得更加简单高效。
### Hibernate注释方法描述数据库映射 #### 一、概述 Hibernate 是一款强大的对象关系映射(ORM)框架,它简化了 Java 开发者与数据库交互的过程。在 Hibernate 中,可以利用注解来描述实体类与数据库表之间的映射...
在这个状态下,对象的任何修改都会被Hibernate跟踪,但不会立即更新数据库,而是等到`commit()`时才执行SQL语句。当`Session.close()`时,对象变为游离态(Detached),即与数据库不再关联,但仍对应数据库中的记录...
- **定义**:Hibernate会根据当前使用的数据库类型自动选择最适合的主键生成策略(如identity、hilo、sequence)。 - **应用场景**:适用于跨数据库平台的应用开发,可以避免因为数据库不同而导致的代码修改。 8....
此外,还需要创建或修改Hibernate配置文件,该文件通常包含以下关键部分: 1. **配置文件**:用于初始化Hibernate SessionFactory,其中包含数据库连接信息、使用的方言(Dialect)、事务管理策略等。 2. **实体类...
Hibernate对数据库删除、查找、更新操作实例代码 Hibernate是Java Persistence API(JPA)的一种实现,提供了对数据库的CRUD(Create,Retrieve,Update,Delete)操作。下面将介绍Hibernate对数据库删除、查找、...
通过这种方式,Hibernate将知道如何处理`UserRole`类,将其映射到具有复合主键的数据库表。 3. 嵌入式主键(Embedded Id): 如果希望将主键字段作为实体类的一部分,而不是单独的类,可以使用`@EmbeddedId`和`@...
本示例通过一个通用的DAO(Data Access Object)类,展示了如何在不依赖Hibernate等ORM框架的情况下,进行数据库的增删改查操作。这有助于理解底层的SQL执行过程,同时也提供了更灵活的控制权。 首先,DAO模式是一...
4. **数据库迁移**:Hibernate的ORM特性使得更换数据库变得相对容易,只需更改配置和映射文件即可。 ### 学习与实践 学习Hibernate需要掌握Java基础、JDBC以及基本的SQL知识。通过阅读官方文档,理解其设计理念和...
在IT行业中,数据库是存储和管理数据的核心工具,而Hibernate是一个流行的关系型对象-关系映射(ORM)框架,它简化了Java应用与数据库之间的交互。本教程将深入讲解如何根据数据库表自动生成实体类、Hibernate配置...
在Java Hibernate框架中,联合主键(Composite Key)是指由两个或多个属性共同构成的主键,这在处理一些特定的数据模型时非常有用。本文将详细介绍如何使用Hibernate注解来定义联合主键。 首先,我们需要了解联合...
5. 支持多种数据库:Hibernate可以轻松切换不同的数据库,如MySQL、Oracle、PostgreSQL等,无需修改代码。 三、Hibernate3的应用 1. 配置:在项目中,我们需要配置Hibernate的连接参数,包括数据库URL、用户名、...