hibernate基础知识二

北京市昌平区建材城西路金燕龙办公楼一层 电话:400-618-9090
1 Hibernate_day02
今日任务
案例一:使用 Hibernate 完成 CRM 客户管理中查询所有客户的操作
教学导航
教学目标
教学方法 案例驱动法
案例一: 使用 Hibernate 完成 CRM 客户管理中
查询所有客户的操作
1.1案例需求:
1.1.1 需求描述
CRM 系统中客户信息管理模块功能包括:
新增客户信息
客户信息查询
修改客户信息
删除客户信息
1.2相关知识点:
1.2.1 Hibernate 持久化类的编写规则
1.2.1.1 什么是持久化类:
Hibernate 是持久层的 ORM 映射框架, 专注于数据的持久化工作。 所谓的持久化, 就是将内存
北京市昌平区建材城西路金燕龙办公楼一层 电话:400-618-9090
中的数据永久存储到关系型数据库中。 那么知道了什么是持久化, 什么又是持久化类呢? 其实所谓
的持久化类指的是一个 Java 类与数据库表建立了映射关系, 那么这个类称为是持久化类。 其实你可
以简单的理解为持久化类就是一个 Java 类有了一个映射文件与数据库的表建立了关系。 那么我们在
编写持久化类的时候有哪些要求呢? 接下来我们来看一下:
1.2.1.2 持久化类的编写规则:
我们在编写持久化类的时候需要有以下几点需要注意:
持久化类需要提供无参数的构造方法。 因为在 Hibernate 的底层需要使用反射生成类的实
例。
持久化类的属性需要私有, 对私有的属性提供公有的 get set 方法。 因为在 Hibernate
层会将查询到的数据进行封装。
持久化类的属性要尽量使用包装类的类型。 因为包装类和基本数据类型的默认值不同, 包
装类的类型语义描述更清晰而基本数据类型不容易描述。 举个例子:
假设表中有一列员工工资, 如果使用 double 类型, 如果这个员工工资忘记录入到系统中, 系统会将默认值0
存入到数据库, 如果这个员工工资被扣完了, 也会向系统中存入 0.那么这个 0 就有了多重含义, 而如果使用包装类
类型就会避免以上情况, 如果使用 Double 类型, 忘记录入工资就会存入 null, 而这个员工工资被扣完了, 就会存
0, 不会产生歧义。
持久化类要有一个唯一标识 OID 与表的主键对应。 因为 Hibernate 中需要通过这个唯一标
OID区分在内存中是否是同一个持久化类。在Java中通过地址区分是否是同一个对象的,
在关系型数据库的表中是通过主键区分是否同一条记录。 那么 Hibernate 就是通过这个 OID
来进行区分的。 Hibernate 是不允许在内存中出现两个 OID 相同的持久化对象的。
持久化类尽量不要使用 final 进行修饰。 因为 Hibernate 中有延迟加载的机制, 这个机制中
会产生代理对象, Hibernate 产生代理对象使用的是字节码的增强技术完成的, 其实就是产
生了当前类的一个子类对象实现的。 如果使用了 final 修饰持久化类。 那么就不能产生子类,
从而就不会产生代理对象, 那么 Hibernate 的延迟加载策略( 是一种优化手段) 就会失效。.
持久化类我们已经可以正常编写了, 但是在持久化类中需要有一个唯一标识OID 与表的主键去
建立映射关系。 而且主键一般我们是不会让客户手动录入的, 一般我们是由程序生成主键。 那么
Hibernate 中也提供了相应的主键生成的方式, 那么我们来看下 Hibernate 的主键生成策略。
1.2.2 Hibernate 主键生成策略
1.2.2.1 主键的类型:
在讲解 Hibernate 的主键生成策略之前, 先来了解两个概念, 即自然主键和代理主键, 具体如下:
自然主键: 把具有业务含义的字段作为主键, 称之为自然主键。 例如在customer 表中, 如
果把 name 字段作为主键, 其前提条件必须是: 每一个客户的姓名不允许为null, 不允许客
户重名, 并且不允许修改客户姓名。 尽管这也是可行的, 但是不能满足不断变化的业务需
求, 一旦出现了允许客户重名的业务需求, 就必须修改数据模型, 重新定义表的主键, 这
给数据库的维护增加了难度。
北京市昌平区建材城西路金燕龙办公楼一层 电话:400-618-9090
代理主键: 把不具备业务含义的字段作为主键, 称之为代理主键。 该字段一般取名为“ID”,
通常为整数类型, 因为整数类型比字符串类型要节省更多的数据库空间。 在上面例子中,
显然更合理的方式是使用代理主键。
1.2.2.2 Hibernate的主键生成策略:
Hibernate 中, 提供了几个内置的主键生成策略, 其常用主键生成策略的名称和描述如下
主键生成策略
名称 描述
increment 用于 longshort、 或int 类型, 由 Hibernate 自动以递增的方式生
成唯一标识符, 每次增量为 1。 只有当没有其它进程向同一张表中插入
数据时才可以使用, 不能在集群环境下使用。 适用于代理主键。
identity 采用底层数据库本身提供的主键生成标识符, 条件是数据库支持
自动增长数据类型。 在 DB2 MySQL MS SQL Server Sybase
HypersonicSQL 数据库中可以使用该生成器, 该生成器要求在数据库中
把主键定义成为自增长类型。 适用于代理主键。
sequence Hibernate 根据底层数据库序列生成标识符。 条件是数据库支持序
列。 适用于代理主键。
native 根据底层数据库对自动生成表示符的能力来选择 identity
sequencehilo 三种生成器中的一种, 适合跨数据库平台开发。 适用于
代理主键。
uuid Hibernate 采用 128 位的 UUID 算法来生成标识符。 该算法能够在
网络环境中生成唯一的字符串标识符, 其 UUID 被编码为一个长度为
32 位的十六进制字符串。 这种策略并不流行, 因为字符串类型的主键
比整数类型的主键占用更多的数据库空间。 适用于代理主键。
assigned java 程序负责生成标识符,如果不指定 id 元素的 generator 属性,
则默认使用该主键生成策略。 适用于自然主键。
1.2.3 Hibernate 的持久化对象的三种状态
1.2.3.1 持久化对象三种状态的概述
了解了主键的生成策略之后, 我们可以进一步来了解持久化类了。 Hibernate 为了更好的来管理
持久化类, 特将持久化类分成了三种状态。 在 Hibernate 中持久化的对象可以划分为三种状态, 分别
是瞬时态、 持久态和脱管态, 一个持久化类的实例可能处于三种不同状态中的某一种, 三种状态的
详细介绍如下。
1、 瞬时态(transient
北京市昌平区建材城西路金燕龙办公楼一层 电话:400-618-9090
瞬时态也称为临时态或者自由态, 瞬时态的实例是由 new
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值