之前在做oracle的主键策略上使用了increment,就是把主键的计数交给了Hibernate,此时就发生了一个问题,如果两个Jvm进程同时开启并加入数据,那么就会出问题,很明显ID重复了!
有朋友建议我用UUID,其实我不太喜欢UUID,看到那么一长串的字符还真让人头痛呢!而且还有个小坏习惯就是排序的时候不用时间用ID来的!
后来研究了一下开始使用oracle的Sequence:
1、先在oracle上写一个Sequence:
CREATE SEQUENCE "TEST"."SQ_COMMEND" MINVALUE 1 MAXVALUE 999999999999999999999999999 INCREMENT BY 1 START WITH 21 CACHE 20 NOORDER NOCYCLE ;
2、pojo上的批注
@Entity
@Table(name="COMMEND")
public class Commend {
@Id
@GeneratedValue(strategy=GenerationType.SEQUENCE,generator="sq_commend")
@SequenceGenerator(name="sq_commend",sequenceName="SQ_COMMEND")
@Column(name="ID")
private int id;
@Column(name="CONTENT")
private String content;
get,set略……
}
就这两步好了,主键生成策略好了!可以用了,写个Test测试一下吧!
居然ID 从50起步,而且每次的步长是50我很无语,最要命的是之前设置的都没问题,对比了N久也没发现问题……
在同一个测试里些了两个add方法,他们的Id是相差一的,是正常的。于是猜测每个终端每次连接oralce都会获取一块id区域然后自由分配,从新连接原来的id作废,重新获取!具体是否如此,也只是个人猜测。
看看代码,看看hibernate设置,怎么也没看到问题啊!后来跑去查了下hibernate相关资料发现这样的两个参数设置:
allocationSize = 1, initialValue = 1
于是把pojo的批注改成:
@Entity
@Table(name="COMMEND")
public class Commend {
@Id
@GeneratedValue(strategy=GenerationType.SEQUENCE,generator="sq_commend")
@SequenceGenerator(name="sq_commend", allocationSize = 1, initialValue = 1,sequenceName="SQ_COMMEND")
@Column(name="ID")
private int id;
@Column(name="CONTENT")
private String content;
get,set略……
}
就没问题了!估计allocationSize就是设置拿取范围的地方!(讲的比较浅还是希望大家拍装一下!)
分享到:
相关推荐
关于Hibernate的各种主键生成策略与配置详解
在Java的持久化框架Hibernate中,主键生成策略是一个至关重要的概念,它决定了数据库表中主键值如何自动生成。主键通常是表中唯一标识记录的一列,对于数据的完整性和一致性至关重要。以下是对Hibernate中主键生成...
在 Hibernate 中,主键生成策略是一个重要的概念,用于指定如何为持久化对象生成唯一的标识符(即主键)。合理的主键生成策略不仅能提高应用程序的性能,还能确保数据的一致性和完整性。 #### 二、主键生成策略分类...
【hibernate主键生成策略】是Hibernate框架中用于生成持久化对象主键的重要机制,它决定了如何在数据库中创建唯一的标识符。在SSH(Spring、Struts、Hibernate)架构中,Hibernate作为持久层框架,主键生成策略的...
实际上,在使用“native”策略时,Hibernate会根据当前数据库环境自动选择合适的主键生成策略。 ##### 3.2 Oracle数据库中的序列创建 为了使“native”策略正确地为Oracle数据库生成主键,还需要在数据库中预先...
### 常用Hibernate主键生成策略详解 #### 一、引言 在数据库设计与操作过程中,主键是确保数据唯一性的关键要素之一。在实际应用中,开发者经常需要处理不同类型的数据库,并且需要应对各种不同的主键生成需求。...
Hibernate各种主键生成策略详解,包括 assigned increment hilo seqhilo sequence identity native uuid foreign uuid.hex sequence-identity 等
在基于注解的Hibernate中,我们可以在实体类上使用注解如`@Entity`、`@Table`、`@Id`等,来声明数据库表的映射关系。此外,`@GeneratedValue`用于指定主键生成策略,`@OneToMany`、`@ManyToOne`等注解用于建立关联...
### hibernate主键生成策略详解 #### 一、assigned **assigned** 主键生成策略意味着主键的值是由外部程序负责生成的,并且在执行 `save()` 方法之前必须明确指定一个值。在这种策略下,Hibernate 不参与主键的...
在Hibernate中,主键生成策略是确保实体类中的主键字段具有唯一标识的关键部分。以下是对Hibernate主键生成策略的详细说明: 1. **assigned**: 这种策略要求用户在调用`save()`方法之前手动设置主键值。Hibernate...
在Java的持久化框架中,如JPA(Java Persistence API)和Hibernate,主键生成策略是数据模型设计的重要部分。主键通常是表中唯一标识记录的一列或一组列,用于确保数据的完整性和唯一性。本篇文章将深入探讨JPA的4种...
在 Hibernate 中,主键生成策略是一项核心功能,用于确定如何为持久化实体生成唯一的标识符。以下是 Hibernate 支持的主要主键生成策略的详细解析: #### 1. Native - **描述**:此策略根据所使用的数据库类型自动...
1主键常用的生成策略 2对数据库的依赖性总结 3关于主键生成策略的选择 详细解释