ORM
对象-关系映射:把对象保存到关系表中或者把关系表中数据取出映射为对象
1.配置数据库驱动、连接等信息;
2.新建类名.hbm.xml与实体类和表相对应;
3.
主键生成
1.identity:用亍自动生成主键方式,除了Oracle不支持,其他数据库一般都支持(较常用)
2.sequence Oracle中使用,用序列生成ID主键
3.native 主键生成方式如果是native,那就看配置文件hibernate.cfg.xml中,方言<property name="dialect">是什么;如果方言是Mysql,相当于identity,如果方
言是Oracle,相当于sequence
4.increment 不常用
5.assigned 不常用,手劢生成id
常见的映射类型
string
interger
double
date 日期,只表示年月日
datetime 日期,只表示年月日
timestamp 时间戳,存放年月日时分秒
yes_no 将在数据库中存一个字符Y戒者N
true_false 将在数据库中存放一个字符T戒者F,功能同yes_no是相同的
HQL语句
给HQL语句赋参数
1.
String hqlDelete = "delete Project p where p.id=:oldId";
for (Integer id : ids) {
Query query = session.createQuery(hqlDelete);
query.setInteger("oldId", id).executeUpdate();
}
2.
String hql = "from Project where id=?";
Session session = HibernateUtil.openSession();
Query query = session.createQuery(hql);
query.setParameter(0, id);
3.查询对象
String HQL = "FROM User";
4.hibernate分页
String hql = " from Project ";
Session session = HibernateUtil.openSession();
Query query = session.createQuery(hql);
query.setFirstResult((pagenum-1)*prePage);
query.setMaxResults(prePage);
List<Project> list = query.list();
等同于select * from project limit ?,?
5.LEFT JOIN
String hql = "from emp e left outer join fetch e.dept where e.dept.name=?"
from Emp e left outer join fetch e.dept
6.distinct
select distinct(o) from Order o join fetch o.items.
7.Criteria类是Hibernate提供的用亍动态条件查询的类
Criteria criteria = session.createCriteria(User.class);
criteria.add((Restrictions.or(Restrictions.ge("loginName", "s"),Restrictions.eq("password", "123"))));
List<User> list = criteria.list();
for (User user : list) {
System.out.println(user.getName());
}
8.
from Emp
返回 List<Emp>
select emp.id from Emp emp
返回 List<Integer>
select emp.id , emp.name from Emp emp
返回 List<Object[]>
select new Emp(emp.id, emp.name) from Emp emp
返回的仍然是 List<Emp>,此时的Emp对象中叧有id和name,并且不是持久态对象
9.createSQL
Query query = session.createSQLQuery("select * from t_user");
List<Object[]> list = query.list();
for (Object[] obj : list) {
System.out.println(obj[0]);
}
10.其它的查询语句
from Emp emp order by emp.salary desc
select count(emp.id) from Emp emp //返回List<Integer>
select max(emp.salary) from Emp emp
select emp.name, count(emp.id) from Emp emp group by emp.name
11.对集合join fecth
from Student stu join fetch stu.courses c where c.name = ? //inner join不能分页
三种状态
暂时态:当对象刚被创建时,和Session没有发生任何关系时,当程序运行完就立刻消失;
持久态:与Session发生了关系
Session中会缓存该对象(Session的缓存是一级缓存)
Session再获取对象时,首先去查找一级缓存,如果没有才查询数据库
Session要负责将持久态对象的变化更新到数据库
(在是flush()的时候更新,tx在提交的时候会自劢调用session的flush())
游离态:调用了session.evict(Object obj)方法,和Session解除了关系
缓存
需要关注的问题
1.缓存中的数据必须是同数据库中数据保持一致
2.缓存的命中率
encache缓存组件
一级缓存[SESSION,用户线程专用]
1.如果session被查询,session将先到缓存中查找是否有被查询的对象,找到则直接取出;否则查询数据库
2.session需要实时维护在缓存中的数据,保证缓存中的数据与数据库中数据的一致性,一旦用户对缓存中的数据做了修改,session立刻将数据更新到数据库中;
获得Session对象
Foo foo = (Foo)session.get(Foo.class,1);
从Session中清楚对象
session.evict(foo);
二级缓存[SESSIONFACTORY,共用,默认只保存对象]
使用步骤
1.导入Jar包
2.Hibernate配置文件中指明使用二级缓存ehcache
3.配置ehcache配置文件,定制缓存策略,共需指定5个属性。
4.选择哪个对象使用二级缓存机制
在该对象的配置文件*.hbm.xml中配置如何使用二级缓存机制
首先,通过region属性指定要使用的二级缓存;
其次,通过usage属性指定使用二级缓存的方式
配置问题:Second-level cache is used in the application, but property hibernate.cache.region.factory_class is not given
<!-- 设置二级缓存 (4.0以后版本)-->
在hibernate的配置文件中
<property name="hibernate.cache.region.factory_class">
org.hibernate.cache.ehcache.EhCacheRegionFactory
</property>
并需要添加hibernate-ehcache-4.3.7.Final.jar和slf4j-api-1.6.1.jar
查询缓存
查询缓存适用亍查询结果数据量巨大,查询结果一般不轻易改变的查询。
开启二级缓存后,session抓取数据的过程变成先查找一级缓存,再查找二级缓存,只有当一级缓存和二级缓存都没有数据时,才查找数据库;
延迟加载机制
当访问实体对象时,并丌是立即到数据库中查找。而是在真正要使用实体对象的时候,才去数据库查询数据。
具备延迟加载机制的方法
session.load();
sesson.iterator();
对于列表查询不适用延迟加载
OpenSessionView和ThreadLocal
1.OpenSessionInView技术把Session的关闭延迟到View组件运行完之后
2.如果用延迟加载必须使用OpenSessionInView技术,否则在取数据时,session已经关闭了
3.实现OpenSessionInView可以采用很多技术:
Servlet——过滤器
Struts2——拦截器
Spring —— AOP
4.使用OpenSessionInView必须满足Session的线程单例
一个线程分配一个Session,在该线程的方法中可以获得该Session, 具体使用ThreadLocal——其实是一个线程为KEY的Map,
5.Hibernate的支持
配置文件中: <property name="current_session_context_class">thread</property> 然后调用: sessionFactory.getCurrentSession(); 自动实现线程单例
6.推荐使用ThreadLocal来实现session线程单例
动态生成类
调用asm.jar的作用就是在内存中生成类;cglib-2.1.3.jar是在调用asm.jar的基础上动态的生成子类
继承关系映射到多个表
锁
1.乐观锁:谁先抢到,谁先买;
处理方式:为表增加version字段;
当用户读取数据时,会将版本号version一同读出;
如果该用户修改了数据,会先将取出的版本号不数据库中的版本号做对比。
如果相同,才能修改;修改完成后,会将版本号version+1
如果不相同,则不能修改,会抛出异常
设定累加器解决Hibernate批量插入或删除时内存溢出的情况,并关闭二级缓存
分享到:
相关推荐
《Hibernate学习笔记特别详细》 Hibernate,作为一款开源的Object-Relational Mapping(ORM)框架,为Java开发者提供了强大的数据库操作支持。它简化了数据库访问的复杂性,使得开发人员可以像操作对象一样操作...
在本篇《Hibernate学习笔记》中,我们将深入探讨Hibernate这一流行的Java对象关系映射(ORM)框架。Hibernate允许开发者以面向对象的方式处理数据库操作,极大地简化了数据存取的复杂性。以下是一些关键知识点: 1....
Hibernate学习笔记整理 以下是 Hibernate 框架的详细知识点: Hibernate 介绍 Hibernate 是一个 ORM(Object-Relational Mapping)框架,用于将 Java 对象映射到数据库表中。它提供了一个简洁的方式来访问和操作...
【Java相关课程系列笔记之十四Hibernate学习笔记】 Hibernate是一个开源的对象关系映射(ORM)框架,它极大地简化了Java应用程序对数据库的操作。本笔记将详细阐述Hibernate的核心概念、使用方法和特性。 一、...
hibernate 学习笔记精要hibernate 学习笔记精要hibernate 学习笔记精要hibernate 学习笔记精要
《Hibernate学习笔记——马士兵教程解析》 在Java开发领域,ORM(Object-Relational Mapping)框架的使用已经非常普遍,其中Hibernate作为一款优秀的ORM框架,因其强大的功能和易用性深受开发者喜爱。本文将根据马...
这套笔记是我学习Hibernate,进行相关技术点训练时记录下来的,其中包括技术点说明与相关事例,拿出来与大家分享。
### 马士兵Hibernate学习笔记知识点总结 #### 一、HelloWorld示例 - **目的**:通过简单的示例理解Hibernate的基本使用流程。 - **步骤**: - 创建Java项目`hibernate_0100_HelloWorld`。 - 建立库依赖,包括...
Hibernate是一款强大的Java持久...通过阅读这份“Hibernate API帮助文档”和“Hibernate学习笔记”,你将能够深入理解Hibernate的工作原理,掌握其API的使用,并能在实际项目中有效地利用Hibernate进行数据持久化操作。
**Hibernate学习笔记与总结** Hibernate 是一款开源的对象关系映射(ORM)框架,它为Java开发者提供了一种在关系数据库上操作对象数据的便捷方式。本文将深入探讨Hibernate的核心概念、配置、实体类、映射文件、...
### Hibernate 学习笔记知识点概览 #### 一、Hibernate 概述 - **定义**:Hibernate 是一款开源的对象关系映射(ORM)框架,它实现了将 Java 应用程序中的对象模型映射到关系型数据库中的记录。通过 ORM 技术,...
### JDBC与Hibernate学习笔记 #### 一、JDBC概述 **1.1 ODBC与JDBC的区别** - **ODBC(Open Database Connectivity)**: 开放式数据库连接是一种开放标准的应用程序接口(API),用于实现数据库应用程序与不同...
### 对象持久化与Hibernate学习笔记 #### 一、对象持久化的概念与重要性 - **定义**: 对象持久化是指将程序中的对象状态存储到持久化存储设备上的过程,以便在程序结束运行后仍然可以保留这些数据。 - **必要性**:...
《马士兵Hibernate学习笔记》是一份深入浅出的教程,旨在帮助初学者掌握Hibernate这一流行的Java持久化框架。Hibernate是一个对象关系映射(ORM)工具,它允许开发者用面向对象的方式来操作数据库,从而减少了传统...
【hibernate学习笔记】 在Java开发中,Hibernate是一个强大的对象关系映射(ORM)框架,它极大地简化了数据库操作。以下是对Hibernate的学习要点的详细解释: 1. **建立第一个Hibernate版本的HelloWorld** - **...
标题:Hibernate学习笔记3 描述:本篇笔记深入探讨了Hibernate框架中一对多关系的映射及持久化对象状态管理,结合个人理解与实践经验,旨在为读者提供一份详实的学习资料。 ### 一、一对多关系映射详解 在...