Hibernate使用详解

8 篇文章 0 订阅
7 篇文章 0 订阅

ORM(Object Relationship Mapping 对象关系映射)

写SQL的不便之处:

1.不同的数据库使用的SQL语句不同,如PL/SQL和T/SQL

2.同样的功能在不同的数据库中有不同的实现方式,如分页。

3.程序过分依赖SQL将对程序的移植、拓展和维护带来极大的不便

Hibernate对JDBC进行了非常轻量化的封装

在Eclipse上安装Hibernate Tools插件

使用Hibernate步骤

1.创建Hibernate配置文档(Hibernate.cfg.xml

2.创建持久化类

3.创建对象-关系映射文件

4.通过Hibernate API编写访问数据库代码

(准备工作导入Hibernate相关jar包和mysql的jdbc相关jar包)

Hibernate.cfg.xml常用配置

1.hibernate.show_sql是否把Hibernate运行时的sql语句输出到控制台

2.hibernate.format_sql输出到控制台的sql是否排版,建议设为true

3.hbm2ddl.auto可以帮助由java代码生成数据库脚本,进而生成具体的表结构。create | update | create-drop | validate

//谨慎使用create,因为会删除原有表

4.hibernate.default_scheme默认的数据库

5.hibernate.dialect方言

Session简介

因为Hibernate不建议直接使用jdbc的connection操作数据库,而是通过使用session来操作数据库

session可以理解为操作数据库的对象

session与connection是多对一的关系,每个session都有一个与之对应的connection对象,一个connection不同时刻可以供多个session使用

操作数据库就需要调用session的各种方法,如save() update() delete() createQuery()等

Transaction(事务)简介

hibernate对数据库的操作都是封装在事务当中的,并且是默认是非自动提交的方式。所以用Session保存对象时,如果不开启事务,数据是不会写到数据库中的

,所以要执行transaction.commit();

Session详解

如何获得Session对象?

1.openSession();

2.getCurrentSession();

如果使用的是getCurrentSession需要在hibernate.cfg.xml文件中进行配置:

如果是本地事务(jdbc事务)

<property name = "hibernate.current_session_context_class">thread</property>

如果是全局事务(jta事务)

<property name = "hibernate.current_session_context_class">jta</property>

openSession()与getCurrentSession()的区别:

1.getCurrentSession()在事务提交或回滚之后会自动关闭,openSession()需要手工关闭,如果不关闭,多次连接之后会导致连接池溢出

2.getCurrentSession()使用现有的session对象(单例模式),而openSession()每次创建新的session

hbm配置文件常用设置

单一主键

1.assigned 由java应用程序负责生成,即手工赋值

2.native由底层数据库自动生成标识符,如果是Mysql就是increment,如果是oracle就是sequence,等等

基本类型

对象类型


组件属性


单表操作:save delete update get/load

get/load 的区别:

1.在不考虑缓存的情况下,get方法是立即发送sql语句,返回持久化对象;load方法返回的是代理对象,该代理对象只保存了实体对象的id

在使用对象的非主键属性时才会发sql语句

2.get方法在查询到数据库不存在的对象时,返回的是null;而load返回的是orh.hibernate.ObjectNotFoundException


单向一对多映射:

1.在一方定义一个多方的集合;

2.创建了相应的类之后,还要创建相应的关系映射文件:XXX.hbm.xml

3.在映射文件中配置各个属性,以及配置一对多关联关系。例如一个班级对多个学生:

<set name="students" table="student">

<!--指定关联的外键列-->

<key column="gid"></key>

<one-to-many class="XXX.XXX.XXX.Student"></one-to-many>

</set>

4.在hibernate核心配置文件Hibernate.cfg.xml当中指定映射文件的路径

<mapping resourse="XXX.XXX.XXX.Grade.hbm.xml">

<mapping resourse="XXX.XXX.XXX.Student.hbm.xml">

5.进行一对多操作时,就相当于对集合操作


单向多对一映射

1.在多方定义一个一方引用;

2.在映射文件中配置多对一关联关系,如多个学生对一个班级:

<many-to-one name="grade" class="XXX.XXX.XXX.Grade" column="gid"></many-to-one>

3.使用时就在多方中使用一方的引用


双向多对一映射

1.在一方映射文件中配置一对多关联关系:

<set name="students" table="student">

<!--指定关联的外键列-->

<key column="gid"></key>

<one-to-many class="XXX.XXX.XXX.Student"></one-to-many>

</set>

与此同时在多方映射文件中配置多对一关联关系:

<many-to-one name="grade" class="XXX.XXX.XXX.Grade" column="gid"></many-to-one>

2.在代码中操作时,也要同时一方通过集合设置多方,多方通过引用设置一方

3.为了性能考虑设置inverse属性

<set>节点的inverse指定关联关系的控制方向,默认为由one方来维护

关联关系中,inverse = “false”为主动方,由主动方负责维护关联关系

在一对多关联中,只能把one方的inverse设置为true,则由many方为主动方

4.如不想在代码操作时即操作一方又操作多方,则可在<many-to-one> 或 <one-to-many>

设置cascade属性,此时系统会自动判断,如:如果给学生关联班级,没有该学生,则会自动添加学生


上述学习来自慕课网及网上学习感想。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值