`

第二章 对象关系数据库映射基础

阅读更多
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);
}
}


分享到:
评论

相关推荐

    Java数据库技术详解 DOC简版

    第二篇 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开发知识总结整理 Python核心笔记 共51页.pdf

    第二章 快速入门 第三章 Python 基础 第四章 Python对象 第五章 数字 第六章 序列:字符串、列表和元组 第七章 映射和集合类型 第八章 条件和循环 第九章 文件和输入输出 第十章 错误和异常 第十一章 函数...

    精通Hibernate:对象持久化技术第二版part3

    第5章 对象-关系映射基础 101 本章主要介绍单个持久化类与单个数据库表之间进行映射的方法,尤其是当持久化类的属性不和数据库表的字段一一对应时的映射技巧。 5.1 持久化类的属性及访问方法 101 5.1.1 基本类型...

    精通hibernate:对象持久化技术孙卫琴第二版part2

    第5章 对象-关系映射基础 101 本章主要介绍单个持久化类与单个数据库表之间进行映射的方法,尤其是当持久化类的属性不和数据库表的字段一一对应时的映射技巧。 5.1 持久化类的属性及访问方法 101 5.1.1 基本类型...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part2

    第5章 对象-关系映射基础  5.1 持久化类的属性及访问方法  5.1.1 基本类型属性和包装类型属性  5.1.2 Hibernate访问持久化类属性的策略  5.1.3 在持久化类的访问方法中加入程序逻辑  5.1.4 设置派生属性  ...

    数据库系统概论习题集2007-6-10.doc

    14 第二部分 主观题 15 第1章 绪论 15 第2章 关系数据库 22 第3章 关系数据库标准语言SQL 26 第4章 关系系统及其查询优化 34 第5章 关系数据理论 36 第6章 数据库设计 42 第7章 数据库恢复技术 53 第8章 并发控制 60...

    visual C++从初学到精通源代码

    第二篇 Windows编程 第5章 Windows程序设计 第6章 MFC编程概述 第7章 MFC消息映射与消息传递机制 第8章 图形编程 第9章 位图编程 第10章 对话框 第11章 应用程序界面的定制 第12章 文件操作 第13章 文档、视图和框架...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part4

    第5章 对象-关系映射基础  5.1 持久化类的属性及访问方法  5.1.1 基本类型属性和包装类型属性  5.1.2 Hibernate访问持久化类属性的策略  5.1.3 在持久化类的访问方法中加入程序逻辑  5.1.4 设置派生属性  ...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part3

    第5章 对象-关系映射基础  5.1 持久化类的属性及访问方法  5.1.1 基本类型属性和包装类型属性  5.1.2 Hibernate访问持久化类属性的策略  5.1.3 在持久化类的访问方法中加入程序逻辑  5.1.4 设置派生属性  ...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part1.rar

    第5章 对象-关系映射基础  5.1 持久化类的属性及访问方法  5.1.1 基本类型属性和包装类型属性  5.1.2 Hibernate访问持久化类属性的策略  5.1.3 在持久化类的访问方法中加入程序逻辑  5.1.4 设置派生属性  ...

    Java数据库编程宝典3

    第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 结构化...

    空间数据库管理系统概论.docx

    第二章 数据库相关基础知识回顾 空间数据库管理系统概论全文共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 §...

    Java数据库编程宝典2

    第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 结构化...

    Java数据库编程宝典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 结构化...

    Access数据库技术概论.pdf

    (1)分布式数据库系统 (2)面向对象数据库系统 (3)多媒体数据库系统 (4)数据仓库技术 1.3.1 数据库系统的组成 数据库系统是由计算机系统、数据库及其描述机构、数据 库管理系统和有关人员组成的具有高度组织性的整体...

    visual c++6.0技术内幕 带有NLC的文件查看器

    第二部分 MFC库视图类  第3章 用AppWizard开始——“Hello,world!”  第4章 基本事件处理、映射模式和滚动视图  第5章 图形设备接口、颜色和字体  第6章 模态对话框和windows通用控件  第7章 非模态对话框和...

Global site tag (gtag.js) - Google Analytics