简介
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 . ...
随机推荐
- 五、 创建连接串连接本地数据库(ASP.NET MVC5 系列)
1. 创建连接串连接本地SQLServer数据库 上节讲到MovieDBContext类,这个类的作用是连接数据库并将Movie对象迁移到数据库记录中.不过你会问一个问题:如何知道这个对象将连接哪个数 ...
- sh脚本异常,binsh^M bad interpreter No such file or directory
错误 在Linux中执行.sh脚本,出现如下异常 /bin/sh^M: bad interpreter: No such file or directory 原因 在windows系统中编辑的.sh文 ...
- R语言&页游渠道分析(转)
对着满屏的游戏后台数据,需要快速了解数据特征,一种茫然无从下手的感觉? 本文在游戏后台数据中,如何通过R语言快速的了解游戏后台的数据特征,以及统计各个数据之间的相关系数,并通过相关图来发现其中相关系数 ...
- maven问题:如何不继承父工程的依赖
在maven中,使用父工程来管理所有的依赖,当子工程只需要用到父工程的部分依赖,而不是所有依赖时,只需要在父工程的依赖中加入<dependencyManagement></depen ...
- Java 开发中如何正确踩坑
为什么说一个好的员工能顶 100 个普通员工 我们的做法是,要用最好的人.我一直都认为研发本身是很有创造性的,如果人不放松,或不够聪明,都很难做得好.你要找到最好的人,一个好的工程师不是顶10个,是顶 ...
- Java将头像图片保存到MySQL数据库
在做头像上传的过程中通常是将图片保存到数据库中,这里简单介绍一中将图片保存到数据库的方法: jsp代码: <div> <input class="avatar-input& ...
- NLTK学习笔记(一):语言处理和Python
目录 [TOC] nltk资料下载 import nltk nltk.download() 其中,download() 参数默认是all,可以在脚本里面加上nltk.download(需要的资料库) ...
- 框架和css基础
框架:一.框架集:1.<frameset></frameset>不能有<body>标签 属性:1)cols:把网页拆分成几列(左右拆分)eg:<framese ...
- abstract关键字
概念 abstract关键字表示的是抽象的意思,可以用来修饰类和方法.修饰类我们称为抽象类,修饰方法我们称为抽象方法. abstract修饰类,抽象类 1.public abstract clas ...
- 定期清空log文件
# auto-del-log.sh #!/bin/shfor i in `find . -name "*.out" -o -name "*.log"`do c ...