为什么需要Hibernate
Hibernate的价值在于对JDBC访问数据库的代码做了封装,大大简化了数据访问层繁琐的重复性代码。
Hibernate是什么
概括的说,Hibernate是一个优秀的持久化层解决方案,是当今主流的对象-关系映射工具。
综下所述:Hibernate是一个基于JDBC的主流持久化框架,是一个优秀的ORM实现。能很大程度上简化DAO编码工作。
持久化
持久化是将程序中数据在瞬时状态和持久状态间转换的机制。JDBC就是一种持久化机制。将程序数据直接保存成文本文件也是持久化机制的一种实现。但我们常用的是将程序中的数据保存到数据库中。
在三层结构中,DAO层(数据访问层)有时也称为持久化层,因为这一层的主要承担的就是将数据保存到数据库中或将数据从数据库中读取出来。
对象关系映射
我们在编码些程序的时候,应面向对象的方式处理数据;保存数据的时候却以关系型数据库的方式存储,所以客观上我们需要一种能在两者间转换的机制。这种机制成为对象-关系映射机制(Object Relational Mapping),这个机制保存对象和关系数据库表的映射信息,当数据在对象和关系数据库中转换的时候,协助正确完成转换。
在Hibernate中,使用xml格式的配置文件保存这些映射信息。
使用Hibernate的基本步骤(3个准备7个步骤)
准备工作
1. 需要的jar包.
hibernate3.jar是Hibernate的核心包;asm相关的包用来支持字节码的动态生成,是必须的;common-*的包是Apache Common项目提供的,包含集合工具类,日志接口等。
2. Hibernate配置文件
在配置文件中需要配置数据库连接信息和Hibernate参数.其中dialect参数是必须配置的,用户配置Hibernate使用的不同的数据库类型。Show_sql参数为true,则程序在运行时在控制台输出执行的sql语句。
数据库表和实体的映射信息在另外的文件中定义,但需要在配置文件中生明例如:
<mapping resource=”com/zbaccp/myhibernate/User.hbm.xml”/>
表示初始化环境时,将装载User.hbm.xml映射信息。
3. 实体类和映射文件
在映射文件中,每个<class>节点配置一个实体类的映射信息,<class>节点的name属性对应实体类的名字,table属性对应数据库表的名字。在class节点下有一个必须的<id>节点,用于定义实体的标识属性(对应数据库表的主键)。<id>节点的name属性对应实体类的属性,type为对应的java类型。的<id>节点下有两个字节点,<column>用于通过其name属性指定对应的数据库表的主键,<generator>节点用于指定主键的生成策略,常用的值有native和assigned,native表示由数据库生成主键的值,assigned表示在添加新记录到数据库前由程序设定主键的值。<class>节点下还包括<property>字节点。<property>节点不能包括<generator>节点。每个<progerty>节点指定一对属性和字段的对应关系。
Hibernate执行持久化操作的7个步骤
步骤 | 操作 | 代码 | 与JDBC类比 |
1 | 读取并解析配置文件 | Configuration conf=new Configuration().configure(); | 相当于使用DataSorce获取连接前读取DataSource的配置文件 |
2 | 读取并解析映射信息,创建SessionFactory | SessionFactory sf=conf.buildSessionFactory(); | 相当于创建DataSource对象 |
3 | 打开session | Session session=sf.openSession(); | 相当于JDBC获得连接 |
4 | 开始一个事物(增/删/该操作必须的,查询操作可选) | tx=session.beginTransaction(); | 开始事物 |
5 | 持久化操作 | session.save(user); | 持久化操作 |
6 | 提交事物 | tx.commit(); | 提交事物 |
7 | 关闭session | session.close(); | 关闭连接 |
使用Hibernate实现数据的删改
Sessionde的方法get,update,delete,需要注意的是增删改操作一定要在事物环境中完成。
修改和删除数据时需要先加载数据。
在使用Hberante编写持久化操作方法时,不需要再有数据库表/字段等概念,根据面向对象的语义,删除操作方法的参数应当是对象,而不是主键。以面向对象的思维编写代码是Hibernate持久化操作接口设计的一个理念。
实体关联关系有两种
Ø 关联关系:用户可以发布多条信息,这就表示用户和信息之间存在关联关联关系
Ø 泛化关系:即继承如老虎是动物,这就表示老虎和动物之间存在泛化关系
关联关系是通过一个对象持有另一个对象的实例来实现的,而泛化关系则是通过对象间的继承方法来实现的。
² 数据库关联是ORM的一个重要特征,但往往也是导致系统性能低下的原因。不良的关联设计会对系统的性能表现产生致命的影响,在实际开发中我们要特别注意这一点。
单向多对一关联
使用<many-to-one>元素来设定多对一映射关系
单向一对多关联
使用set元素和one-to-many元素配置一对多关联。
双向一对多关联
单向多对一盒单向一对多可以单独使用,如果同时配置了两者,就成了双向一对多关联。
在默认情况下(即没有设置cascade属性或cascade=none时,Hibernater不会自动持久化所关联的其他瞬时状态对象)
Cascade属性的常用属性值
序号 | 属性值 | 含义和作用 |
1 | All | 对所有操作进行级联操作 |
2 | Save-update | 执行保存和更新时进行级联操作 |
3 | Delete | 执行删除操作是进行级联操作 |
4 | None | 对所有操作不进行级联操作 |
Cascade属性的设置往往会带来性能上的变动,需谨慎设置。 |
术语inverse直译为“反转”.在Hibernate中inverse属性指定了关联关系的方向。关联关系中inverse=false的为主动方,由主动方负责维护关联关系。
在一对多关联中,将one方的inverse设为true这将有助性能的改善,即让所有来报道的新生主动寻找班级报道。
还在学习中。。。。。。