hibernate笔记.docx
- 文档编号:1953171
- 上传时间:2023-05-02
- 格式:DOCX
- 页数:19
- 大小:22.41KB
hibernate笔记.docx
《hibernate笔记.docx》由会员分享,可在线阅读,更多相关《hibernate笔记.docx(19页珍藏版)》请在冰点文库上搜索。
hibernate笔记
hibernate
(1)
一.何谓持久化?
1.将内存中数据保存到永久性的介质中,称之为持久化.
2.jdbc/io/对象序列化常见的持久化技术.
二.持久化与持久层的区别.
1.持久层是一个独立的逻辑层,提供持久化服务,对象的缓存管理,事务的管理。
2.hibernate是持久层框架之中的一种.走的是orm的路线.
三.Hibernate项目的结构
1.WEB-INF/lib中必须有hibernate相关jar包.
2.src下有hibernte.cfg.xml文件.全局配置,(配置连接池.映射规则的加载)
3.写实体类
4.写实体类与表的映射规则
与实体类在同一个目录之下,且文件名与实体类同名,扩展名为.hbm.xml
类<==>表
(oid)主键属性<==>主键列
属性<==>列
四.简化Dao
1.原生态的HibernateAPI操作步骤
1)读取配置文件,Configuration是重量级对象,只需要一个.
Configurationconf=newConfiguration().configure();
hibernate.properties
hibernate.cfg.xml
***.hbm.xml
2)创建数据源对象<==>DataSource
SessionFactorysf=conf.buildSessionFactory();
3)产生会话对象<==>Connection
Sessionsession=sf.openSession();
4)操作
session.方法(实体);
5)归还连接
session.close();
Hibernate核心对象的特征:
a.Configuration和SessionFactory都是创建之后占用内存的,
因此只需要创建一次。
b.由SessionFactory产生的Session,是非线程安全的对象。
以上问题由HibernateSessionFactory给予解决:
a.用静态成员初始化解决.
b.用ThreadLocal解决.
五.Hibernate管理对象的生命周期
1.三种状态
a.临时态:
实体对象与数据库的记录不对应.(vo:
不具备oid属性)
b.持久态:
实体对象与数据库的记录正在对应.(po)
c.游离态:
实体对象与数据库的记录曾经对应.(vo:
具备oid属性)
2.要点:
a.所有的oid属性类型为对象类型
b.不要对oid属性做设值操作,privatevoidsetOID()
c.po对象不能出dao层.永远在session.close()之后,再return
d.先查再删,改
e.只有vo可以垃圾回收
六.Hibernate的一级缓存
1.每一个session内部都有一个map,缓存所有的访问过的数据,如果在缓存中命中,则不会到db中去取,减少io次数.
2.session缓存的数据在一个事务周期有效.
3.数据同步是所有缓存面临的共同问题---脏数据.
a.数据同步有两个时间点:
查脏数据或提交事务(自动)
b.任何时候调用session.flush()方法会同步脏数据.
4.常见的面试题:
批量更新怎样做?
a.先查一部分数据
b.再改一部分数据
c.同步
d.清空缓存
e.下一次循环
hibernate
(2)
一.多表映射
1.表间的三种关联,不考虑1:
1的情况,通过表合并消除。
2.表间关联方向永远是从多至一.两个表间的多对多,本质上是两个一对多.
3.表间的关联通过外键字段建立的.
以上特征对应为类间的关联.
二.表间一对多关联的映射
1.类的映射
一端类中用集合属性表示关联。
多端类中用标量属性表示关联。
2.映射文件
一端的做法:
多端的做法
inverse="true"的含义:
表示建立关联的主动方为多方.
多方.set属性名(一方)
cascade="save-update"的含义:
表示新增或者更新对象时,同时新增或更新该对象的关联属性.
hibernate(3)
回顾
1.hibernate托管对象的生命周期
临时态(insert)
持久态(隐式update,delete,查询出的数据(连接未关))
游离态(update,delete,查询出的数据(连接已关))
2.关联映射(一对多)
a.表(主键,外键,但不必一定有约束)
b.类(一端:
必须有集合关联属性,多端:
必须有标量对象属性)
c.表的单向关联靠外键建立,且方向为多至一.类的关联是通过关联属性建立.
3.写法
一端映射
多端映射
//建立关联的要点
a.主动方谁
b.级联操作方向
多方.set***(一方)
一方.get***().add(多方)
一.多对多映射
1.连接表的规则为:
只存两端表的主键做外键.
2.映射写法
Hibernate(四)-Hibernate的查询
一.Hibernate的查询容器
1.Query:
可以存放hql语句.风格如同传统sql。
2.Criteria:
存放Criterion条件对象.方法链的风格。
以上两种容器的底层都是PreparedStatement.
*hql与sql的区别:
hql是一种中间的查询语言,意味着它不受数据库不同而有影响.
sql:
分为ddl,dcl,dml,不仅只做查询.
hql:
专用于做查询的(hibernate2).hibernate3做了扩展,允许做update,delete.
二.Query容器查询
1.具体的步骤
//创建查询容器
Queryq=session.createQuery(hql);
//返回多行数据
q.list();
*hql的语法
from类名别名where别名.属性名=值
1)省略select部分,表示取该对象的全部属性,相当于select*
2)如果写明select,则表示取对象的部分属性.
3)hql区别大小写,所有关键字小写,与对象相关部分按照java的规则来写.
2.查询结果的特征
返回一个List类型的结果.如果没有匹配的结果,返回一个空list,注意不是null.应该用list.isEmpty()判断是否有结果.
返回一个Object类型的结果,适用于匹配一行记录的情况,用query.uniqueResult().如果查询的结果不止一行,则抛出异常.
3.使用占位符
hql中用?
表示
query.set类型(索引,参数)
4.分页查询
query.setFirstResult((页号-1)*页大小)
.setMaxResults(页大小).list()
5.取部分属性的查询(概要查询)
select属性列表from类名
返回的是一个对象数组,在页面上显示时不方便,重新用构造函数来封装.
selectnew类名(属性列表)from类名
6.关联查询
相当于数据库中的隐式内连接查询
from类名别名where别名.关联属性.关联属性.属性=值
7.左连接查询
from 类名别名leftjoinfetch别名.关联属性名别名leftjoinfetch别名.关联属性名别名....where...
如果用默认策略,hibernate是不会同时检查关联表中的数据的,因此我们需要做出策略的覆盖,一种使用显式配置,在关联属性映射中添加lazy="false",变成立即策略,另一种使用隐式配置,在查询使用leftjoinfetch。
左连接查询会带来重复数据.
在查询之后应该用LinkedHashSet进行消除重复数据的动作.
list=newArrayList(newLinkedHashSet(list));
*leftjoinfetch不允许出现多到多的连接.
应该使用leftjoin来进行查询,但其结果会出现重复,将所有实体的主键属性oid定义放在BaseEntity中完成,同时覆写equals和hashCode方法.
publicbooleanequals(Objecto){
if(o==this){
returntrue;
}
if(oinstanceofBaseEntity){
return((BaseEntity)o).getOid().equals(this.getOid());
}
returnfalse;
}
publicinthashCode(){
returnthis.getOid().hashCode();
}
Hibernate(四)-Hibernate的查询
一.Hibernate的查询容器
1.Query:
可以存放hql语句.风格如同传统sql。
2.Criteria:
存放Criterion条件对象.方法链的风格。
以上两种容器的底层都是PreparedStatement.
*hql与sql的区别:
hql是一种中间的查询语言,意味着它不受数据库不同而有影响.
sql:
分为ddl,dcl,dml,不仅只做查询.
hql:
专用于做查询的(hibernate2).hibernate3做了扩展,允许做update,delete.
二.Query容器查询
1.具体的步骤
//创建查询容器
Queryq=session.createQuery(hql);
//返回多行数据
q.list();
*hql的语法
from类名别名where别名.属性名=值
1)省略select部分,表示取该对象的全部属性,相当于select*
2)如果写明select,则表示取对象的部分属性.
3)hql区别大小写,所有关键字小写,与对象相关部分按照java的规则来写.
2.查询结果的特征
返回一个List类型的结果.如果没有匹配的结果,返回一个空list,注意不是null.应该用list.isEmpty()判断是否有结果.
返回一个Object类型的结果,适用于匹配一行记录的情况,用query.uniqueResult().如果查询的结果不止一行,则抛出异常.
3.使用占位符
hql中用?
表示
query.set类型(索引,参数)
4.分页查询
query.setFirstResult((页号-1)*页大小)
.setMaxResults(页大小).list()
5.取部分属性的查询(概要查询)
select属性列表from类名
返回的是一个对象数组,在页面上显示时不方便,重新用构造函数来封装.
selectnew类名(属性列表)from类名
6.关联查询
相当于数据库中的隐式内连接查询
from类名别名where别名.关联属性.关联属性.属性=值
7.左连接查询
from 类名别名leftjoinfetch别名.关联属性名别名leftjoinfetch别名.关联属性名别名....where...
如果用默认策略,hibernate是不会同时检查关联表中的数据的,因此我们需要做出策略的覆盖,一种使用显式配置,在关联属性映射中添加lazy="false",变成立即策略,另一种使用隐式配置,在查询使用leftjoinfetch。
左连接查询会带来重复数据.
在查询之后应该用LinkedHashSet进行消除重复数据的动作.
list=newArrayList(newLinkedHashSet(list));
hibernate
(1)
一.何谓持久化?
1.将内存中数据保存到永久性的介质中,称之为持久化.
2.jdbc/io/对象序列化常见的持久化技术.
二.持久化与持久层的区别.
1.持久层是一个独立的逻辑层,提供持久化服务,对象的缓存管理,事务的管理。
2.hibernate是持久层框架之中的一种.走的是orm的路线.
三.Hibernate项目的结构
1.WEB-INF/lib中必须有hibernate相关jar包.
2.src下有hibernte.cfg.xml文件.全局配置,(配置连接池.映射规则的加载)
3.写实体类
4.写实体类与表的映射规则
与实体类在同一个目录之下,且文件名与实体类同名,扩展名为.hbm.xml
类<==>表
(oid)主键属性<==>主键列
属性<==>列
四.简化Dao
1.原生态的HibernateAPI操作步骤
1)读取配置文件,Configuration是重量级对象,只需要一个.
Configurationconf=newConfiguration().configure();
hibernate.properties
hibernate.cfg.xml
***.hbm.xml
2)创建数据源对象<==>DataSource
SessionFactorysf=conf.buildSessionFactory();
3)产生会话对象<==>Connection
Sessionsession=sf.openSession();
4)操作
session.方法(实体);
5)归还连接
session.close();
Hibernate核心对象的特征:
a.Configuration和SessionFactory都是创建之后占用内存的,
因此只需要创建一次。
b.由SessionFactory产生的Session,是非线程安全的对象。
以上问题由HibernateSessionFactory给予解决:
a.用静态成员初始化解决.
b.用ThreadLocal解决.
五.Hibernate管理对象的生命周期
1.三种状态
a.临时态:
实体对象与数据库的记录不对应.(vo:
不具备oid属性)
b.持久态:
实体对象与数据库的记录正在对应.(po)
c.游离态:
实体对象与数据库的记录曾经对应.(vo:
具备oid属性)
2.要点:
a.所有的oid属性类型为对象类型
b.不要对oid属性做设值操作,privatevoidsetOID()
c.po对象不能出dao层.永远在session.close()之后,再return
d.先查再删,改
e.只有vo可以垃圾回收
六.Hibernate的一级缓存
1.每一个session内部都有一个map,缓存所有的访问过的数据,如果在缓存中命中,则不会到db中去取,减少io次数.
2.session缓存的数据在一个事务周期有效.
3.数据同步是所有缓存面临的共同问题---脏数据.
a.数据同步有两个时间点:
查脏数据或提交事务(自动)
b.任何时候调用session.flush()方法会同步脏数据.
4.常见的面试题:
批量更新怎样做?
a.先查一部分数据
b.再改一部分数据
c.同步
d.清空缓存
e.下一次循环
hibernate
(2)
一.多表映射
1.表间的三种关联,不考虑1:
1的情况,通过表合并消除。
2.表间关联方向永远是从多至一.两个表间的多对多,本质上是两个一对多.
3.表间的关联通过外键字段建立的.
以上特征对应为类间的关联.
二.表间一对多关联的映射
1.类的映射
一端类中用集合属性表示关联。
多端类中用标量属性表示关联。
2.映射文件
一端的做法:
多端的做法
inverse="true"的含义:
表示建立关联的主动方为多方.
多方.set属性名(一方)
cascade="save-update"的含义:
表示新增或者更新对象时,同时新增或更新该对象的关联属性.
hibernate(3)
回顾
1.hibernate托管对象的生命周期
临时态(insert)
持久态(隐式update,delete,查询出的数据(连接未关))
游离态(update,delete,查询出的数据(连接已关))
2.关联映射(一对多)
a.表(主键,外键,但不必一定有约束)
b.类(一端:
必须有集合关联属性,多端:
必须有标量对象属性)
c.表的单向关联靠外键建立,且方向为多至一.类的关联是通过关联属性建立.
3.写法
一端映射
多端映射
//建立关联的要点
a.主动方谁
b.级联操作方向
多方.set***(一方)
一方.get***().add(多方)
一.多对多映射
1.连接表的规则为:
只存两端表的主键做外键.
2.映射写法
Hibernate(四)-Hibernate的查询
一.Hibernate的查询容器
1.Query:
可以存放hql语句.风格如同传统sql。
2.Criteria:
存放Criterion条件对象.方法链的风格。
以上两种容器的底层都是PreparedStatement.
*hql与sql的区别:
hql是一种中间的查询语言,意味着它不受数据库不同而有影响.
sql:
分为ddl,dcl,dml,不仅只做查询.
hql:
专用于做查询的(hibernate2).hibernate3做了扩展,允许做update,delete.
二.Query容器查询
1.具体的步骤
//创建查询容器
Queryq=session.createQuery(hql);
//返回多行数据
q.list();
*hql的语法
from类名别名where别名.属性名=值
1)省略select部分,表示取该对象的全部属性,相当于select*
2)如果写明select,则表示取对象的部分属性.
3)hql区别大小写,所有关键字小写,与对象相关部分按照java的规则来写.
2.查询结果的特征
返回一个List类型的结果.如果没有匹配的结果,返回一个空list,注意不是null.应该用list.isEmpty()判断是否有结果.
返回一个Object类型的结果,适用于匹配一行记录的情况,用query.uniqueResult().如果查询的结果不止一行,则抛出异常.
3.使用占位符
hql中用?
表示
query.set类型(索引,参数)
4.分页查询
query.setFirstResult((页号-1)*页大小)
.setMaxResults(页大小).list()
5.取部分属性的查询(概要查询)
select属性列表from类名
返回的是一个对象数组,在页面上显示时不方便,重新用构造函数来封装.
selectnew类名(属性列表)from类名
6.关联查询
相当于数据库中的隐式内连接查询
from类名别名where别名.关联属性.关联属性.属性=值
7.左连接查询
from 类名别名leftjoinfetch别名.关联属性名别名leftjoinfetch别名.关联属性名别名....where...
如果用默认策略,hibernate是不会同时检查关联表中的数据的,因此我们需要做出策略的覆盖,一种使用显式配置,在关联属性映射中添加lazy="false",变成立即策略,另一种使用隐式配置,在查询使用leftjoinfetch。
左连接查询会带来重复数据.
在查询之后应该用LinkedHashSet进行消除重复数据的动作.
list=newArrayList(newLinkedHashSet(list));
*leftjoinfetch不允许出现多到多的连接.
应该使用leftjoin来进行查询,但其结果会出现重复,将所有实体的主键属性oid定义放在BaseEntity中完成,同时覆写equals和hashCode方法.
publicbooleanequals(Objecto){
if(o==this){
returntrue;
}
if(oinstanceofBaseEntity){
return((BaseEntity)o).getOid().equals(this.getOid());
}
returnfalse;
}
publicinthashCode(){
returnthis.getOid().hashCode();
}
Hibernate(四)-Hibernate的查询
一.Hibernate的查询容器
1.Query:
可以存放hql语句.风格如同传统sql。
2.Criteria:
存放Criterion条件对象.方法链的风格。
以上两种容器的底层都是PreparedStatement.
*hql与sql的区别:
hql是一种中间的查询语言,意味着它不受数据库不同而有影响.
sql:
分为ddl,dcl,dml,不仅只做查询.
hql:
专用于做查询的(hibernate2).hibernate3做了扩展,允许做update,delete.
二.Query容器查询
1.具体的步骤
//创建查询容器
Queryq=session.createQuery(hql);
//返回多行数据
q.list();
*hql的语法
from类名别名where别名.属性名=值
1)省略select部分
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- hibernate 笔记