默认计划
(0人评价)
Hibernate开发框架深度讲解2017【极限IT JAVA班第19课】

更新2017版本

价格 ¥ 380.00
该课程属于 【极限IT】JAVA工程师训练营 领券低至2980元
请加入后再学习

持久太对象不存在一级缓存中!

[展开全文]
张多多76804 · 2017-10-11 · 该任务已被删除 0

关键词:

1、延迟加载必须打开,即lazy=true,否则,将造成1+N次查询,一方查询的同时,多方也会自动查询,但是延迟加载打开后,只有在使用多方的时候才会查询多方;

2、控制反转inverse(p193,一对多关系中,多方inverse=true,拥有控制反转权限后可以帮助一方进行维护),

3、级联cascade

总体:①表(自动生成pojo类);②产生pojo类以及*.hbm.xml配置文件或Annotation注解;③同时产生hibernate.cfg.xml文件;

session在此处可以理解为:数据库连接对象或操作对象;

p5——Hibernate设计思想:封装JDBC操作,避免数据层直接与JDBC耦合,利用反射与XML解析自动生成sql语句并执行sql语句;

p6——Hibernate支持数据库移植性;

p10——MyEclipse的DB Browser中创建数据库连接;

p12——Web Project项目添加Hibernate支持;

p13——由数据表自动生成pojo类(同时生成对应*.hbm.xml文件或在pojo类中生成Annotation注解),并指定主键类型;

p22——Hibernate核心配置文件:hibernate.cfg.xml,改变方言即可改变连接数据库;

p41——Hibernate操作都使用HibernateSessionFactory类完成:

①HibernateSessionFactory.getSession().方法;

②HibernateSessionFactory.getSession().beginTransaction().commit();

③HibernateSessionFactory.closeSession();

p50——Session接口负责数据基本CRUD操作;

①保存vo类,且返回增加的最后一条数据的ID:*.getSession().save(vo):

②只提供ID查询,返回Object对象:

a、*.getSession().get(Member.class,1);

b、*.getSession().load(Member.class,1);

get与load区别:当查询ID不纯在时,get不会发生异常,load会发生异常;

③更新,无返回值,实际开发不用:*.getSession().update(vo);

④删除,,无返回值,实际开发不用:*.getSession().delete(vo);

Query接口查询:

①hql语句:"FROM News AS n",注意

a、其中News为pojo类名称而不是表名称;

b、其中所有内容必须起别名,并且不能省略as;

②创建Query接口对象query:Query query = HibernateSessionFactory.getSession().createQuery(hql);

③部分字段查询返回的不是pojo类,可以设置格式解决:query.setResultTransformer(new AliasToBeanResultTransformer(Member.class));

④Query接口中主要方法:

a、参数设置:query.setParameter(0,"a");

b、分页处理:

设置起始行:query.setFirstResult((currentPage-1)*lineSize);

设置每页最大行数:query.setMaxResults(lineSize);

b、返回唯一查询结果:query.uniqueResult();

c、返回所有查询结果:query.list();

d、执行更新(增,删,改),返回更新行数:query.executeUpdate();

基于对象查询模式:Cretiria

①创建criteria对象:HibernateSessionFactory.getSession().createCriteria(Member.class);

②Criteria接口主要方法:

a、查询全部:criteria.list();

b、IN查询:criteria.add(Restrictions.in("属性名称","集合"));

p73——

①Session中两个查询方法的区别必须清楚;

②Query接口的所有查询操作必须重点掌握;

③Query接口的更新操作必须熟练掌握;

④Cretiria重点看查询全部和in查询;

p76——Annotation注解;

p81——Hibernate对象状态

①瞬时态:对象保存在内存中,但是没保存在数据库中,可能被回收;

②持久态:内存中的对象保存到数据库之中,且Session没有关闭;持久态最大特点:内存中对象改变,数据库中数据也随之改变;

③游离态:内存中对象保存到数据库之中,但是Session关闭了,内存中对象可能被回收;

p88——缓存

①一级缓存(Session缓存):持久态状态下就是一级缓存;

②二级缓存(SessionFactory缓存):在Session之间进行数据共享;

p93:Hibernate进行数据批处理,需要注意哪些问题?

答:Hibernate之中一级缓存永远存在,即,如果使用了save()方法,那么对象信息将保存到session关闭,如果数据量过大,程序可能出现问题;可以使用Session接口中的flush()方法和clear()方法进行缓存清除;

p100——锁机制

不同Session同时更新同一数据,为了数据可以同步进行操作,使用锁的概念;

悲观锁:使用数据库中的锁,锁定数据;

乐观锁:通过业务逻辑,锁定数据;

p107——Hibernate转换器

①创建转换器:定义类实现UserType接口;

②@Type()注释pojo类,实现pojo类中属性转型后再保存到数据库中;

p118——实体粒度划分

合成设计模式:除了主键属性以外,其他属性再分类封装到新的对象之中;

p161——开发应该回避的几个问题:多表查询,1+n次查询;

p164——SUBCLASS继承形式:将具有继承关系的结构定义在一张表中,使用一个字段type作为区分符;

p171——三种继承结构特点:类继承结构相同,表继承结构不同,其中SUBCLASS继承结构表中包含所有字段,并包含type字段作为不同子类的区分符;

p173——Hibernate数据关联技术

p174—— 一对一:一个主表对一个子表,子表的主键与主表主键相同,且同时作为外键;

p174——一对一关系中pojo类生成:同时选择主表与子表生成pojo类;

p178——级联操作(主控方表改变时,关联方的表也自动改变):cascade=“all”;

p180——update(Session中方法)属于全部更新,实际开发中不可以使用;

p182——级联数据处理模式:

①fetch="join":使用多表查询,性能低;

②fetch="select":使用单表查询;

p189——一对多:子表中外键连接主表;

p189——一对多关系默认生成,不用同时选中两张表;

p193——控制反转:inverse="true",相当于关联方帮助主控方进行数据维护,而不是只由主控方维护;

p198——延迟加载一定要使用(一对多关系中):lazy="true";如果取消延迟加载,查询“一”方时,所有“多”方都会查出来,造成1+n次查询,多方不会默认加载,只有在调用与多方有关的数据时才会进行数据加载;

多对多

p201——多对多首先要确定主控方;

p201——主控方与关联方

关联方配置控制反转

①关联方更新时不用考虑主控方;

②主控方更新时要考虑关联方;

p203——多对多pojo类生成:同时选中三个表生成pojo类,先选中的为主控方;

p205——中间表

①只由外键组成,不包含其他字段;

②不生成pojo类;

p206——多对多中控制反转:inverse="true"表示控制权交给另一方,默认情况下先选哪个表,哪一方就作为主控方;

p207——通过主控方调用函数,否则会发生错误;

p208——更新

①update为级联更新,自动支持关系表的更新;

②Query为单表更新,只能更新主控方自己,关联方要自己编写sql语句进行更新,麻烦;

p212——延迟加载

p211——get查询:*.getSession.get(Role.class,4),会产生join的多表查询;

p212——SQL原生子查询避免join多表查询:

①String sql = "";

②创建sql查询对象query:HibernateSessionFactory.getSession().createSQLQuery(sql);

③query接口方法与原来相同;

 

 

 

 

 

 

[展开全文]
gouyan123 · 2017-03-30 · 该任务已被删除 0

授课教师

讲师

课程特色

视频(54)
文档(22)
图文(2)

学员动态

Drop 加入学习
妥了 加入学习
xiepeng 加入学习
charmyCode 加入学习
luojianglai 加入学习