第三章标识符属性生成策略与对象识别
-
increment生成策略
-
identity生成策略
-
sequence生成策略
-
hilo生成策略
-
seqhilo生成策略
-
uuid生成策略
-
guid生成策略
-
native生成策略
-
assigned生成策略
-
foreign生成策略
在
Hibernate
的映射文件
(*.hbm.xml)
中,
<id>
元素定义了持久化类的标识符属性的名称,类型和数据库中字段的映射。
<id>
元素的
<generator>
子元素则用来设置当前持久化类的标识符属性的生成策略
org.hibernate.idIdentifierGenerator
接口
1.increment生成策略
从数据库表中获取当前主键字段的最大值,然后再最大值的基础上加1,作为当前持久化对象的标识符属性值。(increment是)
<id name="id" type="java.lang.Integer" column="ID">
<generatory class="increment">
</generator>
</id>
2.identity生成策略
在MS SQL Server, MySQL和DB2等数据库中,都可以设置表中某个字段的数值自动增长,都可以设置表中某一个字段的数值自动增长,而identity生成策略就是通过使用这种方式,为当前的记录获取主键值的同时为持久化对象富裕标识符属性值。
<id name="id" type="java.lang.Integer" column="ID">
<generator class="identity">
</generator>
</id>
3. sequence生成策略
在Oracle,DB2和PostgreSQL等数据库中创建一个序列(sequence),然后Hibernate通过序列为当前的记录获取主键值,进而为持久化对象赋予标识符属性值。
<id name="id" type="java.lang.Integer" column="ID">
<generator class="sequence">
<param name="sequence">gb_seq</param>
</generator>
</id>
4.hilo生成策略
hilo生成策略采用一种称为高/低位(hi/lo)的高效算法,产生的标识符属性值为long,short,int以及他们封装类的类型。
<id name="id" type="java.lang.Integer" column="ID">
<generator class="hilo">
<param name="table">hibernate_key</param>
<param name="column">next_hivalue</param>
</generator>
</id>
5.seqhilo生成策略
seqhilo生成策略使用的还是高/位算法,产生的标识符属性值为long,short,int以及他们封装的类型。与hilo生成策略不同的是,它使用指定的sequence获取高位值。
<id name="id" type="java.lang.Integer" column="ID">
<generator class="seqhilo">
<param name="sequence">hibernate_seq</param>
</generator>
</id>
6.uuid生成策略
uuid生成策略采用128位的UUID算法来生成一个字符串类型的主键值,这个算法使用IP地址,JVM的启动时间(精确到1/4秒),系统时间和一个计数值(在当前的JVM中唯一)经过计算来产生标识符的属性值,可以用于分布式的Hibernate应用中。
<id name="id" type="java.lang.String" column="ID">
<generator class="uuid">
</generator>
</id>
效率很高,但是产生的是字符串类型,所以如果要使用,注意类型要匹配。
7. guid生成策略(只支持MS SQL Server & My SQL)
8.native生成策略
由Hibernate根据所使用的数据库支持能力从identity,sequence或者hilo生成策略中选择一种,其示配置信息如下
<id name="id" type="java.lang.Integer" column="ID">
<generator class="native">
</generator>
</id>
9.assigned生成策略(由程序员自己控制)
assigned生成策略由Hibernate应用自主指定标识符属性的数值,也就是说,在调用Session对象的save()方法持久化对象时,需要先对持久化对象的标志符属性赋值。
<id name="id" type="java.lang.Integer" column="ID">
<generator class="assigned">
</generator>
</id>
10.foreign生成策略
foreign生成策略通过关联的持久化对象为当前持久化对象设置标识符属性值,当处理持久化类一对一关联时,一个持久化类的标识符属性值可以参考关联持久化类的标识符属性值的获取。
例如:
使用这种方式映射复合主键,持久化类需要使用一个单独的主键类对复合主键进行映射,主键类中的属性就是映射复合主键字段的属性。
(oracle中不能建立名为user的表,因为已经存在该表了)
create table USERS
(
NAME VARCHAR2(40) not null,
BIRTHDATE DATE not null,
EMAIL VARCHAR2(200),
PASSWORD VARCHAR2(200)
)
将name和birtDate组合成为一个复合主键。
package com.crazy;
/**
* User entity. @author MyEclipse Persistence Tools
*/
public class User implements java.io.Serializable {
private static final long serialVersionUID = 1L;
private UserId id;
private String email;
private String password;
public User() {
}
/** minimal constructor */
public User(UserId id) {
this.id = id;
}
/** full constructor */
public User(UserId id, String email, String password) {
this.id = id;
this.email = email;
this.password = password;
}
// Property accessors
public UserId getId() {
return this.id;
}
public void setId(UserId id) {
this.id = id;
}
public String getEmail() {
return this.email;
}
public void setEmail(String email) {
this.email = email;
}
public String getPassword() {
return this.password;
}
public void setPassword(String password) {
this.password = password;
}
}
package com.crazy;
import java.util.Date;
/**
* UserId entity. @author MyEclipse Persistence Tools
*/
public class UserId implements java.io.Serializable {
private String name;
private Date birthdate;
public UserId() {
}
public UserId(String name, Date birthdate) {
this.name = name;
this.birthdate = birthdate;
}
public String getName() {
return this.name;
}
public void setName(String name) {
this.name = name;
}
public Date getBirthdate() {
return this.birthdate;
}
public void setBirthdate(Date birthdate) {
this.birthdate = birthdate;
}
}
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!--
Mapping file autogenerated by MyEclipse Persistence Tools
-->
<hibernate-mapping>
<class name="com.crazy.User" table="USERS" schema="SCOTT">
<composite-id name="id" class="com.crazy.UserId">
<key-property name="name" type="java.lang.String">
<column name="NAME" length="40" />
</key-property>
<key-property name="birthdate" type="java.util.Date">
<column name="BIRTHDATE" length="7" />
</key-property>
</composite-id>
<property name="email" type="java.lang.String">
<column name="EMAIL" length="200" />
</property>
<property name="password" type="java.lang.String">
<column name="PASSWORD" length="200" />
</property>
</class>
</hibernate-mapping>
http://commonclipse.sourceforge.net/download.html
自动生成hashcode和equal方法的eclipse插件。还需要下载类库:
http://commons.apache.org/lang/
分享到:
相关推荐
第3章 领域模型和元数据 3.1 CaveatEmptor应用程序 3.1.1 分析业务领域 3.1.2 CaveatEmptor领域模型 3.2 实现领域模型 3.2.1 处理关注点渗漏 3.2.2 透明和自动持久化 3.2.3 编写POJO...
ID5通用ID是一个共享的中立标识符,即使在没有第三方Cookie的环境中,发布者,广告商和广告技术平台也可以使用该标识符来识别用户。 ID5使网站可以创建共享的第一方标识符并将其分配给整个生态系统。 广告技术平台...
第3章 模糊测试方法和模糊器类型 3.1 模糊测试方法 3.1.1 预先生成测试用例 3.1.2 随机方法 3.1.3 协议变异人工测试 3.1.4 变异或强制性测试 3.1.5 自动协议生成测试 3.2 模糊器类型 3.2.1 本地模糊器 3.2.2 远程...
第三篇 电子商务与安全性 第14章 运营一个电子商务网站 14.1 我们要实现什么目标 14.2 考虑电子商务网站的类型 14.2.1 使用在线说明书公布信息 14.2.2 接收产品或服务的订单 14.2.3 提供服务和数字产品 14.2.4...
第三篇 电子商务与安全性 第14章 运营一个电子商务网站 14.1 我们要实现什么目标 14.2 考虑电子商务网站的类型 14.2.1 使用在线说明书公布信息 14.2.2 接收产品或服务的订单 14.2.3 提供服务和数字产品 14.2.4...
第3章 使用数组 3.1 什么是数组 3.2 数字索引数组 3.2.1 数字索引数组的初始化 3.2.2 访问数组的内容 3.2.3 使用循环访问数组 3.3 使用不同索引的数组 3.3.1 初始化相关数组 3.3.2 访问数组元素 3.3.3 使用循环语句 ...
第3章.调试器揭密 78 3.1.用户态调试器的内幕78 3.1.1.操作系统对用户态调试器的支持78 3.1.2.调试事件的顺序 83 3.1.3.控制来自调试器的异常和事件 84 3.1.4.内核态调试器中的调试事件处理105 3.2.控制调试目标 106...
382.5 探索窗体设计视图和VBA类模块 392.6 现实世界—所学知识的透视 40第3章 Access导航 423.1 理解Access功能和模式 423.1.1 定义Access功能 423.1.2 定义Access操作模式 443.2 理解Access的表显示 443.2.1 最大化...
382.5 探索窗体设计视图和VBA类模块 392.6 现实世界—所学知识的透视 40第3章 Access导航 423.1 理解Access功能和模式 423.1.1 定义Access功能 423.1.2 定义Access操作模式 443.2 理解Access的表显示 443.2.1 最大化...
382.5 探索窗体设计视图和VBA类模块 392.6 现实世界—所学知识的透视 40第3章 Access导航 423.1 理解Access功能和模式 423.1.1 定义Access功能 423.1.2 定义Access操作模式 443.2 理解Access的表显示 443.2.1 最大化...
382.5 探索窗体设计视图和VBA类模块 392.6 现实世界—所学知识的透视 40第3章 Access导航 423.1 理解Access功能和模式 423.1.1 定义Access功能 423.1.2 定义Access操作模式 443.2 理解Access的表显示 443.2.1 最大化...
382.5 探索窗体设计视图和VBA类模块 392.6 现实世界—所学知识的透视 40第3章 Access导航 423.1 理解Access功能和模式 423.1.1 定义Access功能 423.1.2 定义Access操作模式 443.2 理解Access的表显示 443.2.1 最大化...
382.5 探索窗体设计视图和VBA类模块 392.6 现实世界—所学知识的透视 40第3章 Access导航 423.1 理解Access功能和模式 423.1.1 定义Access功能 423.1.2 定义Access操作模式 443.2 理解Access的表显示 443.2.1 最大化...
382.5 探索窗体设计视图和VBA类模块 392.6 现实世界—所学知识的透视 40第3章 Access导航 423.1 理解Access功能和模式 423.1.1 定义Access功能 423.1.2 定义Access操作模式 443.2 理解Access的表显示 443.2.1 最大化...
语言标识符一个基本的网络应用程序,使用神经网络中的语言三元组来识别语言这是一个基本的Web应用程序,可以识别作为输入提供的语言。 语言标识符使用神经网络进行训练,该神经网络使用Europarl数据集和Tatoeba数据...
382.5 探索窗体设计视图和VBA类模块 392.6 现实世界—所学知识的透视 40第3章 Access导航 423.1 理解Access功能和模式 423.1.1 定义Access功能 423.1.2 定义Access操作模式 443.2 理解Access的表显示 443.2.1 最大化...
382.5 探索窗体设计视图和VBA类模块 392.6 现实世界—所学知识的透视 40第3章 Access导航 423.1 理解Access功能和模式 423.1.1 定义Access功能 423.1.2 定义Access操作模式 443.2 理解Access的表显示 443.2.1 最大化...
382.5 探索窗体设计视图和VBA类模块 392.6 现实世界—所学知识的透视 40第3章 Access导航 423.1 理解Access功能和模式 423.1.1 定义Access功能 423.1.2 定义Access操作模式 443.2 理解Access的表显示 443.2.1 最大化...
382.5 探索窗体设计视图和VBA类模块 392.6 现实世界—所学知识的透视 40第3章 Access导航 423.1 理解Access功能和模式 423.1.1 定义Access功能 423.1.2 定义Access操作模式 443.2 理解Access的表显示 443.2.1 最大化...
382.5 探索窗体设计视图和VBA类模块 392.6 现实世界—所学知识的透视 40第3章 Access导航 423.1 理解Access功能和模式 423.1.1 定义Access功能 423.1.2 定义Access操作模式 443.2 理解Access的表显示 443.2.1 最大化...