发表于: 2017-04-19 22:43:49
5 1496
今天完成的事情:
1.老师要求我们做一个 基于Swing 的用户界面,所以顺便学习 Swing
2.因为要演示我打算用 xml 模拟数据库来作为测试数据,所以顺便学习如何解析 XML 文件
3.学习对象持久化以及 Hibernate 的基本用法
明天计划的事情:
1.继续学习 Hibernate
2.学习 Spring 事务
遇到的问题:
1.在学习将对象序列化有一个操作是 session.save(person); 从而将对象保存到数据库,我能理解大概的意思。
但是假设 Boss boss = new Boss(new Car()) 然后 session.save(boss) 将如何持久化 boss 的 car 呢?如果一个对象是有很多个对象组装而成,反反复复,那么持久化的对象更多了,该怎么办呢?
收获:
1.明白数据持久化到底怎么回事
什么是对象持久化
所谓持久化(Persistence)即把数据(如内存中的对象)保存到持久化的设备,即可永远保存到存储设备(如硬盘)
持久化的主要应用是将内存中的数据存储到关系型的数据库中,当然也可以存储在硬盘文件中、XML 数据文件中 。
为什么要持久化
- 内存不能持久
- 内存容量有限(内存适用于存放计算数据的)
- 业务数据共享的需要(需要公共的持久设备)
- 为了使用大规模的检索(所以要将数据改为社和大规模检索的格式)
- 数据管理的需要(安全、备份)
怎样是向持久化
对象序列化
即实现了 Serializable 接口的类,适合于少量的对象进行暂时的持久化,适合在网络上传输对象。但不符合企业级应用的需要,因为企业应用中对数据的要求是大量的,长时间保存的、需要大规模查询。
JDBC
优点:功能完备,从理论上可以说是效率最高的;可以存储海量的数据并且适合进行大规模的检索。
缺点:开发效率和维护效率低;开发难度大,代码量大,站到总代吗量的 1/3 或 1/2.
ORM
ORM,即 Object-Relaational Mapping,对象关系映射,他是一种解决问题的思路,是一种思想。他的实质就是将关系数据用对象形式表示出来,并通过面向对象的方式将这些对象组织起来,以实现系统业务逻辑。或是说 ORM 就是内存中的对象与数据库中的数据间的映射关系。
ORM 的特点:开源的,实现 JDBC 的封装,实现了简单的 API,轻量级解决方案,持久化对象是一个 POJO 类。最有名的是 ORM 框架就是 Hibernate。
JPA 框架
JPA(Java Persisternce API) 是 Java EE5 的标准 ORM 接口,他是一种规范,一套接口,但不是实现。用于实现这一规范的 ORM 很多,其中 Hibernate 就是其中之一。
JPA、ORM、Hibernate 间的关系
JPA , ORM 与 Hibernate 的关系。ORM 是一种思想,JPA 是这种思想的具体表现形式,是以 Java 语言为规范表现出来的一种形式,是一套标准的接口, Hibernate 则是这套接口的具体实现。
2.学习 Hibernate 的简单 API 操作
Hibernate 主要 API
Configuration 接口
该接口的作用是加载配置文件及映射文件,以实现对 Hibernate 的启动,Configuration 实例调用 Configuration 实例调用 buildSessionFactory 方法便可创建一个 Session 工厂 SessionFactory 对象
Configuration cfg = new Configuration().configure();
new Configuration() 会加载一个属性文件 hibernate.properties。该属性文件中存放数据连接配置、Hibernate 配置等配置信息。一般情况下不用设置该属性文件,其设置已经放到了主配置文件中。若要设置,应将其放于 src 目录下。赶文件的模板存放于 Hibernate 框架解压目录下的 project/etc 下。
configure() 方法,用于加载和解析 hibernate.cfg.xml 配置文件及映射的 Configuration 对象。
SessionFactory 接口
SessionFactory 接口对象是有 Conffiguration 对象通过 buildSessionFactory() 方法创建。创建对象的目的是,用于开启 Session 对象。
SessionFactory factory = cfg.buildSessionFactory();
SessionFactory 对象特点
重量级对象(系统开销大)、单例的、线程安全的。
SessionFactory 对象的使用原则
基于其是线程安全的重量级对象,其创建销毁是系统开销大,又是单例的特点,SessionFactory 对象一般不手动关闭,而是在应用解说时自动将其销毁。因此,SessionFactory 不用进行 close() 关闭。
Session 接口
Session 接口是应用程序与 HIbernate 连接的核心 API, 是 Hibernate 向应用程序提供的操作 DB 的主要接口。它提供了基本的保存、更新、删除与查询方法。由 SessionFactory 对象创建。
Session session = factory.openSession();
Session 对象的特点
一个轻量级对象、线程不安全、多例的。
在 Web 应用程序中,多个用户对统一应用访问, Hibernate 会为了每个用户创建一个 Session 对象。所以是多例的。Session 中包含大量非 final 成员变量,对于同一个用户的操作,可能会产生多个事务,这多个事务若同时对一个 Sesssion 的统一成员变量进行访问,就会引起并发问题。所以 Session 是线程不安全的。
Session 对象的使用原则
基于 Session 的以上特点,Session 在使用时做到一个线程一个 Session,即一个事务一个 Session。使用完毕,立即关闭。Session 不要作为某个类的成员变量出现,因为这样会出现多个实例对象对同一个 Session 的共享,使其更不安全。
Session 对象的获取
为了保证一个线程一个 Session,即一个线程中使用的 Session 是同一个对象,一般在获取 SessIon 对象,需要在主配置文件中对 Session 所处的上下文环境,即事务环境进行注册。
其取值方式有三种
取值 | 意义 |
---|---|
thread | 表示当前 Session 所处的环境为本地事务环境,Session 会与当前线程绑定 |
jta | 表示当前 Session 所处的环境为分布式事务环境 |
SpringSessionContext类 | SSH 集合时使用 |
使用 getCurrentSession()方法获取的 Session,在进行事务提交或回滚后,会自动关闭, 无需再手工进行 close()。
两种获取 Session对象方式的区别
获取 Session 对象,可以使用 openSession()方式,也可以使用 getCurrentSession()方式。 这两种方式在本质上有着很大的区别。
getCurrentSession()方式 | openSession()方式 | |
---|---|---|
获取的对象 | 无论执行多少次该方法,只要是 在同一线程中,获取的都是同一 个 Session对象 | 每执行一次该方法,获取到的 都是一个新的 Session 对象 |
对象的关闭 | 自动关闭 Session,无需手工关闭 | 必须手工关闭 Session 对象 |
环境的注册 | 需要注册 Session 的运行环境 | 无需注册 |
查询对事务 的支持 | 查询必须在事务内执行 | 查询可以不在事务内执行 |
Session 的常用方法
方法 | 备注 |
---|---|
save() | 添加对象,Hibernate 的 API |
persist() | 添加对象,属于 JPA 的 API ,而 Hibernate 属于 JPA 的实现 |
delete() | 删除对象 |
update() | 修改对象 |
saveOrUpdate() | 根据主键来判断是否存在对象,有则更新,没有则创建 |
get() | 若获取对象为 null 没有异常 |
load() | 若获取对象为 null 则抛出异常 |
Transaction 接口
通过该接口,可以将事务从持久层,提升到业务层。由 Session 对象创建。 session.getTransaction(); 事务的开启:session.beginTransaction(); 或 session.getTransaction().begin(); 事务的提交:session.getTransaction().commit(); 事务的回滚:session.getTransaction().rollback();
评论