Hibernate 5.2 学习笔记

目录

对象的持久化

狭义的理解: “持久化” 仅仅指把对象永久保存到数据库中
广义的理解: “持久化” 包括和数据库相关的各种操作:

保存: 把对象永久保存到数据库中
更新: 更新数据库中对象的状态
删除: 从数据库中删除一个对象
查询: 根据特定的查询条件,把符合查询条件的一个或多个对象从数据库加载到内存中

加载: 根据特定OID 把一个对象从数据库加载到内存中

为了在系统中能够找到所需对象,需要为每一个对象分配一个唯一的标识号
在关系数据库中称之为主键,而在对象术语中,则叫做对象标识
(Object identifier-OID)

ORM :(Object/Relation Mapping): 对象/关系映射
orm 主要解决对象 -关系的映射

ORM 的思想 : 将关系数据库中表中的记录映射成为对象,以对象的形式展现

程序员可以把对数据库的操作转化为对对象的操作.

ORM 采用元数据来描述对象-关系映射细节,元数据通常采用XML 格式,并且存放在专门的对象-关系映射文件中.

ORM

流行的ORM 框架

Hibernate 框架

非常优秀 .成熟的ORM 框架
完成对象的持久化操作
Hibernate 允许开发者采用面向对象的方式来操作关系数据库
消除那些针对特定数据库厂商的SQL 代码

MyBatis 框架
相比Hibernate 灵活搞,运行速度快.开发速度慢不支持纯粹的面向对象操作,需熟悉sql 语句.并且熟练使用sql 语句优化功能

其他框架
TopLink
OJB

这里还需要提到一个commons 组件 dbutils .在我其他文章有专门的介绍commons 组件的.

Hibernate 与Jdbc 代码的对比

Hibernate 与JDBC代码比较

可以看得出来 hibernate 简化了jdbc操作数据库的代码.

Eclipse 安装hibernate 插件

hibernate插件

工具分为2种,一种是完整版本的Eclipse 插件 一种是只支持Jboss社区版的.

可以直接下载安装,也可以在eclipse myeclipse 开发工具中添加地址

点击—> Install New Software —>add—>
name 中输入Jboss Tools
Location 中输入http://download.jboss.org/jbosstools/neon/stable/updates/

后面的步骤这里不再演示

hibernate 进行数据持久化操作的步骤

  1. 编写持久化类: POJO + 映射文件
  2. 获取 Configuration 对象
  3. 获取SessionFactory 对象
  4. 获取Session ,打开事务
  5. 用面向对象的方式操作数据库
  6. 关闭事务,关闭Session
Configuration 类
  1. Configuration 类负责管理Hibernate 的配置信息,包括如下内容:

hibernate 运行底层信息: 数据库的URL 用户名 密码 JDBC 驱动类 ,数据库Dialect(方言), 数据库连接池等(对应hibernate.cfg.xml文件).

持久化类与数据表的映射关系(*.hbm.xml 文件)

  1. 创建Configuration 的两种方式

属性文件 (hibernate.properties):

     Configuration cfg=new Configuration();

XML 文件(hibernate.cfg.xml)

  configuration cfg=new Configuration().configure();

Configuration 的configure 方法还支持带参数的访问:

File file=new File("simpleit.xml");
configuration cfg=new Configuration().configure(file);
SessionFactory 接口
  1. 针对单个数据库映射关系经过编译后的内存镜像,是线程安全的.
  2. SessionFactory 对象 一旦构造完毕,即被赋予特定的配置信息
  3. SessionFactory 是生成Session 的工厂
  4. 构造SessionFactory 很消耗资源,一般情况下一个应用中只初始化一个SessionFactory 对象 .
  5. Hibernate5 使用StandardServiceRegistry 来获取SessionFactory
  6. Hibernate 5 中创建SessionFactory的步骤
import org.hibernate.SessionFactory;
import org.hibernate.boot.Metadata;
import org.hibernate.boot.MetadataSources;
import org.hibernate.boot.SessionFactoryBuilder;
import org.hibernate.boot.registry.StandardServiceRegistry;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;

public class HibernateUtils {
    // 創建一個SessionFactory對象
    StandardServiceRegistry standardRegistry = new StandardServiceRegistryBuilder().configure("hibernate.cfg.xml")
            .build();
    Metadata metadata = new MetadataSources(standardRegistry).getMetadataBuilder().build();
    SessionFactoryBuilder sessionFactoryBuilder = metadata.getSessionFactoryBuilder();
    SessionFactory sessionFactory = sessionFactoryBuilder.build();

}
Session 接口

Session 是应用程序域数据库之间交互操作的一个单线程对象,是Hibernate 运作的中心,所有持久化对象必须在session的管理下才可以镜像持久化操作,此对象的生命周期很短,Session对象有一个一级缓存,显式执行flush之前,所有的持久层操作的数据库都缓存在session对象处,相当于JDBC中的Connection ..

Hibernate 和JDBC

持久化类与Session 关联起来后就具有了持久化的能力

Session类的方法

取得持久化对象的方法: get() load()

持久化对象都是保存,更新和删除:
save(), update(), saveOrUpdate(), delete()

开启事务: beginTransaction();

管理Session的方法: isOpen(); flush(); clear(), evict(), close() 等.

Transaction (事务)

代表一次原子操作,它具有数据库事务的概念,所有持久层都应该在事务管理下进行,即使是只读操作.

    Transaction tx=session.beginTransaction();

常用方法:

commit(): 提交相关联的session
rollback() :撤销事务操作
wasCommitted():检查事务是否提交

hibernate 配置文件的两个配置项

hbm2ddl.auto : 该属性可帮助程序员实现正向工程,即由java代码生成数据库脚本,进而生成具体的表结构. 取值 create | update | create -drop | validate

crate : 会根据 .hbm.xml 文件来生成数据表,但是每次运行都会删除上一次的表,重新生成表,哪怕二次没有任何改变

create -drop :会更加.hbm.xml 文件生成表,但是SessionFactory 一关闭,表就自动删除
update : 最常用的属性值. 也会更加.hbm.xml 文件生成表,但若 .hbm.xml 文件和数据库中对应的数据表的表结构不同,hibernate 将更新数据表结构,但不会删除已有的行和列

validate : 会和数据库中的表进行比较,若 .hbm.xml 文件中的列在数据表中不存在,则抛出异常
format_sql : 是否将sql 转化为格式良好的SQL .取值 true | false

session 概述

Session 接口是hibernate 向应用程序提供的操作数据库的最主要接口,它提供了基本的保存,更新,删除和加载java 对象的方法.

Session 具有一个缓存 , 位于换缓存中的对象称为持久化对象,它和数据库中的相关记录对应,Session 能够在某些时间点,按照缓存中对象的变化来执行相关的SQL 语句.
来同步更新数据库,这一过程被称为刷新缓存(flush)

站在持久化的角度,hibernate 把对象分为4种状态: 持久化状态 ,临时状态, 游离状态, 删除状态, Session 的特定方法能使对象从一个状态转换到另一个状态..

Session 缓存

在Session 接口的实现中包含一系列的java 集合,这些java 集合构成了Session 缓存 ,只要Session 实例 没有结束生命周期,且没有清理缓存,则存放在它换存中的对象也不会结束数据库的频率

News news =(News) session.get(News.class, 1)
   System.out.println(news);

  News news2=(News) session.get(News.class,1);
  System.out.println(news2);

 System.out.println(news == news2);

####flush 缓存
flush : Session 按照缓存中对象的属性编号来同步更新数据库 默认情况下Session 在以下时间点刷新缓存:

显式调用Session 的flush() 方法

当应用程序调用Transaction 的commit() 方法时,该方法先flush, 然后在向数据库提交事务
当应用程序执行一些查询 (HQL ,Criteria) 操作时,如果缓存中持久化对象的属性以及发生变化, 会先flush 缓存 ,以保证查询结果能够反映持久化对象的最新状态

flush 缓存的列外情况: 如果对象使用native 生成器OID 那么当调用Session 的save() 方法保存对象时,会立即执行向数据库插入该实体的insert 语句.

commit() 和flush () 方法的区别: flush 执行一系列sql 语句, 但不提交事务; commit 方法先调用flush() 方法,然后提交事务 意味着提交事务意味着对数据库操作永久保存下来..

hibernate 主键生成策咯
标识符生成器描述
increment适用于代理主键,由hibernate 自动以递增方式生成
identity适用于代理主键,由底层数据库生成标识符
sequence适用于代理主键,hibernate 根据底层数据库的序列生成标识符,这要求底层数据库支持序列
hilo适用于代理主键,hibernate 分局high/low 算法生成标识符
seqhilo使用于代理主键,使用一个高低位算法来高效生产long,short 或者int 类型的标识符
native适用于代理主键,根据底层数据库对自动生成标识符的方式,自动选择identity,sequence或hilo .
uuid.hex适用于代理主键,hibernate 采用128 位的UUID 算法生成标识符
uuid.string适用于代理主键,由java 应用程序负责生成标识符
assigned适用于自然主键,由java 应用程序负责生成标识符
foreign适用于代理主键,使用另外一个相关联的对象的标识符.
设定刷新缓存的时间点

若希望改变flush 的默认时间点,可以通过Session 的setFlushMode() 方法显式设定flush的时间点

setFlushMode方法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值