- 浏览: 702401 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (362)
- java基础 (33)
- html/css+div/javascript (17)
- Ajax/XML/JSON/XSL (7)
- JQuery (11)
- Extjs (1)
- JSP/Servlet (19)
- MVC模式 (4)
- struts 1 (17)
- Struts 2.3.4 (17)
- Spring 3.2 (26)
- Springmvc (3)
- Hibernate 4.1 (21)
- ibatis (6)
- Velocity模板语言 (2)
- Rose框架 (5)
- EJB (1)
- JUnit测试 (2)
- 数据库DB (24)
- 重构 / 设计模式 (3)
- 开发工具IDE (37)
- 数据结构与算法设计 (3)
- Android (12)
- Linux (4)
- bug集合 (29)
- 缓存技术(redis) (3)
- Lucene全文索引 (15)
- maven3.0.5 (4)
- 小工具集合 (18)
- 面试题 (5)
- 闲聊 (11)
- 其他 (4)
- 接口API (2)
- work (2)
- Flex (0)
- JMS (1)
- 开源项目集合 (1)
- 技术博客 (1)
- 分类04 (0)
- 分类05555 (0)
最新评论
-
小小小羊:
好屌...
java.lang.NoClassDefFoundError: org/aspectj/weaver/reflect/ReflectionWorld$Refle -
liubinli2005:
这个可以脱底spring。单独使用吗?
DAO层:jade -
cangbaotu:
我觉得对于开发者来说,能脚本化编写爬虫是一件挺开心的事情( ̄▽ ...
网页爬取 -
asjava:
很好的文章, 但每段代码清单都重复了一次.
spring 事务 -
xia635317478:
jethypc 写道验证码的session无法传过去啊 还是我 ...
登陆验证码(struts2实现)
ID生成策略
1.XX.hbm.xml方式
a、常用四个:native identity sequence uuid
Native主键生成方式会根据不同的底层数据库自动选择Identity、Sequence、Hilo主键生成方式
特点:根据不同的底层数据库采用不同的主键生成方式。由于Hibernate会根据底层数据库采用不同的映射方式,因此便于程序移植,项目中如果用到多个数据库时,可以使用这种方式
b、
<!-- UUID 生成策略 --> <!-- ID类型 必须是 String --> <!-- 类似于网卡生成的类型 --> <class name="Person"> <id name="id"> <generator class="uuid"></generator> </id> <property name="name"/> <property name="weight"/> </class> <!--native 生成策略--> <!-- ID类型 必须是 int--> <!--由数据库自动递增--> <id name="id" > <generator class="native"></generator> </id> <id name="id" column="team_id"> <generator class="identity"/> </id>
2.JPA注解生成方式@GeneratedValue
JPA提供的四种标准用法为TABLE,SEQUENCE,IDENTITY,AUTO.
TABLE:使用一个特定的数据库表格来保存主键。
SEQUENCE:根据底层数据库的序列来生成主键,条件是数据库支持序列。
IDENTITY:主键由数据库自动生成(主要是自动增长型)
AUTO:主键由程序控制。
a、 @GeneratedValue 默认为native
b、 @GeneratedValue(strategy=GenerationType.AUTO)
主键自增长
i. 默认:对 MySQL,使用auto_increment
ii. 对 Oracle使用hibernate_sequence(名称固定)
c、 @GeneratedValue(strategy=GenerationType.IDENTITY)
不能用于oracle,因为oracle不支持IDENTITY; oracle是SEQUENCE
d、 SEQUENCE(@GeneratedValue(strategy=GenerationType.SEQUENCE))
@SequenceGenerator(可自定义在数据库生成指定的sequence名)
例如:
//定义sequence名为teacherSEQ @SequenceGenerator(name="teacherSEQ",sequenceName="teacherSEQ_DB") public class Teacher { private int id; } //调用自定义的teacherSEQ @Id @GeneratedValue(strategy=GenerationType.SEQUENCE,generator="teacherSEQ") public int getId() { return id; } public void setId(int id) { this.id = id; }
e、Table
@Entity @TableGenerator(name="sequence_team",table="team") //可以设置表名,表列名,表初始值等等信息 从而取代了@Table(name="team") public class Team { private int id; private String name; @Id @GeneratedValue(strategy=GenerationType.TABLE,generator="sequence_team") public int getId() { return id; } ........ }
Hibernate的id生成策略有下面几种:[/
color]
1.Increment
用于为long,short或者int类型生成唯一标识,只有在没有其他进程往同一张表中插入数据库时才能使用。在集群下不要使用。
对于集群为什么不要使用,是因为在一个大型的项目中如果我们有很多的服务器为项目提供服务,这样就会出项一种情况,A服务在15:25拿到数据库中的数据的 id为15,此时B服务器向数据库中插入了一条数据,这时数据库中的id为16了,但A服务中的session依旧保存着15,但下一条数据通过A服务向数据库中保存数据的时候session会为id赋值为16,可数据库中的id已经为16了,所以这时保存就会出错。
2.identity:
对 DB2,MySQL,MS SQL Server,Sybase 和 HypersonicSQL 的内置标识字段提供支持。返回的标识符是 long,short 或者 int 类型的。
3.sequence
在 DB2,PostgreSQL,Oracle,SAP DB,McKoi 中使用序列(sequence), 而在 Interbase
中使用生成器(generator)。返回的标识符是 long,short 或者 int 类型的。
4.hilo
使用一个高/低位算法高效的生成 long,short 或者 int 类型的标识符。给定一个表和字段(默认分别是 hibernate_unique_key 和 next_hi)作为高位值的来源。高/低位算法生成的标识符只在一个特定的数据库中是唯一的。
5.seqhilo
使用一个高/低位算法来高效的生成 long,short 或者 int 类型的标识符,给定一个数据库序列(sequence)的名字。
6.uuid
基于一个自定义的算法生成一个128位的UUID。所产生的价值
表示为32个十六进制数字的字符串。
7.guid
在 MS SQL Server 和 MySQL 中使用数据库生成的 GUID 字符串。
8.native
根据底层数据库的能力选择 identity、sequence 或者 hilo 中的一个。
9.assigned
让应用程序在调用 save() 之前为对象分配一个标识符。这是 <generator> 元素没有指定时的默认生成策略。
10.select
通过数据库触发器选择一些唯一主键的行并返回主键值来分配一个主键。
11.foreign
使用另外一个相关联的对象的标识符。它通常和 <one-to-one> 联合起来使用。
12.sequence-identity
一种特别的序列生成策略,它使用数据库序列来生成实际值,但将它和 JDBC3 的getGeneratedKeys 结合在一起,使得在插入语句执行的时候就返回生成的值。目前为止只有面向 JDK 1.4 的 Oracle 10g 驱动支持这一策略。由于 Oracle 驱动程序的一个 bug,这些插入语句的注释被关闭了。
我们通常用的比较多的就是[color=red]native、identity、sequence在一些情况下我们会用到uuid,其他的就用的很少了。
举例说明uuid
下面来测试一下uuid,还用原来的Student类,既然是测试uuid那我们的id就必须为String类型了。
Student类
package cc.tukai.entity; import java.io.Serializable; import javax.persistence.Entity; import javax.persistence.Id; import javax.persistence.Table; //@Entity //@Table(name = "Student") public class Student implements Serializable { private static final long serialVersionUID = -5596241291862147220L; private String id; private String name; private int age; //@Id public String getId() { return id; } public void setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; }
Student.hbm.xml
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="cc.tukai.entity"> <class name="Student" table="student"> <id name="id" column="id"> <generator class="uuid"></generator> </id> <property name="name" type="java.lang.String"> <column name="name" length="32"></column> </property> <property name="age" type="java.lang.Integer"> <column name="age" length="10"></column> </property> </class> </hibernate-mapping>
发表评论
-
hibernate缓存总结
2013-09-05 09:54 746hibernate缓存总结 Hibernat ... -
Hibernate原理
2013-09-05 09:10 1189Hibernate原理 1.hibernate ... -
getHibernateTemplate().save和super.getHibernateTemplate().merge
2012-12-05 15:16 3004代码1_save: super.getHibernate ... -
分页查询
2012-12-03 16:57 847HibernateTemplate提供了非常多的常用方法来完成 ... -
mappingResource属性和mappingDirectoryLocations属性的使用
2012-11-19 16:54 648mappingResource属性和mappingDirect ... -
S2SH整合
2012-11-12 16:08 1085Struts2_spring_Hibernate整合 MyE ... -
spring中配置log4j
2012-11-10 16:30 1651log4j 和 slf4j slf4j和log4j用于做日志 ... -
log4j 和slf4j
2012-11-11 20:55 874http://sishuok.com/forum/blogPo ... -
Hibernate两级缓存
2012-10-29 17:01 768Hibernate两级缓存 一级缓存就是Session级别 ... -
数据加载 load get list iterator
2012-10-07 11:14 1072Hibernate的优化-数据加载 除了对映射文件的配置外 ... -
栏目、帖子、回复(设置导航ManyToOne便于操作 QBC/QBE语句)02
2012-10-06 11:39 1081栏目、帖子、回复(设置导航ManyToOne便于操作QBC/Q ... -
栏目、帖子、回复(设置导航便于操作)HQL使用01
2012-10-06 11:28 960栏目、帖子、回复(设置导航ManyToOne便于操作 HQL语 ... -
Many-To-Many (学生、课程、分数)
2012-10-05 17:41 1340Many-To-Many (学生、课程、分数) 多对多: 一个 ... -
树状结构Tree
2012-10-05 17:09 1157树状结构Tree 一、部门类Org.java impo ... -
CUDR_Fetch 和 Cascade
2012-10-05 16:05 4705CUDR_Fetch 和 Cascade 1.Fetch ... -
OneToOne 、OneToMany 、 ManyToMany
2012-10-05 10:31 3548OneToOne OneToMany ManyToMa ... -
对象的几种状态
2012-10-04 14:10 1401对象的几种状态 1.Transient 刚new一个 ... -
load 和 get的区别
2012-10-04 11:49 1253session加载数据库数据时,load 和 get 1. ... -
Hibernate 注解和配置文件由ORM框架连接库
2012-10-02 12:30 4195Hibernate 注解和配置文件由ORM框架连接库 xm ... -
Hibernate 实现原理
2012-09-12 23:20 4189整体流程 1:通过configuration来读cfg.xml ...
相关推荐
在Java的持久化框架Hibernate中,ID生成策略是至关重要的一个环节。它是用来唯一标识数据库中每一行记录的关键部分。本教程将详细讲解Hibernate中的ID生成策略,以及如何在实际项目中灵活应用。 首先,ID生成策略是...
JAVA ID生成策略 JAVA ID生成策略是一种在Hibernate框架中使用的策略,用于生成实体类的主键值。这种策略在Annotation情况下,主要有三种方式生成主键值。 第一种方式是使用数据库的自动增长字段生成。这种方式...
分布式ID生成策略是现代互联网应用中的重要组成部分,尤其是在大数据时代,每个数据实体通常都需要一个唯一标识符(ID)来区分其身份。Snowflake算法是由Twitter开源的一种高效且可扩展的分布式ID生成方案,广泛应用...
分布式ID生成策略是现代互联网应用中的重要组成部分,尤其是在大数据时代,每个请求、每条记录往往都需要一个全局唯一的标识。Snowflake算法就是一种被广泛使用的分布式ID生成方案,它由Twitter开源,具有时间戳、...
在Spring Cloud生态系统中,"gateway+sleuth+docker+单点登陆+全局ID生成策略"是一组关键组件,用于构建高效、可扩展的微服务架构。让我们深入探讨这些概念及其在实际开发中的应用。 首先,Spring Cloud Gateway是...
在Java编程中,自动生成ID是一项常见的需求,特别是在数据库记录、分布式系统节点标识等领域。"java自动生成id策略"指的是设计并实现一种机制,确保...实际应用中,还需要根据业务需求和系统规模选择适合的ID生成策略。
在 MyBatis 中,我们可以自定义代码生成策略来满足特定的需求。 自定义 MyBatis 代码生成器涉及到以下几个核心概念: 1. **配置文件**:在 MyBatis Generator(MBG)中,我们首先需要创建一个 XML 配置文件,用于...
生成全局ID的方法很多, 这里记录下一种简单的方案: 利用mysql的自增id生成全局唯一ID. 1. 创建一张只需要两个字段的表: CREATE TABLE `guid` ( `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, `stub` char(1...
在实际应用中,我们可以根据业务需求选择合适的ID生成策略。例如,如果对ID的排序有要求,可以选择基于时间戳的方案;如果对ID长度有严格限制,可以考虑使用ObjectID;如果需要高并发且无特定顺序要求,雪花算法可能...
2. **扩展性**:设计ID生成策略时,考虑其可配置性和可扩展性,让不同的业务模块可以选择不同的ID生成策略。 3. **测试覆盖**:对修改后的代码进行全面的单元测试,确保新功能的正确性和原有功能不受影响。 4. **...
### Java ID生成器详解 #### 一、引言 在软件开发过程中,特别是在数据库操作时,经常需要为每个新创建的记录分配一个唯一的标识符(ID)。为了满足这一需求,Java 开发者们通常会设计一种高效且可靠的 ID 生成...
通过对不同场景需求的分析,我们可以选择适合的ID生成策略。无论是基于时间戳排序还是利用数据库特性,亦或是采用高级算法如雪花算法,都应该根据具体的应用场景和技术栈来决定最佳实践方案。未来随着技术的发展,...
2. `watch.go`:这可能是用来监控和响应系统变化的代码,例如,当系统负载变化或新的数据库连接需要时,这个文件中的逻辑可能会自动调整ID生成策略。 3. `model.go`:文件中可能定义了与ID生成相关的数据模型,如...
例如,Snowflake算法是一种广泛使用的分布式ID生成策略,由Twitter开源。它生成的是64位的ID,其中包括时间戳、工作节点ID和序列号,可以保证全局唯一且按时间顺序排序。虽然Snowflake不是Apache Commons Lang的一...
Vesta-ID-Generator这个文件名可能是特定的ID生成库,它可能提供了更高级的功能,比如定制化的ID生成策略,或者优化的性能以满足高并发环境的需求。在实际项目中,开发者可能会选择这样的库来代替标准的Java UUID...
- 对于超大规模的系统,可以考虑使用多层ID生成策略,比如区域节点+工作节点+序列号。 通过以上步骤,我们可以在SpringBoot项目中成功地集成Vesta ID Generator,为分布式系统提供稳定、高效的全局唯一ID生成方案...
雪花算法是由Twitter开源的一种分布式ID生成策略,生成的ID是一个Long类型,由41位时间戳(毫秒精度)、10位机器ID(5位数据中心ID和5位机器ID)以及12位序列号组成。这样的设计确保了在分布式环境下的全局唯一性。...
雪花算法是一种分布式ID生成策略,由Twitter开源,其设计目标是在分布式系统中生成具有全局唯一性、有序性和高并发性的ID。在MySQL中实现雪花算法,主要是通过自定义函数来模拟这个过程。 首先,我们需要创建一个名...
1. **Snowflake算法**:这是一种常见的分布式ID生成策略,由Twitter开源。它通过时间戳、工作节点ID和序列号三部分组成,确保全局唯一性。然而,这里的描述并没有明确提及Snowflake,而是暗示了可能有其他自定义实现...