- 浏览: 64016 次
- 性别:
- 来自: 武汉
最新评论
-
武大鹏程加内特:
武大鹏程加内特 写道任雅菲 写道
3Q 呵呵
你QQ多少? ...
第十一章 MyEclipse自动生成映射文件(上) -
武大鹏程加内特:
zzy90718 写道
第九章 Spring配置数据连接池 -
武大鹏程加内特:
任雅菲 写道
3Q 呵呵
第十一章 MyEclipse自动生成映射文件(上) -
武大鹏程加内特:
任雅菲 写道
第十一章 MyEclipse自动生成映射文件(上) -
任雅菲:
第十一章 MyEclipse自动生成映射文件(上)
Generator 主键生成器
increment
用于为long, short或者int类型生成 唯一标识。只有在没有其他进程往同一张表中插入数据时才能使用。 在集群下不要使用。
identity
对DB2,MySQL, MS SQL Server, Sybase和HypersonicSQL的内置标识字段提供支持。 返回的标识符是long, short 或者int类型的。
sequence
在DB2,PostgreSQL, Oracle, SAP DB, McKoi中使用序列(sequence), 而在Interbase中使用生成器(generator)。返回的标识符是long, short或者 int类型的。
hilo
使用一个高/低位算法高效的生成long, short 或者 int类型的标识符。给定一个表和字段(默认分别是 hibernate_unique_key 和next_hi)作为高位值的来源。 高/低位算法生成的标识符只在一个特定的数据库中是唯一的。
seqhilo
使用一个高/低位算法来高效的生成long, short 或者 int类型的标识符,给定一个数据库序列(sequence)的名字。
uuid
用一个128-bit的UUID算法生成字符串类型的标识符, 这在一个网络中是唯一的(使用了IP地址)。UUID被编码为一个32位16进制数字的字符串。
guid
在MS SQL Server 和 MySQL 中使用数据库生成的GUID字符串。
native
根据底层数据库的能力选择identity, sequence 或者hilo中的一个。
assigned
让应用程序在save()之前为对象分配一个标示符。这是 <generator>元素没有指定时的默认生成策略。
select
通过数据库触发器选择一些唯一主键的行并返回主键值来分配一个主键。
foreign
使用另外一个相关联的对象的标识符。通常和<one-to-one>联合起来使用。
sequence-identity
一种特别的序列生成策略,使用数据库序列来生成实际值,但将它和JDBC3的getGeneratedKeys结合在一起,使得在插入语句执行的时候就返回生成的值。目前为止只有面向JDK 1.4的Oracle 10g驱动支持这一策略。注意,因为Oracle驱动程序的一个bug,这些插入语句的注释被关闭了。
我们需要掌握的主键生成器
uuid
用一个128-bit的UUID算法生成字符串类型的标识符, 这在一个网络中是唯一的(使用了IP地址)。UUID被编码为一个32位16进制数字的字符串。 UUID包含:IP地址,JVM的启动时间(精确到1/4秒),系统时间和一个计数器值(在JVM中唯一)。 在Java代码中不可能获得MAC地址或者内存地址,所以这已经是我们在不使用JNI的前提下的能做的最好实现了。
native
根据底层数据库的能力选择identity, sequence 或者hilo中的一个。 如果数据库对应的字段是自增型的,可以用此主键策略.
assigned
让应用程序在save()之前为对象分配一个标示符。这是 <generator>元素没有指定时的默认生成策略。
需要注意的地方:
<!-- 是否自动创建对应的数据库表-->
<property name="hbm2ddl.auto">create</property>
这个开关,我们现在暂时最好不要用,因为每次程序启动,会先执行drop table语句.会将先前的数据删除掉.
下面我们来看这几种主键生成器的用法
CREATE TABLE `users` (
`userId` int NOT NULL auto_increment,
`userName` varchar(255) default NULL,
`userPwd` varchar(255) default NULL,
PRIMARY KEY (`userId`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
在MySQL中建立此表, 注意userId在这里是int型,并自增.
编写User.hbm.xml, hibernate.cfg.xml两个配置文件,配置文件中这里变动一下:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="chapter1.model.User" table="Users">
<id name="userId" type="java.lang.Integer" column="userId">
<generator class="native" />
</id>
<property name="userName" type="java.lang.String" column="userName" />
<property name="userPwd" type="java.lang.String" column="userPwd" />
</class>
</hibernate-mapping>
注意,因为type这里我们用到了Integer,所以我们在Model类中也应该用Integer,其实用int也可以,因为Java有自动的装箱拆箱操作.
package chapter1.model;
public class User {
private Integer userId;
private String userName;
private String userPwd;
public User() {
super();
}
public User(String userName, String userPwd) {
super();
this.userName = userName;
this.userPwd = userPwd;
}
public Integer getUserId() {
return userId;
}
public void setUserId(Integer userId) {
this.userId = userId;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getUserPwd() {
return userPwd;
}
public void setUserPwd(String userPwd) {
this.userPwd = userPwd;
}
}
Dao层我们不动:
package chapter1.dao;
import org.hibernate.Session;
import chapter1.model.User;
import commons.util.HibernateUtil;
public class UserDao {
public void create(User user) {
Session session = HibernateUtil.getSessionFactory().getCurrentSession();
session.beginTransaction();
session.save(user);
session.getTransaction().commit();
}
public static void main(String[] args) {
UserDao userDao = new UserDao();
User user = new User("zhanghaidang2", "791126");
userDao.create(user);
}
}
可以看到主键按自增方式增长,符合我们平时的习惯.
但是从现在开始,我建议大家使用uuid.hex方式生成主键.
Hibernate的Session中几个常用的方法
save:保存对象
update:更新对象
delete:删除对象
get:获取单个对象
createQuery:获取对象的集合
saveOrUpdate: 根据ID的值是否为空,自动调用save或update方法来更新对象.
注意的地方:Hibernate中事务的使用规则, save,update,delete这些操作涉及到数据库中数据的更改,一定要用事务进行提交, get, createQuery用于查询对象,可以不用事务.
下面我们来看一下对单张表的增删改查的操作.
首先在MySQL中建一个student表
CREATE TABLE `students` (
`id` varchar(32) NOT NULL,
`name` varchar(32) default NULL,
`age` int(11) default NULL,
`birthday` datetime default NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
增
public class StudentDao {
public void insertStudent(Student student) {
Session session = HibernateUtil.getSessionfactory().getCurrentSession();
try {
session.beginTransaction();
session.save(student);
session.getTransaction().commit();
} catch (Exception e) {
session.getTransaction().rollback();
}
}
public static void main(String[] args) throws ParseException {
StudentDao sd = new StudentDao();
// 方式一:
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Date date = sdf.parse("1988-10-22");
Student student1 = new Student("张三", 22, new java.sql.Date(date
.getTime()));
sd.insertStudent(student1);
// 方式二:
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.YEAR, 1988);
calendar.set(Calendar.MONTH, 0);
calendar.set(Calendar.DAY_OF_MONTH, 21);
Student student2 = new Student("李四", 22, new java.sql.Date(calendar
.getTimeInMillis()));
sd.insertStudent(student2);
}
}
increment
用于为long, short或者int类型生成 唯一标识。只有在没有其他进程往同一张表中插入数据时才能使用。 在集群下不要使用。
identity
对DB2,MySQL, MS SQL Server, Sybase和HypersonicSQL的内置标识字段提供支持。 返回的标识符是long, short 或者int类型的。
sequence
在DB2,PostgreSQL, Oracle, SAP DB, McKoi中使用序列(sequence), 而在Interbase中使用生成器(generator)。返回的标识符是long, short或者 int类型的。
hilo
使用一个高/低位算法高效的生成long, short 或者 int类型的标识符。给定一个表和字段(默认分别是 hibernate_unique_key 和next_hi)作为高位值的来源。 高/低位算法生成的标识符只在一个特定的数据库中是唯一的。
seqhilo
使用一个高/低位算法来高效的生成long, short 或者 int类型的标识符,给定一个数据库序列(sequence)的名字。
uuid
用一个128-bit的UUID算法生成字符串类型的标识符, 这在一个网络中是唯一的(使用了IP地址)。UUID被编码为一个32位16进制数字的字符串。
guid
在MS SQL Server 和 MySQL 中使用数据库生成的GUID字符串。
native
根据底层数据库的能力选择identity, sequence 或者hilo中的一个。
assigned
让应用程序在save()之前为对象分配一个标示符。这是 <generator>元素没有指定时的默认生成策略。
select
通过数据库触发器选择一些唯一主键的行并返回主键值来分配一个主键。
foreign
使用另外一个相关联的对象的标识符。通常和<one-to-one>联合起来使用。
sequence-identity
一种特别的序列生成策略,使用数据库序列来生成实际值,但将它和JDBC3的getGeneratedKeys结合在一起,使得在插入语句执行的时候就返回生成的值。目前为止只有面向JDK 1.4的Oracle 10g驱动支持这一策略。注意,因为Oracle驱动程序的一个bug,这些插入语句的注释被关闭了。
我们需要掌握的主键生成器
uuid
用一个128-bit的UUID算法生成字符串类型的标识符, 这在一个网络中是唯一的(使用了IP地址)。UUID被编码为一个32位16进制数字的字符串。 UUID包含:IP地址,JVM的启动时间(精确到1/4秒),系统时间和一个计数器值(在JVM中唯一)。 在Java代码中不可能获得MAC地址或者内存地址,所以这已经是我们在不使用JNI的前提下的能做的最好实现了。
native
根据底层数据库的能力选择identity, sequence 或者hilo中的一个。 如果数据库对应的字段是自增型的,可以用此主键策略.
assigned
让应用程序在save()之前为对象分配一个标示符。这是 <generator>元素没有指定时的默认生成策略。
需要注意的地方:
<!-- 是否自动创建对应的数据库表-->
<property name="hbm2ddl.auto">create</property>
这个开关,我们现在暂时最好不要用,因为每次程序启动,会先执行drop table语句.会将先前的数据删除掉.
下面我们来看这几种主键生成器的用法
CREATE TABLE `users` (
`userId` int NOT NULL auto_increment,
`userName` varchar(255) default NULL,
`userPwd` varchar(255) default NULL,
PRIMARY KEY (`userId`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
在MySQL中建立此表, 注意userId在这里是int型,并自增.
编写User.hbm.xml, hibernate.cfg.xml两个配置文件,配置文件中这里变动一下:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="chapter1.model.User" table="Users">
<id name="userId" type="java.lang.Integer" column="userId">
<generator class="native" />
</id>
<property name="userName" type="java.lang.String" column="userName" />
<property name="userPwd" type="java.lang.String" column="userPwd" />
</class>
</hibernate-mapping>
注意,因为type这里我们用到了Integer,所以我们在Model类中也应该用Integer,其实用int也可以,因为Java有自动的装箱拆箱操作.
package chapter1.model;
public class User {
private Integer userId;
private String userName;
private String userPwd;
public User() {
super();
}
public User(String userName, String userPwd) {
super();
this.userName = userName;
this.userPwd = userPwd;
}
public Integer getUserId() {
return userId;
}
public void setUserId(Integer userId) {
this.userId = userId;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getUserPwd() {
return userPwd;
}
public void setUserPwd(String userPwd) {
this.userPwd = userPwd;
}
}
Dao层我们不动:
package chapter1.dao;
import org.hibernate.Session;
import chapter1.model.User;
import commons.util.HibernateUtil;
public class UserDao {
public void create(User user) {
Session session = HibernateUtil.getSessionFactory().getCurrentSession();
session.beginTransaction();
session.save(user);
session.getTransaction().commit();
}
public static void main(String[] args) {
UserDao userDao = new UserDao();
User user = new User("zhanghaidang2", "791126");
userDao.create(user);
}
}
可以看到主键按自增方式增长,符合我们平时的习惯.
但是从现在开始,我建议大家使用uuid.hex方式生成主键.
Hibernate的Session中几个常用的方法
save:保存对象
update:更新对象
delete:删除对象
get:获取单个对象
createQuery:获取对象的集合
saveOrUpdate: 根据ID的值是否为空,自动调用save或update方法来更新对象.
注意的地方:Hibernate中事务的使用规则, save,update,delete这些操作涉及到数据库中数据的更改,一定要用事务进行提交, get, createQuery用于查询对象,可以不用事务.
下面我们来看一下对单张表的增删改查的操作.
首先在MySQL中建一个student表
CREATE TABLE `students` (
`id` varchar(32) NOT NULL,
`name` varchar(32) default NULL,
`age` int(11) default NULL,
`birthday` datetime default NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
增
public class StudentDao {
public void insertStudent(Student student) {
Session session = HibernateUtil.getSessionfactory().getCurrentSession();
try {
session.beginTransaction();
session.save(student);
session.getTransaction().commit();
} catch (Exception e) {
session.getTransaction().rollback();
}
}
public static void main(String[] args) throws ParseException {
StudentDao sd = new StudentDao();
// 方式一:
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Date date = sdf.parse("1988-10-22");
Student student1 = new Student("张三", 22, new java.sql.Date(date
.getTime()));
sd.insertStudent(student1);
// 方式二:
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.YEAR, 1988);
calendar.set(Calendar.MONTH, 0);
calendar.set(Calendar.DAY_OF_MONTH, 21);
Student student2 = new Student("李四", 22, new java.sql.Date(calendar
.getTimeInMillis()));
sd.insertStudent(student2);
}
}
发表评论
-
第十七章 离线,命名查询
2010-05-03 20:29 827 离线查询 在Hibernate中,查询有两种方式,一种是 ... -
第十六章 批量插入,多类分页查询
2010-05-03 20:26 957批量插入 有时候我们需要做导入的功能,那么这个时候就需要批量插 ... -
第十五章 事务边界问题
2010-05-03 20:24 2593 事务边界问题 我们先回顾一下我们现在写的代码: 可 ... -
第十四章 缓存的使用
2010-05-03 20:18 828缓存的使用 我们先来模拟一个缓存的机制 以查询学生为示例: p ... -
第十三章 lazy懒加载
2010-05-03 20:12 947lazy属性:懒加载 作用:当调用方法的时候才去执行要执行的S ... -
第十二章 继承关系的映射
2010-05-03 20:07 856继承模型 在企业中经常会有员工的分类 我们在Java对象模型 ... -
第十一章 MyEclipse自动生成映射文件(下)
2010-04-28 19:57 1253选中必要的选项 选择主键生成的策略: 设置类名与数据库 ... -
第十一章 MyEclipse自动生成映射文件(上)
2010-04-28 19:44 3193 设置数据库连接 转换视图 创建新的数据库连接 设置 ... -
第十章 Inverse的作用
2010-04-28 19:04 743Inverse的作用 我们还是拿上一章的班级与学生的示例来说 ... -
第九章 级联,集合映射
2010-04-28 19:03 766级联开关 1.级联是指两个对象之间的操作联动关系,对一个对象执 ... -
第八章 Hibernate分页
2010-04-28 18:55 657Hibernate分页 -
第七章 多对多
2010-04-28 18:50 637 多对多 什么情况下会出现多对多呢?比如学生选课就会出现多 ... -
第六章 一对一关系
2010-04-28 18:49 746什么时候采用一对一关系映射呢? 比如我们有时在网上注册的时候, ... -
第五章 一对多关系
2010-04-28 18:44 800 一对多的关系 在学生与班级对象模型中,通常多个学生实体对应 ... -
第四章 多对一关系
2010-04-28 18:43 838今天我们讲多表操作, 多对一的关系 何为多对一呢? 示例: 学 ... -
第三章 对象的状态
2010-04-28 18:42 852 current_session_context_class ... -
第二章 Hibernate增删改查参考
2010-04-28 18:39 1661Hibernate中对增删改查的小结 mysql中库表N ... -
第二章 策略及对象增删改查操作
2010-04-28 18:37 1068Generator 主键生成器 incre ... -
第一章 Hibernate环境搭建
2010-04-28 18:34 1417如果是WEB工程,我们只需 ...
相关推荐
第二篇 JDBC篇 第5章 JDBC技术基础 5.1 JDBC概述 5.2 JDBC API 5.3 JDBC操作数据库 5.4 本章小结 第6章 JDBC的高级特性 6.1 PreparedStatement预编译对象 6.2 CallableStatement存储过程对象 6.3 ...
第二章 快速入门 第三章 Python 基础 第四章 Python对象 第五章 数字 第六章 序列:字符串、列表和元组 第七章 映射和集合类型 第八章 条件和循环 第九章 文件和输入输出 第十章 错误和异常 第十一章 函数...
第5章 对象-关系映射基础 101 本章主要介绍单个持久化类与单个数据库表之间进行映射的方法,尤其是当持久化类的属性不和数据库表的字段一一对应时的映射技巧。 5.1 持久化类的属性及访问方法 101 5.1.1 基本类型...
第5章 对象-关系映射基础 101 本章主要介绍单个持久化类与单个数据库表之间进行映射的方法,尤其是当持久化类的属性不和数据库表的字段一一对应时的映射技巧。 5.1 持久化类的属性及访问方法 101 5.1.1 基本类型...
第5章 对象-关系映射基础 5.1 持久化类的属性及访问方法 5.1.1 基本类型属性和包装类型属性 5.1.2 Hibernate访问持久化类属性的策略 5.1.3 在持久化类的访问方法中加入程序逻辑 5.1.4 设置派生属性 ...
14 第二部分 主观题 15 第1章 绪论 15 第2章 关系数据库 22 第3章 关系数据库标准语言SQL 26 第4章 关系系统及其查询优化 34 第5章 关系数据理论 36 第6章 数据库设计 42 第7章 数据库恢复技术 53 第8章 并发控制 60...
第二篇 Windows编程 第5章 Windows程序设计 第6章 MFC编程概述 第7章 MFC消息映射与消息传递机制 第8章 图形编程 第9章 位图编程 第10章 对话框 第11章 应用程序界面的定制 第12章 文件操作 第13章 文档、视图和框架...
第5章 对象-关系映射基础 5.1 持久化类的属性及访问方法 5.1.1 基本类型属性和包装类型属性 5.1.2 Hibernate访问持久化类属性的策略 5.1.3 在持久化类的访问方法中加入程序逻辑 5.1.4 设置派生属性 ...
第5章 对象-关系映射基础 5.1 持久化类的属性及访问方法 5.1.1 基本类型属性和包装类型属性 5.1.2 Hibernate访问持久化类属性的策略 5.1.3 在持久化类的访问方法中加入程序逻辑 5.1.4 设置派生属性 ...
第5章 对象-关系映射基础 5.1 持久化类的属性及访问方法 5.1.1 基本类型属性和包装类型属性 5.1.2 Hibernate访问持久化类属性的策略 5.1.3 在持久化类的访问方法中加入程序逻辑 5.1.4 设置派生属性 ...
第1章 关系型数据库 1.1 理解关系型数据库管理系统 1.1.1 关系模型 1.1.2 Codd法则 1.1.3 表、行、列和关键字 1.1.4 主键 1.1.5 外键 1.1.6 关系 1.1.7 视图 1.1.6 范式化 1.2 高级语言 1.2.1 结构化...
第二章 数据库相关基础知识回顾 空间数据库管理系统概论全文共3页,当前为第2页。 空间数据库管理系统概论全文共3页,当前为第2页。 1.数据模型:数据模型是对现实世界数据特征的抽象、对现实世界的模拟。 2.数据...
第二章 查询基础 50 §2.1 SELECT语句 50 §2.2 SQL中的单记录函数 50 §2.2.1 单记录字符函数 50 §2.2.2 单记录数字函数 56 §2.2.3 单记录日期函数 62 §2.2.4 单记录转换函数 65 §2.2.5 其它的单记录函数 68 §...
第1章 关系型数据库 1.1 理解关系型数据库管理系统 1.1.1 关系模型 1.1.2 Codd法则 1.1.3 表、行、列和关键字 1.1.4 主键 1.1.5 外键 1.1.6 关系 1.1.7 视图 1.1.6 范式化 1.2 高级语言 1.2.1 结构化...
第1章 关系型数据库 1.1 理解关系型数据库管理系统 1.1.1 关系模型 1.1.2 Codd法则 1.1.3 表、行、列和关键字 1.1.4 主键 1.1.5 外键 1.1.6 关系 1.1.7 视图 1.1.6 范式化 1.2 高级语言 1.2.1 结构化...
(1)分布式数据库系统 (2)面向对象数据库系统 (3)多媒体数据库系统 (4)数据仓库技术 1.3.1 数据库系统的组成 数据库系统是由计算机系统、数据库及其描述机构、数据 库管理系统和有关人员组成的具有高度组织性的整体...
第二部分 MFC库视图类 第3章 用AppWizard开始——“Hello,world!” 第4章 基本事件处理、映射模式和滚动视图 第5章 图形设备接口、颜色和字体 第6章 模态对话框和windows通用控件 第7章 非模态对话框和...