简介
hibernate官网:Hibernate
Hibernate 是一个开放源代码的对象关系映射框架,它对 JDBC 进行了非常轻量级的对象封装,使得 Java 程序员可以随心所欲的使用对象编程思维来操纵数据库。 Hibernate 可以应用在任何使用 JDBC 的场合, 既可以在Java的客户端程序使用, 也可以在Servlet/JSP的Web应用中使用, 最具革命意义的是, Hibernate 可以在应用 EJB 的 J2EE 架构中取代 CMP,完成数据持久化的重任。 ORM 框架,对象关系映射(Object/Relation Mapping)
Hibernate工具类:
01 |
package com.glorze.util; |
03 |
import org.hibernate.SessionFactory; |
04 |
import org.hibernate.boot.registry.StandardServiceRegistryBuilder; |
05 |
import org.hibernate.cfg.Configuration; |
06 |
import org.hibernate.service.ServiceRegistry; |
12 |
public class HibernateUtil { |
13 |
private static final SessionFactory sessionFactory = buildSessionFactory(); |
15 |
public static SessionFactory buildSessionFactory() { |
16 |
Configuration configuration = new Configuration().configure(); // 实例化配置文件 |
17 |
ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder() |
18 |
.applySettings(configuration.getProperties()).build(); // 实例化服务登记 |
19 |
return configuration.buildSessionFactory(serviceRegistry); // 建立session工厂 |
22 |
public static SessionFactory getSessionFactory() { |
23 |
return sessionFactory; |
|
xml与注解
02 |
<!DOCTYPE hibernate-mapping PUBLIC |
03 |
"-//Hibernate/Hibernate Mapping DTD 3.0//EN" |
06 |
< hibernate-mapping package = "com.glorze.model" > |
07 |
< class name = "Student" table = "t_student" > |
08 |
< id name = "id" column = "stuId" > |
09 |
< generator class = "native" ></ generator > |
11 |
< property name = "name" ></ property > |
|
01 |
package com.glorze.model; |
03 |
import javax.persistence.Entity; |
04 |
import javax.persistence.GeneratedValue; |
05 |
import javax.persistence.Id; |
06 |
import javax.persistence.Table; |
08 |
import org.hibernate.annotations.GenericGenerator; |
11 |
@Table (name= "t_teacher" ) |
12 |
public class Teacher { |
17 |
@GeneratedValue (generator= "_native" ) |
18 |
@GenericGenerator (name= "_native" ,strategy= "native" ) |
22 |
public void setId( long id) { |
25 |
public String getName() { |
28 |
public void setName(String name) { |
32 |
public String toString() { |
33 |
return "Teacher [id=" + id + ", name=" + name + "]" ; |
|
映射对象标识符(OID)
1.Hibernate 用对象标识符(OID)

1 |
Student s1 = (Student) session.get(Student. class , Long.valueOf( 4 )); |
2 |
Student s2 = (Student) session.get(Student. class , Long.valueOf( 5 )); |
3 |
Student s3 = (Student) session.get(Student. class , Long.valueOf( 4 )); |
|
2.Hibernate 对象标识符生成策略
主键的分类 业务主键 VS 代理主键 代理主键是不具有业务性的;
increment 由 Hibernate 自动以递增的方式生成标识符,适用代理主键;
i层数据库的序列来生成标识符;适用代理主键; (不支持mysql,支持oracle和db2)
hilo Hdentity 由底层数据库生成标识符;适用代理主键;
sequcence 由 Hibernate 根据底ibernate 根据 high/low 算法来生成标识符。适用代理主键
native 根据底层数据库对自动生成标识符的支持能力, 来选择 identity,sequence 或 hilo;适用代理主键;
3.JUnit setUpBeforeClass() 类初始化前调用; tearDownAfterClass() 类初始化后调用; setUp() 在测试方法前调用; tearDown() 在测试方法后调用;
级联保存更新

在<many-to-one>这端,cascade 默认是”none”,假如我们希望在持久化多的一端的时候,自动级 联保存和更新一的一端,我们可以把 cascade 设置成”save-update”;
inverse属性:
02 |
<!DOCTYPE hibernate-mapping PUBLIC |
03 |
"-//Hibernate/Hibernate Mapping DTD 3.0//EN" |
06 |
< hibernate-mapping package = "com.glorze.model" > |
07 |
< class name = "Class" table = "t_class" > |
08 |
< id name = "id" column = "classId" > |
09 |
< generator class = "native" ></ generator > |
11 |
< property name = "name" column = "className" ></ property > |
13 |
< set name = "students" cascade = "delete" inverse = "true" > |
14 |
< key column = "classId" ></ key > |
15 |
< one-to-many class = "com.glorze.model.Student" /> |
|
2 |
public void testInverse(){ |
3 |
Class c=(Class) session.get(Class. class , Long.valueOf( 1 )); |
4 |
Student s=(Student) session.get(Student. class , Long.valueOf( 1 )); |
6 |
c.getStudents().add(s); |
|
一对多双向自身关联关系映射
01 |
package com.glorze.model; |
03 |
import java.util.HashSet; |
10 |
private Node parentNode; //多对一,父节点 |
12 |
private Set<Node> childrenNode= new HashSet<Node>(); //一对多,相当于父节点 |
18 |
public void setId( long id) { |
22 |
public String getName() { |
26 |
public void setName(String name) { |
30 |
public Node getParentNode() { |
34 |
public void setParentNode(Node parentNode) { |
35 |
this .parentNode = parentNode; |
38 |
public Set<Node> getChildrenNode() { |
42 |
public void setChildrenNode(Set<Node> childrenNode) { |
43 |
this .childrenNode = childrenNode; |
|
02 |
<!DOCTYPE hibernate-mapping PUBLIC |
03 |
"-//Hibernate/Hibernate Mapping DTD 3.0//EN" |
06 |
<hibernate-mapping package = "com.glorze.model" > |
07 |
< class name= "Node" table= "t_node" > |
08 |
<id name= "id" column= "nodeId" > |
09 |
<generator class = "native" ></generator> |
11 |
<property name= "name" column= "nodeName" ></property> |
13 |
<many-to-one name= "parentNode" column= "parentId" class = "com.java1234.model.Node" cascade= "save-update" ></many-to-one> |
15 |
<set name= "childrenNode" inverse= "true" > |
16 |
<key column= "parentId" ></key> |
17 |
<one-to-many class = "com.glorze.model.Node" /> |
|
01 |
package com.glorze.service; |
03 |
import static org.junit.Assert.*; |
05 |
import java.util.Iterator; |
08 |
import org.hibernate.Session; |
09 |
import org.hibernate.SessionFactory; |
10 |
import org.junit.After; |
11 |
import org.junit.Before; |
12 |
import org.junit.Test; |
14 |
import com.glorze.model.Class; |
15 |
import com.glorze.model.Node; |
16 |
import com.glorze.model.Student; |
17 |
import com.glorze.util.HibernateUtil; |
19 |
public class NodeTest { |
21 |
private SessionFactory sessionFactory = HibernateUtil.getSessionFactory(); |
22 |
private Session session; |
25 |
public void setUp() throws Exception { |
27 |
session = sessionFactory.openSession(); // 生成一个新的session |
28 |
session.beginTransaction(); // 开启事务 |
32 |
public void tearDown() throws Exception { |
33 |
session.getTransaction().commit(); // 提交事务 |
34 |
session.close(); // 关闭session |
38 |
public void testSave() { |
42 |
Node subNode1= new Node(); |
43 |
subNode1.setName( "子节点1" ); |
45 |
Node subNode2= new Node(); |
46 |
subNode2.setName( "子节点2" ); |
48 |
subNode1.setParentNode(node); |
49 |
subNode2.setParentNode(node); |
52 |
* invers属性 在多的一段进行数据操作 |
54 |
session.save(subNode1); |
55 |
session.save(subNode2); |
|
Hibernate中四种对象状态
临时状态(transient):刚用 new 语句创建,还没有被持久化,并且不处于 Sesssion 的缓存中。处于临时状态 的 Java 对象被称为临时对象。
持久化状态(persistent):已经被持久化,并且加入到 Session 的缓存中。处于持久化状态的 Java 对象被称为 持久化对象。
删除状态(removed):不再处于 Session 的缓存中,并且 Session 已经计划将其从数据库中删除。处于删除状 态的 Java 对象被称为删除对象。
游离状态(detached):已经被持久化,但不再处于 Session 的缓存中。处于游离状态的 Java 对象被称为游离对象。


01 |
package com.glorze.service; |
03 |
import org.hibernate.Session; |
04 |
import org.hibernate.SessionFactory; |
06 |
import com.glorze.model.Class; |
07 |
import com.glorze.model.Student; |
08 |
import com.glorze.util.HibernateUtil; |
10 |
public class StudentTest { |
12 |
public static void main(String[] args) { |
13 |
SessionFactory sessionFactory = HibernateUtil.getSessionFactory(); |
14 |
Session session = sessionFactory.openSession(); // 生成一个新的session |
15 |
session.beginTransaction(); // 开启事务 |
21 |
c1.setName( "1205211软件工程" ); |
24 |
c2.setName( "1205212软件工程" ); |
27 |
* c1 c2为持久化对象,存在session中 |
32 |
session.delete(c2); //删除对象 |
37 |
session.getTransaction().commit(); // 提交事务 |
38 |
session.close(); // 关闭session |
40 |
System.out.println(c1.getName()); //此时的c1为游离对象,但是可以获取属性值 |
41 |
System.out.println(c2.getName()); //删除状态 |
|
session常用方法
1,save()方法 将一个临时对象转变成持久化对象;
2,load()方法 VS get()方法
都是根据 OID 从数据库中加载一个持久化对象。
区别 1:假如数据库中不存在与 OID 对应的记录,Load()方法会抛出异常,而 get()方法返回 null;
区别 2:load 方法默认采用延迟加载策略,get 方法采用立即检索策略;
3,update()方法 将一个游离对象转变为持久化对象;
4,saveOrUpdate()方法 包含了 save()和 update()方法;
5,merge()方法,合并对象;
6,delete()方法,删除对象;
基本类型映射

一、集合类型映射
1,Set 无序 元素不可重复
2,List 有序 元素可重复
3,Bag 无序 元素可重复
4,Map 键值对
二、检索策略
检索策略属性 Lazy
Lazy:true (默认) 延迟检索 ;set 端 一对多
Lazy:false 立即检索;set 端 一对多
Lazy:extra 增强延迟检索; set 端 一对多
Lazy:proxy(默认) 延迟检索;many-to-one 多对一
Lazy:no-proxy 无代理延迟检索;many-to-one 多对一 (需要编译时字节码增强)
检索策略属性 batch-size
1,批量延迟检索;
2,批量立即检索;
检索策略属性 Fetch
1,Fetch:select(默认) 查询方式;
2,Fetch:subselect 子查询方式;
3,Fetch:join 迫切左外连接查询方式;
三、Hibernate 查询方式
1,导航对象图查询方式;(级联)
2,OID 查询方式; (get load)
3,本地 SQL 查询方式; (数据库的语法)
4,HQL 查询方式; (面向对象)
HQL(Hibernate Query Language)是面向对象的查询语言;是使用最广的一种查询方式;
1,普通查询;
2,带条件查询;
3,使用别名;
4,对结果排序;
5,分页查询;
6,查询单个对象;
7,链式写法;
5,QBC 查询方式;(Query By Criteria)
QBC 查询方式(Query By Criteria)是用一套接口来实现的查询方式;
1,普通查询;
2,带条件查询;
3,对结果排序;
4,分页查询;
5,查询单个对象;
6,链式写法;
四、配置数据库连接池
访问数据库,需要不断的创建和释放连接,假如访问量大的话,效率比较低级,服务器消耗大;
使用数据库连接池,我们可以根据实际项目的情况,定义连接池的连接个数,从而可以实现从连接池获取连 接,用户放回到连接池。从而有效的提高的系统的执行效率;
Hibernate 自带的连接池不是很好,有 bug; 推荐使用 C3P0,proxool 等;
配置日志框架 Log4J:
Log4J 作为一个开源的优秀日志框架,被广泛使用,Hibernate4 必须包中直接支持 Log4J 日志框架;我们只需
要引入 Log4j jar 包,即可使用;
配置 Hibernate缓存
1.缓存的概念
缓存是介于物理数据源与应用程序之间,是对数据库中的数据复制一份临时放在内存或者硬盘中的容 器,其作用是为了减少应用程序对物理数据源访问的次数,从而提高了应用程序的运行性能。Hibernate 在进 行读取数据的时候,根据缓存机制在相应的缓存中查询,如果在缓存中找到了需要的数据(我们把这称做“缓 存命 中"),则就直接把命中的数据作为结果加以利用,避免了大量发送 SQL 语句到数据库查询的性能损耗。
2.Hibernate 缓存的分类
一、Session 缓存(又称作事务缓存):Hibernate 内置的,不能卸除。 缓存范围:缓存只能被当前 Session 对象访问。缓存的生命周期依赖于 Session 的生命周期,当 Session 被关闭 后,缓存也就结束生命周期。 一级缓存只适用于同一事物中
二、SessionFactory 缓存(又称作应用缓存):使用第三方插件,可插拔。 缓存范围:缓存被应用范围内的所有 session 共享,不同的 Session 可以共享。这些 session 有可能是并发访问缓 存,因此必须对缓存进行更新。缓存的生命周期依赖于应用的生命周期,应用结束时,缓存也就结束了生命 周期,二级缓存存在于应用程序范围。
3.二级缓存策略提供商
提供了 HashTable 缓存,EHCache,OSCache,SwarmCache,jBoss Cathe2,这些缓存机制,其中 EHCache, OSCache 是不能用于集群环境(Cluster Safe)的,而 SwarmCache,jBoss Cathe2 是可以的。
HashTable 缓存主 要是用来测试的,只能把对象放在内存中,EHCache,OSCache 可以把对象放在内存(memory)中,也可以 把对象放在硬盘(disk)上(为什么放到硬盘上?上面解释了)。
4.什么数据适合放二级缓存中
经常被访问
改动不大
数量有限
不是很重要的数据,允许出现偶尔并发的数据。
比如组织机构代码,列表信息等;
5.配置 EHCache 二级缓存
03 |
<!-- 指定一个文件目录,当EHCache把数据写到硬盘上时,将把数据写到这个目录下 --> |
04 |
< diskStore path = "c:\\ehcache" /> |
10 |
maxElementsInMemory = "10000" |
12 |
timeToIdleSeconds = "120" |
13 |
timeToLiveSeconds = "120" |
18 |
name 设置缓存的名字,他的取值为类的完整名字或者类的集合的名字; |
19 |
maxElementsInMemory 设置基于内存的缓存可存放的对象的最大数目 |
20 |
eternal 如果为true,表示对象永远不会过期,此时会忽略timeToIdleSeconds和timeToLiveSeconds,默认为false; |
21 |
timeToIdleSeconds 设定允许对象处于空闲状态的最长时间,以秒为单位; |
22 |
timeToLiveSeconds 设定对象允许存在于缓存中的最长时间,以秒为单位; |
23 |
overflowToDisk 如果为true,表示当基于内存的缓存中的对象数目达到maxElementsInMemory界限,会把溢出的对象写到基于硬盘的缓存中; |
27 |
<!-- 设定具体的第二级缓存的数据过期策略 --> |
28 |
< cache name = "com.java1234.model.Class" |
29 |
maxElementsInMemory = "1" |
31 |
timeToIdleSeconds = "300" |
32 |
timeToLiveSeconds = "600" |
|
- ECLIPSE/JAVAWEB (二)三大框架之Hibernate框架 持续更新中...
(一)发展历史 在Struts框架中使用jdbc连接来读写数据库,我们最常见的就是打开数据库连接.使用复杂的sql语句进行读写.关闭连接,获得的数据又需要转换或封装后往外传,这是一个非常繁琐的过程. ...
- java视频教程 Java自学视频整理(持续更新中...)
视频教程,马士兵java视频教程,java视频 1.Java基础视频 <张孝祥JAVA视频教程>完整版[RMVB](东西网) 历经5年锤炼(史上最适合初学者入门的Java基础视频)(传智播 ...
- 4W字的后端面试知识点总结(持续更新)
点赞再看,养成习惯,微信搜索[三太子敖丙]关注这个互联网苟且偷生的工具人. 本文 GitHub https://github.com/JavaFamily 已收录,有一线大厂面试完整考点.资料以及我的 ...
- Java基础面试题(史上最全、持续更新、吐血推荐)
文章很长,建议收藏起来,慢慢读! 疯狂创客圈为小伙伴奉上以下珍贵的学习资源: 疯狂创客圈 经典图书 : <Netty Zookeeper Redis 高并发实战> 面试必备 + 大厂必备 ...
- Redis 面试题 - 收藏版 (持续更新、吐血推荐)
文章很长,建议收藏起来,慢慢读! 疯狂创客圈为小伙伴奉上以下珍贵的学习资源: 疯狂创客圈 经典图书 : <Netty Zookeeper Redis 高并发实战> 面试必备 + 大厂必备 ...
- 神技!微信小程序(应用号)抢先入门教程(附最新案例DEMO-豆瓣电影)持续更新
微信小程序 Demo(豆瓣电影) 由于时间的关系,没有办法写一个完整的说明,后续配合一些视频资料,请持续关注 官方文档:https://mp.weixin.qq.com/debug/wxadoc/de ...
- iOS系列教程 目录 (持续更新...)
前言: 听说搞iOS的都是高富帅,身边妹子无数.咱也来玩玩.哈哈. 本篇所有内容使用的是XCode工具.Swift语言进行开发. 我现在也是学习阶段,每一篇内容都是经过自己实际编写完一遍之后,发现 ...
- ASP.NET MVC 5 系列 学习笔记 目录 (持续更新...)
前言: 记得当初培训的时候,学习的还是ASP.NET,现在回想一下,图片水印.统计人数.过滤器....HttpHandler是多么的经典! 不过后来接触到了MVC,便立马爱上了它.Model-View ...
- git常用命令(持续更新中)
git常用命令(持续更新中) 本地仓库操作git int 初始化本地仓库git add . ...
随机推荐
- Mysql5.7忘记root密码及修改root密码的方法
Mysql 安装成功后,输入 mysql --version 显示版本如下 mysql Ver 14.14 Distrib 5.7.13-6, for Linux (x86_64) using 6.0 ...
- 关于IOS sourcetree 注册 2017最新hosts
今天用sourcetree git管理工具的时候,第一次打开发现需要注册. 在网上搜索了一下教程,发现现在新版本没有 (我同意协议)这个条款,这就尴尬.我以前没有sourcetree的账号. 试了 ...
- 总结scala(一)
由于笔记太多,分为了几部分,进入我的博客,查看其它的笔记 scala:面向对象,函数式编程 一.声明变量 1.变量的类型 Byte,Char,Short,Int,Long,Float,Double,B ...
- Java 后台创建word 文档
---恢复内容开始--- Java 后台创建 word 文档 自己总结 网上查阅的文档 分享POI 教程地址:http://www.tuicool.com/articles/emqaEf6 方式一. ...
- VR全景智慧城市—你的掌上步行街
"春风十里,不如有你",不知不觉间,身边的人已对VR不再陌生,VR眼镜的热销,VR体验店的火爆,VR游戏的向往等等.可见VR就是为生活而诞生! 2015年被称作VR行业的产业元年, ...
- sql还原(.mdf文件还原)
第一步: 把备份文件放到目录:C:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\DATA (默认)(这里用 MyDB.md ...
- INFORMATION_SCHEMA.PROFILING
24.18 The INFORMATION_SCHEMA PROFILING Table PROFILING表提供了语句分析信息. 其内容对应于SHOW PROFILES和SHOW PROFILE语句 ...
- {网络编程}和{多线程}应用:基于UDP协议【实现多发送方发送数据到同一个接收者】--练习
要求: 使用多线程实现多发送方发送数据到同一个接收者 代码: 发送端:可以在多台电脑上启动发送端,同时向接收端发送数据 注意:匹配地址和端口号 package com.qf.demo; import ...
- [附录]Discuz X2.5程序模块source功能处理目录注释
/source/admincp后台管理 /source/admincp/cloud云平台项目 /source/admincp/menu后台扩展菜单目录 /source/admincp/moderate ...
- SQL储存过程
基本语法 创建存储过程 create procedure sp_name @[参数名] [类型],@[参数名] [类型] as begin ......... end 以上格式还可以简写成: crea ...