第9章 Hibernate
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
内容
ORM简介 Hibernate入门 集合映射
内容
ORM简介 Hibernate入门 集合映射
内容
ORM简介 Hibernate入门 集合映射 关联关系映射
单向N-1(无连接表)
单向无链接表N-1ቤተ መጻሕፍቲ ባይዱ使用many-to-one元素
<class name="Person" table="person"> <id name="personid"> <generator class="identity"/> </id> <property name="name"/> <property name="age"/> <many-to-one name="address" column="addressid"></many-to-one> </class> <class name="Address" table="address"> <id name="addressid"> <generator class="identity"></generator> </id> <property name="addressdetail"></property> </class>
Transaction tx = session.beginTransaction();
注:使用Hibernate进行操作时(增、删、改)必须 显示的调用Transaction(默认: autoCommit=false)。
持久化对象的状态
瞬态 由new操作符创建,且未与Hibernate Session 关联的对象的状态。 瞬态对象不会被持久化到数据库中,也不会被赋予持久化标识。一旦 失去对象引用对象将被垃圾回收机制回收。 持久化 持久化,持久化实例在数据库中有对应的记录,并拥有一个持久化 标识(identifier)。持久化的实例可以是刚刚保存的,也可以是刚被加载 的。无论哪一种,持久化对象都必须与指定的Hibernate Session关联。 Hibernate会检测到处于持久化状态对象的改动,在当前操作执行完成 时将对象数据写回数据库。 脱管,某个实例曾经处于持久化状态,但随着与之关联的session被关 闭,该对象就变成脱管状态。脱管对象的引用依然有效,对象可继续 被修改。如果重新让脱管对象与某个session关联,这个脱管对象会重 新转换为持久化状态,而脱管期间的改动也不会丢失,也可被写入数 据库。正是因为这个功能,逻辑上的长事务成为可能,这称为应用程 序事务。即事务可以跨越用户的思考,因为当对象处于脱管状态时, 对该对象的操作无须锁定数据库,不会造成性能的下降。
对象
关系数据库
表的列 类的属性 (基本类型) 类 1:n/n:1 n:m 继承 表 外键 关联表 单表继承、具体 表继承、类表继 承
内容
ORM简介 Hibernate入门
Hibernate概述
Hibernate是非常优秀、成熟的O/R Mapping 框架。它提供了强大的对象和关系数据库 映射以及查询功能。 Hibernate优势 优势
映射文件说明
每个class元素对应一个持久化类。必须采用name元素来指定该类的全 限定的类名或在hibernate mapping元素里指定package元素指定类所在 的包名。 如果需要采用继承映射。每个class元素下还会增加subclass元素、 joined-subclass或union-subclass元素,这些元素分别用于定义子类。 持久化类都需要有一个标识属性,该标识属性用来标识该持久化类的 实例,因此标识属性通常被映射成数据表主键。标识属性通过id元素 来指定。id元素的name属性的值就是持久化类标识属性名。 标识属性通常应该指定主键生成策略,Hibernate推荐数据表采用逻辑 主键,而不要采用有物理含义的实体主键。逻辑主键没有实际意义, 仅仅用来标识一行记录,通常由hibernate负责生成。负责生成主键的 工具称为主键生成器。 尽量为每个持久化类都设置主键生成器。
Map集合
Map集合属性不仅需要映射属性value,还需要映 射属性key。映射Map集合属性时,同样需要指定 外键列,同时还必须指定Map的key列。显然,系 统将以外键列和key类作为联合主键。 <map name="schools" table="school"> <key column="personid" not-null="true"></key> <map-key type="int" column="schoolid"></mapkey> <element type="string" column="school_name"></element> </map>
SessionFactory
应用程序从SessionFactory(会话工厂)里获得Session(会 话)实例。它在多个应用线程间进行共享。通常情况下, 整个应用只有唯一的一个会话工厂——例如在应用初始化 时被创建。然而,如果你使用Hibernate访问多个数据库, 你需要对每一个数据库使用一个会话工厂。 会话工厂缓存了生成的SQL语句和Hibernate在运行时使用 的映射元数据。 调用代码: 调用代码: SessionFactory sessionFactory = cfg.buildSessionFactory();
第9章 Hibernate
内容
ORM简介 Hibernate入门 集合映射
内容
ORM简介 Hibernate入门 集合映射
O/R Mapping
对象-关系映射是一门非常实用的工程技术, 它实现了Java应用中的对象到关系数据库中 的表的自动的(和透明的)持久化,使用 元数据描述对象与数据库间的映射。
开源(LGPL) 成熟 流行 自定义API JBoss 将用Hibernate3实现Entity Beans
Hibernate应用开发步骤
建数据库,创建表格 创建类(POJO) 编写映射文件 编写配置文件 获取Configuration 获取SessionFactory 获取Session,打开事务 用面向对象的方式操作数据库 关闭事务,关闭Session Hibernate实例-用户信息注册
主键生成器
主键生成器负责生成数据表记录的主键。 常见的主键生成器: increment,对long、short或int的数据列生成自增长主键。 indentity,对如SQL server、MySQL等支持自动增长列的 数据库,如果数据列类型是long、short或int,可使用该主 键生成器生成自动增长主键。 sequence, 对Oracle,DB2等支持Sequence的数据库,如果 数据列的类型是long,short或int,可使用该主键生成器生 成自动增长主键。 uuid,对字符串列的数据采用128位UUID算法生成唯一的 字符串主键。
Transaction(事务 事务) 事务
一次原子事务。它将应用代码从底层的事务实现中 抽象出来——这可能是一个JDBC事务,一个JTA 用户事务或者甚至是一个公共对象请求代理结构 (CORBA)——允许应用通过一组一致的API控 制事务边界。这有助于保持Hibernate应用在不同 类型的执行环境或容器中的可移植性。 调用代码:
Configuration类 类
Configuration 类负责管理Hibernate 的配置信息。 它包括如下内容: Hibernate运行的底层信息:数据库的URL、用户名、密码、 JDBC驱动类,数据库Dialect,数据库连接池等。 Hibernate映射文件(*.hbm.xml)。
Hibernate配置的两种方法: 配置的两种方法: 配置的两种方法
O/R Mapping的优点 的优点
提高生产率(Productivity) 可维护性(Maintainability) 更好性能(Performance) 厂商独立性(Vendor independence)
流行ORM框架
优点
Apache OJB 性能、稳定性,属于Apache 基金组织
缺点
文档资源太少,支持标 准太多,不流行。
状态关系转化图
Hibernate架构
Hibernate的ORM
内容
ORM简介 Hibernate入门 集合映射
常用集合
List Set Map Bag等等
List集合
List是有序的集合,因此需增加一列list-index来表 示次序列。集合属性的值不可能与持久化类存储 在同一个表内,集合属性会存放在另外的表中, 因此必须以外键关联。以key元素来映射该外键列。 <list name="schools" table="school"> <key column="personid" not-null="true"></key> <list-index column="list_order"></list-index> <element type="string" column="school_name"></element> </list>
组件映射
集合属性的元素组件类型(即集合元素是自定义类型)。Compositeelement元素映射一个组件类型,因此需要增加class元素确定集合元素 的类型,该元素还支持property的子元素来定义组件类型的子属性。 <list name="schools" table="school"> <!-- 集合属性和持久化类的关联外键 --> <key column="personid" not-null="true"/> <!-- 集合属性的次序列 --> <list-index column="list_order"/> <!-- 映射集合的元素,class属性确集合元素的类型 --> <composite-element class="School"> <!-- 集合元素的基本属性 -<property name="name"/> <property name="address"/> </composite-element> </list>
属性文件(hibernate.properties) 调用代码:Configuration cfg = new Configuration(); Xml文件(hibernate.cfg.xml) 调用代码:Configuration cfg = new Configuration().configure();
iBATIS
可以控制更多的数据库操作细 持久层封装不够彻底, 节。实用于遗留系统的改造和 不支持纯粹面向对象编 对既有数据库的复用。 程。 成熟、流行、功能强大。并逐 渐发展成Java 持久层事实上的 标准。
Hibernate
如何进行ORM的匹配? 的匹配? 如何进行 的匹配
public class User { private String name; private String password; private List address; ……… } create table User ( name varchar(255) not null , password varchar(255), ………. primary key (name) )
Session(会话 会话) 会话
Session不是线程安全的,它代表与数据库之间的 一次操作,它的概念介于Connection和Transaction 之间。 Session也称为持久化管理器,因为它是与持久化 有关的操作接口。 Session通过SessionFactory打开,在所有的工作完 成后,需要关闭。 它与Web层的HttpSession没有任何关系。 调用方法: Session session = sessionFactory.openSession();
Set集合
Set是无序的集合。集合属性的值不可能与持久化 类存储在同一个表内,集合属性会存放在另外的 表中,因此必须以外键关联。以key元素来映射该 外键列。 <set name="schools" table="school"> <key column="personid" not-null="true"></key> <element type="string" column="school_name" not-null="true"></element> </set>