持久太对象不存在一级缓存中!
持久太对象不存在一级缓存中!
关键词:
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接口方法与原来相同;