今天用Hibernate操作Mysql数据库设置主键竟除了问题,主键设为uuid.String,启动服务时报错:
could not interpret id generator strategy: uuid.String
查了些资料最后得出结论:
在hibernate2.1中,主键生成策略中uuid分为uuid.hex和uuid.string,但是从hibernate3.0开始已经不再支持uuid.string
正好在复习下主键策略了。
(1) assigned
主键由外部程序负责生成,无需Hibernate参与。
(2) hilo
通过hi/lo 算法实现的主键生成机制,需要额外的数据库表保存主键生成历史状态。
(3) seqhilo
与hilo 类似,通过hi/lo 算法实现的主键生成机制,只是主键历史状态保存在Sequence中,适用于支持Sequence的数据库,如Oracle。
(4) increment
主键按数值顺序递增。此方式的实现机制为在当前应用实例中维持一个变量,以保存着当前的最大值,之后每次需要生成主键的时候将此值加1作为主键。
这种方式可能产生的问题是:如果当前有多个实例访问同一个数据库,那么由于各个实例各自维护主键状态,不同实例可能生成同样的主键,从而造成主键重复异常。因此,如果同一数据库有多个实例访问,此方式必须避免使用。
(5) identity
采用数据库提供的主键生成机制。如DB2、SQL Server、MySQL中的主键生成机制。
(6) sequence
采用数据库提供的sequence 机制生成主键。如Oralce 中的Sequence。
(7) native
由Hibernate根据底层数据库自行判断采用identity、hilo、sequence其中一种作为主键生成方式。
(8) uuid.hex
由Hibernate基于128 位唯一值产生算法生成16 进制数值(编码后以长度32 的字符串表示)作为主键。
(9) uuid.string
与uuid.hex 类似,只是生成的主键未进行编码(长度16)。在某些数据库中可能出现问题(如PostgreSQL)。
(10) foreign
使用外部表的字段作为主键。
一般而言,利用uuid.hex方式生成主键将提供最好的性能和数据库平台适
应性。
另外由于常用的数据库,如Oracle、DB2、SQLServer、MySql 等,都提供了易用的主键生成机制(Auto-Increase
字段或者Sequence)。我们可以在数据库提供的主键生成机制上,采用generator-class=native的主键生成方式。
不过值得注意的是,一些数据库提供的主键生成机制在效率上未必最佳,大量并发insert数据时可能会引起表之间的互锁。
数据库提供的主键生成机制,往往是通过在一个内部表中保存当前主键状态(如对于自增型主键而言,此内部表中就维护着当前的最大值和递增量),之后每次插入
数据会读取这个最大值,然后加上递增量作为新记录的主键,之后再把这个新的最大值更新回内部表中,这样,一次Insert操作可能导致数据库内部多次表读
写操作,同时伴随的还有数据的加锁解锁操作,这对性能产生了较大影响。因此,对于并发Insert要求较高的系统,推荐采用uuid.hex
作为主键生成
机制。
分享到:
相关推荐
在探讨Hibernate中联合主键的使用时,我们首先需要理解什么是联合主键以及它在Hibernate框架中的实现方式。联合主键(Composite Primary Key),是指在数据库表中使用两个或多个字段共同作为主键来唯一标识每一行...
### hibernate主键生成策略详解 #### 一、assigned **assigned** 主键生成策略意味着主键的值是由外部程序负责生成的,并且在执行 `save()` 方法之前必须明确指定一个值。在这种策略下,Hibernate 不参与主键的...
在Java的Hibernate框架中,复合主键映射是一种处理多列组合成主键的情况,它使得在数据库表中由两个或更多个字段组成的主键能够被正确地映射到实体类。在使用复合主键时,我们需要遵循一定的步骤和规则。 首先,...
* 如果一个项目中,对 SQL 语句的优化的要求比较高,这个时候不能用 Hibernate 来做 * 表之间的关系很复杂的情况下,不能用 Hibernate 来操作 * 如果一张表的数据超过了千万级别也不适合用 Hibernate 来做 ...
本文将围绕“ssh多主键插入”这一主题,深入探讨如何在Struts、Spring和Hibernate(SSH框架)中实现对具有多主键结构的数据表进行插入操作。我们将基于提供的代码片段,详细解析实现过程中的关键步骤和技术要点。 #...
这种方式非常适合表示一对多或多对多的关系中的主键。通过这种方式,可以更加灵活地管理和查询具有复杂关联关系的数据。 综上所述,Hibernate提供了丰富的特性来支持各种数据库操作需求,包括不同的加载策略、自动...
在本文中,我们将对 Hibernate 的源码进行深入分析,并探讨其核心特性和技术实现。 架构 Hibernate 的架构可以分为三层:Presentation Layer、Business Logic Layer 和 Data Access Layer。Presentation Layer ...
4. **持久化类与ID生成策略**:每个实体类通常有一个主键字段,Hibernate提供了多种ID生成策略,如 Assigned(手动赋值)、Identity(数据库自增)、Sequence(序列)等。 5. **Session**:Session是Hibernate的...
- 示例代码片段展示了一个简单的映射文件 `<class name="cn.javass.model.Child1Model" table="TBL_CHILD1">...</class>`,其中包含了如何定义主键 (`<id>`) 和普通属性 (`<property>`) 的基本结构。 #### 三、HQL...
通过对以上几种Hibernate主键生成策略的介绍与分析,我们可以看出每种策略都有其独特的适用场景和优缺点。在实际开发过程中,应根据具体需求和技术栈来合理选择主键生成策略,以达到最佳的数据处理效果。此外,随着...
6. **数据插入**:对持久态对象的属性进行赋值,然后调用Session的save()或persist()方法。save()方法适用于新对象,会立即生成主键;而persist()方法可能延迟生成主键,适用于级联保存。 7. **事务处理**:插入...
- 确认所有标有`not-null`的属性都有默认值或在保存前已被赋值。 - 如果使用注解方式,可以使用`@NotNull`或`@NotEmpty`等注解来替代。 #### 8. **TransientObjectException: object references an unsaved ...
- **声明访问器和为持久性字段赋值方法(可选)**:讲述了getter和setter方法在持久化中的作用。 - **实现继承**:讨论了如何在Hibernate中支持类的继承。 - **执行equals()和hashCode()**:解释了正确实现这两个...
在使用Hibernate框架时,合理的主键生成策略能够极大地简化开发工作并提升应用性能。Hibernate提供了多种主键生成策略: 1. **自然主键**:这类主键具有明确的业务含义,例如身份证号或学号等,适用于唯一性较高且...
本示例将深入探讨如何在Hibernate中实现多对一的关联关系。 首先,让我们理解多对一关联的基本概念。假设我们有两个实体,一个是`Employee`(员工),另一个是`Department`(部门)。在实际业务场景中,一个部门...
#### 六、Hibernate主键生成策略 - **主键生成策略**:在Hibernate中,可以通过配置不同的主键生成策略来满足不同场景的需求。 - `increment`:适用于自增长的主键。 - `identity`:依赖于数据库支持的身份字段。...
在 Hibernate 中,对象的 ID(主键)可以通过多种策略生成,包括: 1. **Identity**:依赖于数据库的自动增长机制,如 MySQL 的 AUTO_INCREMENT。 2. **Sequence**:使用数据库序列来生成 ID,适用于 Oracle 和 ...
Hibernate,作为一个强大的对象关系映射(ORM)框架,极大地简化了Java应用程序对数据库的操作。它通过将Java对象与数据库表进行映射,使得开发者可以以面向对象的方式处理数据,而无需直接编写SQL语句。在这个过程...
在实际项目开发中,合理配置`hibernate.cfg.xml`和`*.hbm.xml`文件,选择合适的主键生成策略,能够极大地提升应用程序的数据处理能力。 此外,Hibernate还提供了丰富的API接口,支持多种查询方式(如HQL、Criteria ...
通过对Hibernate的学习,我们了解了对象持久化的概念及其重要性,并深入探讨了如何利用Hibernate这一ORM框架来简化Java应用与数据库之间的交互。通过合理的配置和最佳实践的应用,可以显著提高应用程序的性能和可...