- 浏览: 419862 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (244)
- struts2 (15)
- ognl (1)
- hibernate (17)
- gwt (17)
- GROOVY (2)
- GRAILS学习 (7)
- SPRING (4)
- AJAX (2)
- JQUERY (6)
- XML (1)
- DWR (3)
- 线程 (0)
- SVN (0)
- json (1)
- anotation (0)
- 反射 (2)
- rapidframework (0)
- OA工作流 (2)
- 事务 (0)
- mysql (0)
- oracle (26)
- EXTJ (0)
- 求职 (2)
- 随笔 (22)
- 注释 (1)
- java综合 (30)
- 设计模式 (1)
- JSP SERVLET (2)
- 插件 (7)
- 应用 (3)
- HTML (5)
- flex (13)
- android (8)
- javascript (14)
- Exception (0)
- Linux (2)
- 计算机常识 (3)
- EXCEL (2)
- 正则表达式 (1)
- 开源工具 (2)
- 测试 (1)
- 生活 (7)
- 房子 (0)
- 购房大学 (4)
- UML (1)
- 服务器 (1)
- 发展 (1)
- 英语 (1)
- 项目管理 (1)
- 摘 (1)
- 网站 (1)
最新评论
-
a347911:
架构师教程:https://note.youdao.com/s ...
架构师之路--- 一个四年 JAVA 程序员的工作经历 转 -
hzxlb910:
对我帮助很大。
架构师之路--- 一个四年 JAVA 程序员的工作经历 转 -
xly_971223:
引用因此,while (!isInterrupted())也可 ...
Java 终止线程方法 -
zdglt88:
其实这个datagrid挺简单的,没有难度
Jquery easy ui 之datagrid简介 -
完善自我:
抓住重点,支持一下!
Jquery easy ui 之datagrid简介
Hibernate主键生成方式 Key Generator
主键产生器
可选项说明:
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中主键的生成方式中有一种是 UUID.HEX方式。
它是Hibernate系统自动生成一个32位长的字符串。
具体的使用方法是: 修改hbm.xml 主键的默认的手动生成方式 <generator class="assigned" /> 为<generator class="uuid.hex" />
如下是两个示例:
<id name="userid" type="java.lang.String">
<column name="USERID" length="20" />
<generator class="uuid.hex" />
</id>
<id name="empno" type="java.lang.String">
<column name="EMPNO" length="50"/>
<generator class="uuid.hex" ></generator>
</id>
我试着使用这种方法向数据库中插入了几条记录,得到的主键(32位字符串)如下:
402852432955363a012955363c110001
40285243295535a301295535a6980001
40285243295418b801295418bac60001
40285243295535e801295535ea770001
说到32位字符,我很自然的想到了php中的加密运算算法 md5() 。
下面是一些字符md5加密之后的结果:
a6907acf5b337a322193f19b6698c867 (jia)
d3d9446802a44259755d38e6d163e820 (10)
c02d0450cdd75ce7595f5eaeb5f041a3 (7988)
d603f7ff967282ff491e956b21f10a6c (c02d0450cdd75ce7595f5eaeb5f041a3)
9825f096ee35843407c643a5af383ab0 (d603f7ff967282ff491e956b21f10a6c)
如下是php中测试的代码:
echo "jia"." ========== ".md5(jia)."<br>";
echo "jia"." ========== ".md5("jia")."<br>";
echo "10"." ========== ".md5("10")."<br>";
echo "10"." ========== ".md5(10)."<br>";
echo "7988"." ========== ".md5(7988)."<br>";
echo "c02d0450cdd75ce7595f5eaeb5f041a3"." ==========
".md5(c02d0450cdd75ce7595f5eaeb5f041a3)."<br>";
echo "d603f7ff967282ff491e956b21f10a6c"." ==========
".md5(d603f7ff967282ff491e956b21f10a6c)."<br>";
UUID.HEX中使用某种算法生成了32位“无意义的”、“原理上不应该重复的字符”。我一直疑心它可能是把一些有序的数字(可以理解为序列)通过md5(或者是类似md5的算法,……应该就是md5,不应该有别的方法了)算法,装换为一些表面上无意义的字符(仔细看一下这些连续插入的主键,他们还是有些规律,至少前面几位还是相同的)。但这些字符作为主键来使用一定是不重复的(这是由数据库中主键的特征决定的)。一些表面上看起来是无意义的字符,同时还要确保他们的唯一性,目前谁能做到这一点?我想也只有md5了…………
查了一下资料: 在Java中是提供了加密算法的
MessageDigest md = MessageDigest.getInstance("MD5");
但是Java中的md5加密要自己去实现一些方法,对于同一个字符在Java中加密后的结果和在php中md5() 加密后的结果是不同的……
c02d0450cdd75ce7595f5eaeb5f041a3 (7988) php md5()
2d0450cdd75ce7595f5eaeb5f041a3 (7988)
/*
java.security
类 MessageDigest
java.lang.Object
java.security.MessageDigestSpi
java.security.MessageDigest
*/
//package com.tsinghua;
import java.security.*;
public class MD5Tool {
// 主方法
public static void main(String []args){
String test="7988";
//创建一个MD5Tool类
MD5Tool myMd5 =new MD5Tool();
// 调用 MD5Encrypt(String inStr) 方法
String result=myMd5.MD5Encrypt(test);
// 打印结果
System.out.println (test+" 加密後的结果是:"+result);
}
//该方法将你输入的字符串,通过md5加密,返回一个加密後的字符串
public static String MD5Encrypt(String inStr) {
MessageDigest md = null;
String outStr = null;
try {
md = MessageDigest.getInstance("MD5"); //可以选中其他的算法如SHA
byte[] digest = md.digest(inStr.getBytes());
//返回的是byet[],要转化为String存储比较方便
// 调用 bytetoString(byte 方法,返回一个输出结果
outStr = bytetoString(digest);
}
catch (NoSuchAlgorithmException nsae) {
nsae.printStackTrace();
}
return outStr;
}
//
public static String bytetoString(byte[] digest) {
String str = "";
String tempStr = "";
for (int i = 1; i < digest.length; i++) {
tempStr = (Integer.toHexString(digest[i] & 0xff));
if (tempStr.length() == 1) {
str = str + "0" + tempStr;
}
else {
str = str + tempStr;
}
}
return str.toLowerCase();
}
}
所有的<generator>的Class都是从net.sf.hibernate.id.IdentifierGenerator接口实现得到的,Class属性表示该generator是由哪种方式来生成的。生成方式包括:
increment:生成long, short或者int类型的主键,不能在cluster环境下使用。适用于所有数据库
identity:生成long, short或者int类型的主键。适用于DB2, MySQL, MS SQL Server, Sybase and HypersonicSQL
sequence :生成long, short或者int类型的主键。适用于DB2, PostgreSQL, Oracle, SAP DB, McKoi,Interbase.
hilo:生成long, short或者int类型的主键。需要提供一个数据库的表来存放生成的主键信息。当采用应用服务器的JTA提供的数据库连接或者用户自定义的数据库连接的时候,不要使用这种主键生成方式。适用于所有数据库
seqhilo:采用给定的数据库的sequence来生成long, short或者int类型的主键。适用于DB2, PostgreSQL, Oracle, SAP DB, McKoi,Interbase.
uuid.hex:采用128位的算法来生成一个32位字符串。最通用的一种方式。适用于所有数据库
uuid.string:同样采用128位的UUID算法。将生成的字符编码位16位。适用于除PostgreSQL.以外的数据库
native:根据具体连接的数据库从identity, sequence或者hilo选择一种来生成主键。适用的数据库根据选择的生成方式确定。
assigned: 交给应用自己给主键赋值。要注意的是赋值必须在调用save()方法之前完成。适用的数据库根据选择的生成方式确定。
主键产生器
可选项说明:
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中主键的生成方式中有一种是 UUID.HEX方式。
它是Hibernate系统自动生成一个32位长的字符串。
具体的使用方法是: 修改hbm.xml 主键的默认的手动生成方式 <generator class="assigned" /> 为<generator class="uuid.hex" />
如下是两个示例:
<id name="userid" type="java.lang.String">
<column name="USERID" length="20" />
<generator class="uuid.hex" />
</id>
<id name="empno" type="java.lang.String">
<column name="EMPNO" length="50"/>
<generator class="uuid.hex" ></generator>
</id>
我试着使用这种方法向数据库中插入了几条记录,得到的主键(32位字符串)如下:
402852432955363a012955363c110001
40285243295535a301295535a6980001
40285243295418b801295418bac60001
40285243295535e801295535ea770001
说到32位字符,我很自然的想到了php中的加密运算算法 md5() 。
下面是一些字符md5加密之后的结果:
a6907acf5b337a322193f19b6698c867 (jia)
d3d9446802a44259755d38e6d163e820 (10)
c02d0450cdd75ce7595f5eaeb5f041a3 (7988)
d603f7ff967282ff491e956b21f10a6c (c02d0450cdd75ce7595f5eaeb5f041a3)
9825f096ee35843407c643a5af383ab0 (d603f7ff967282ff491e956b21f10a6c)
如下是php中测试的代码:
echo "jia"." ========== ".md5(jia)."<br>";
echo "jia"." ========== ".md5("jia")."<br>";
echo "10"." ========== ".md5("10")."<br>";
echo "10"." ========== ".md5(10)."<br>";
echo "7988"." ========== ".md5(7988)."<br>";
echo "c02d0450cdd75ce7595f5eaeb5f041a3"." ==========
".md5(c02d0450cdd75ce7595f5eaeb5f041a3)."<br>";
echo "d603f7ff967282ff491e956b21f10a6c"." ==========
".md5(d603f7ff967282ff491e956b21f10a6c)."<br>";
UUID.HEX中使用某种算法生成了32位“无意义的”、“原理上不应该重复的字符”。我一直疑心它可能是把一些有序的数字(可以理解为序列)通过md5(或者是类似md5的算法,……应该就是md5,不应该有别的方法了)算法,装换为一些表面上无意义的字符(仔细看一下这些连续插入的主键,他们还是有些规律,至少前面几位还是相同的)。但这些字符作为主键来使用一定是不重复的(这是由数据库中主键的特征决定的)。一些表面上看起来是无意义的字符,同时还要确保他们的唯一性,目前谁能做到这一点?我想也只有md5了…………
查了一下资料: 在Java中是提供了加密算法的
MessageDigest md = MessageDigest.getInstance("MD5");
但是Java中的md5加密要自己去实现一些方法,对于同一个字符在Java中加密后的结果和在php中md5() 加密后的结果是不同的……
c02d0450cdd75ce7595f5eaeb5f041a3 (7988) php md5()
2d0450cdd75ce7595f5eaeb5f041a3 (7988)
/*
java.security
类 MessageDigest
java.lang.Object
java.security.MessageDigestSpi
java.security.MessageDigest
*/
//package com.tsinghua;
import java.security.*;
public class MD5Tool {
// 主方法
public static void main(String []args){
String test="7988";
//创建一个MD5Tool类
MD5Tool myMd5 =new MD5Tool();
// 调用 MD5Encrypt(String inStr) 方法
String result=myMd5.MD5Encrypt(test);
// 打印结果
System.out.println (test+" 加密後的结果是:"+result);
}
//该方法将你输入的字符串,通过md5加密,返回一个加密後的字符串
public static String MD5Encrypt(String inStr) {
MessageDigest md = null;
String outStr = null;
try {
md = MessageDigest.getInstance("MD5"); //可以选中其他的算法如SHA
byte[] digest = md.digest(inStr.getBytes());
//返回的是byet[],要转化为String存储比较方便
// 调用 bytetoString(byte 方法,返回一个输出结果
outStr = bytetoString(digest);
}
catch (NoSuchAlgorithmException nsae) {
nsae.printStackTrace();
}
return outStr;
}
//
public static String bytetoString(byte[] digest) {
String str = "";
String tempStr = "";
for (int i = 1; i < digest.length; i++) {
tempStr = (Integer.toHexString(digest[i] & 0xff));
if (tempStr.length() == 1) {
str = str + "0" + tempStr;
}
else {
str = str + tempStr;
}
}
return str.toLowerCase();
}
}
所有的<generator>的Class都是从net.sf.hibernate.id.IdentifierGenerator接口实现得到的,Class属性表示该generator是由哪种方式来生成的。生成方式包括:
increment:生成long, short或者int类型的主键,不能在cluster环境下使用。适用于所有数据库
identity:生成long, short或者int类型的主键。适用于DB2, MySQL, MS SQL Server, Sybase and HypersonicSQL
sequence :生成long, short或者int类型的主键。适用于DB2, PostgreSQL, Oracle, SAP DB, McKoi,Interbase.
hilo:生成long, short或者int类型的主键。需要提供一个数据库的表来存放生成的主键信息。当采用应用服务器的JTA提供的数据库连接或者用户自定义的数据库连接的时候,不要使用这种主键生成方式。适用于所有数据库
seqhilo:采用给定的数据库的sequence来生成long, short或者int类型的主键。适用于DB2, PostgreSQL, Oracle, SAP DB, McKoi,Interbase.
uuid.hex:采用128位的算法来生成一个32位字符串。最通用的一种方式。适用于所有数据库
uuid.string:同样采用128位的UUID算法。将生成的字符编码位16位。适用于除PostgreSQL.以外的数据库
native:根据具体连接的数据库从identity, sequence或者hilo选择一种来生成主键。适用的数据库根据选择的生成方式确定。
assigned: 交给应用自己给主键赋值。要注意的是赋值必须在调用save()方法之前完成。适用的数据库根据选择的生成方式确定。
发表评论
-
hibernate抓取策略
2012-04-20 09:58 1297Hibernate3 定义了如下几种抓取策略: 连接抓取( ... -
BLOB和CLOB的区别以及在ORALCE中的插入和查询操作
2012-04-09 12:59 1573ORACLE中的大对象: LONG: 可变长的字符串数据,最 ... -
Spring中关于SqlRowSet的Invalid scale size. Cannot be less than zero异常处理
2012-03-28 13:10 3794在使用Spring中使用JdbcTemplate.queryF ... -
hibernate open session in view 抛出异常解决方法
2012-03-23 20:52 1189http://www.blogjava.net/dreamst ... -
jdbcTemplate使用总结1
2011-09-20 15:16 1370SqlRowSet rs = jdbcTemplate.que ... -
java.lang.String 与string
2011-06-24 15:58 1035个人认为string应该是java.lang.String与数 ... -
hibernate一对多sort和order by
2011-04-15 09:23 15731. 從資料庫的觀點 ... -
Hibernate对集合排序
2011-04-15 09:19 1716Hibernate对集合中的元素支持两种排序方式: Ø 在数 ... -
Hibernate之deleted object would be re-saved by cascade 异常的解决
2011-02-24 11:31 939以下是我在网上找到的, 我用了第二种方法,奇怪的是: 我在ac ... -
Hibernate学习笔记
2011-02-12 16:25 1246HQL 注意事项: 1.请把以前sql中的表名换成类名,把字 ... -
hql 多表查询
2011-01-20 18:19 1145String sql = "select test1 ... -
拼接字符串的学习
2010-12-22 21:58 952package com.ccid.str; import j ... -
[原创]多条件模糊查询的通用代码
2010-12-22 18:31 1510str_query1 = "se ... -
Hibernate中使用Hql查询出一定时间段的记录【 Date 比较】
2010-12-22 18:30 20010// 初步过滤出符合条件的区域ID String sql = ... -
为什么我们要研究Hibernate ?-----转载自J道
2010-10-08 15:56 1070最近论坛上关于Hibernate ... -
HQL中修改对象属性的句子
2010-05-20 15:54 2090def newInstance = Organization. ...
相关推荐
UUID(Universally Unique Identifier),即通用唯一识别码,是一种用于创建唯一标识符的机制,常用于分布式系统中,确保每个实体都有一个独一无二的ID。本文将深入探讨如何使用Hibernate的形式生成UUID,通过分析一...
- `uuid.hex`和`uuid.string`: 生成128位UUID的16进制或非编码版本。 - `foreign`: 使用关联对象的ID作为主键。 - 可自定义主键生成策略,扩展Hibernate类。 2. **普通属性(property)配置**: - `property`...
Hibernate 是一个流行的 Java ORM(对象关系映射)框架,它允许开发者将Java类与数据库表进行映射,简化了数据库操作。在Hibernate中,为了能够将...在分布式环境中,`uuid.hex`和`uuid.string`可以提供全局唯一标识。
- **uuid.hex**:生成128位的UUID,转换为16进制字符串表示,适用于支持大文本类型的数据库如PostgreSQL。 - **native**:根据底层数据库选择最佳的主键生成策略。 #### 多对一与一对多关系映射 在ORM中,正确处理...
- `uuid.hex`: 128 位 UUID 转换为 16 进制字符串。 - `uuid.string`: 未经编码的 UUID 字符串,不适用于 PostgreSQL。 - `foreign`: 使用关联对象的标识符作为主键。 例如,使用 `native` 策略的主键配置如下: `...
此方式的实现机制为在当前应用实例中维持一个变量,以保存着当前的最大值,之后每次需要生成主键的时候将此值加1作为主键。 6. identity:该策略采用数据库提供的主键生成机制,如DB2、SQL Server、MySQL中的主键...
在Hibernate中,主键(Primary Key)是识别数据库表中每一行记录的唯一标识符。正确配置主键生成策略对于确保数据的完整性和一致性至关重要。以下是对Hibernate主键类型及其配置的详细说明: 1. **uuid.hex**: 这种...
那么,我们这里的解决方案是使用uuid.hex生成32个字符长度的ITEM_ID订单编号,然后CATEGORY_ITEM表根据这个订单编号来追加业务逻辑数据。 使用方式: 1、下载解压之后,使用MyEclipse导入工程 2、使用查询分析,把...
<generator class="uuid.hex"/> ``` - **身份列和序列** - 数据库特定的主键生成策略。 - 示例:MySQL 使用 `AUTO_INCREMENT`。 - **分配标识符** - 用户手动指定主键值。 - 示例: ```xml ``` - **...
在Hibernate中,可以通过`<generator class="uuid.hex"/>`来配置一个字段使用UUID.hex作为主键生成策略。这种方式特别适用于分布式系统,因为每个UUID都是独立生成且理论上不会重复。然而,由于UUID的长度较长,可能...
7. UUID(Universally Unique Identifier)生成器:Hibernate 提供了两种 UUID 生成器,`uuid.hex` 和 `uuid.string`。这两种生成器使用 128 位的 UUID 算法,生成全局唯一的标识符。`uuid.hex` 生成的是 32 位的...
在实际应用中,`native` 和 `assigned` 是最常见的选择,而在需要全局唯一标识符的情况下,`uuid.hex` 和 `uuid.string` 更受欢迎。希望本文能帮助您更好地理解和使用 Hibernate 的主键生成策略。
Hibernate各种主键生成策略详解,包括 assigned increment hilo seqhilo sequence identity native uuid foreign uuid.hex sequence-identity 等
10. **uuid.string**:与uuid.hex类似,但不编码,直接以16字符的字符串表示,可能在某些数据库中存在问题。 在选择主键生成策略时,需要考虑数据库特性、并发插入性能以及系统的具体需求。例如,对于并发插入要求...
本文档旨在对`hibernate配置元素例子.txt`进行深入解析,以便更好地理解Hibernate框架中所涉及的关键配置元素及其功能。通过具体实例,我们将探讨不同配置项的作用以及它们如何帮助我们实现对象关系映射(ORM)。 #...
在这个例子中,我们使用了`uuid.hex`作为主键生成策略,并将类的属性直接映射到同名的数据库列上。 3. **配置Hibernate**: 创建`hibernate.cfg.xml`配置文件,其中包含了数据库连接信息、方言设置(这里使用的是...
`Generator-Class`子节点指定主键生成策略,常见的有`increment`(适用于自增主键)、`identity`(依赖数据库的自动增长功能)、`sequence`(使用序列生成主键)、`uuid.hex`或`uuid.string`(生成UUID)。...