《2022年hibernate自我总结的部分知识点 .pdf》由会员分享,可在线阅读,更多相关《2022年hibernate自我总结的部分知识点 .pdf(10页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、Hibernate基本知识点Hibernate 介绍Hibernate 的 Hello World Xml 配置形式Annotation 配置形式Hibernate 原理的模拟,重点讲思路,代码不全部实现Hibernate 的基本配置Hibernate 常用类介绍与对象三种状态Hibernate 数据库连接池配置Hibernate 关系映射一对一一对多多对多Hibernate 关系映射的增删改查Hibernate 查询( HQL语句的使用)Hibernate 条件查询( Criteria Queries)1. Hibernate 介绍1)参考我画的hibernate 结构图,结合官方文档结构图
2、去理解2)是一个对象关系映射框架,对jdbc 进行了轻量级的封装,可以让开发者以面OOP编程思维去持久化数据3)持久层框架。 。 。 。ORM 框架2. Hibernate 的 Hello World 1)xml 配置形式i.新建 java 项目 hibernate01 ii.引入 hibernate4 的相关包iii.引入 oracle 驱动包,建立student 表iv.新建 hibernate 配置文件 hibernate.cfg.xml a)从官方文档中copy 样例b)修改相应的数据库连接,修改数据库方言v.新建实体类Student vi.新建实体类Student 对应的映射文件vi
3、i.将映射文件添加到hibernate.cfg.xml 中viii.编写测试类,注意 hibernate3 和 hibernte4 的写法不同i.Hibernate3 :参考文档i.Hibernate4 :1.Configuration cfg = new Configuration().configure(); 2.ServiceRegistry sr = new ServiceRegistryBuilder().applySettings(cfg.getProperties().buildServiceRegistry(); 3.cfg.buildSessionFactory(sr) 2)
4、Annotation 配置形式名师归纳总结 精品学习资料 - - - - - - - - - - - - - - -精心整理归纳 精选学习资料 - - - - - - - - - - - - - - - 第 1 页,共 10 页 - - - - - - - - - i.建立 teacher 表ii.新建 Teacher实体类iii.在 Teacher类上加上注解i.在类名上 Entity,在主键属性的get 方法上加 ID ii.GeneratedValue 指定主键的生成策略,根据数据库自动判断iv.在 hibernate.cfg.xml 中添加 Teacher类实体映射i. ,注意包名之间
5、是点号v.编写测试类进行测试注意 Hibernate3 xml 配置和注解配置的区别:注解: Configuration cfg = new AnnotationConfiguration(); cfg.configure().bulidSessionFactory(); 3. Hibernate 原理模拟 (了解)1)思路:客户新建了一个实体对象例如Student ,调用session.save()方法,就帮我们把对象保存到了数据库中去,Hibernate框架中肯定是对这一块进行了封装,帮我们构造了sql 语句。2)模拟步骤:(1)模拟 sql 语句的创建(2)直接通过 jdbc 获取 co
6、nnection (3)模拟sql 语句参数的注入,重点关注如何通过反射得到实体类属性的返回值。(4)进行模拟测试4. Hibernate 基本配置 (重点)1)配置 hibernate.cfg.xml: hbm2ddl.auto a)validate:加载hibernate 时验证数据库表结构,例如实体类某个属性的类型和表里列的类型不一致时,加载Hibernate 会报错;或者实体类的属性个数比表里的列数多一个也会报错。b)create:每次加载hibernate 重新创建表结构,数据会丢失c)create-drop :加载 hibernate 创建表, session 关闭时删除表结构d)
7、update:加载 hibernate 时自动更新数据库表结构2)配置 hibernate 日志环境 (了解)i.hibernate4 采用的 SLF4J(Simple Logging Fa?ade for Java),已集成到框架里ii.hibernate3 需要手动添加日志jia 包3)hibernate.cfg.xml:show_sql 、 format_sql 4)注解和 xml 文件详细1)表名和类名不一致2)字段名和属性名一致,注解默认是Basic,xml形式参考文档3)字段名和属性名不一致,注解:在方法上加上Column;xml:在 property中加上 column 属性4)
8、 transient ,注解为transient 的属性都不被持久化,参考5.1.4.1 5) hibernate 基本数据类型,参考docuemntation/manual/index.html/5.2 名师归纳总结 精品学习资料 - - - - - - - - - - - - - - -精心整理归纳 精选学习资料 - - - - - - - - - - - - - - - 第 2 页,共 10 页 - - - - - - - - - 5. Hibernate 主键生成策略 (重点)常见的主键生成策略有increment 、identity 、sequence、 uuid。具体参见5.1.2
9、.2.1 a)increment :在内存中生成主键,每次增量为1,不建议在集群中使用。b)identity: 自动增长,适用于DB2,Mysql,Sql server,Sybase 。c)sequence:适用于 Oracle、 DB2。d)uuid:主键类型为String,通过算法生成32 位的字符串,适用所有数据库。e)native:由 hibernate 根据数据库选择identity 、sequence 维护主键。注解:GeneratedValue(strategy=GenerationType.AUTO) ,strategy 属性指定生成策略。GenericGenerator(na
10、me=system-increment,strategy=increment)自定义主键SequenceGenerator(name=seq_gen,sequenceName=seq_teacher,initialValue=1,allocationSize=1)指定序列的属性XML: xml 文件中这样使用: xml 指定序列的名字seq_student 注意各个主键生成策略的特点及使用范围Uuid 注解: GenericGenerator(name=idGenerator,strategy=uuid) GeneratedValue(generator=idGenerator) 当使用 se
11、quence 时,数据库生成同一个sequence。需要自定义sequence 名字,请参考5.1.2.2 Hibernate 常用类介绍与对象三种状态(重点)1)Configuration.configure(),默 认 读 取hibernate.cfg.xml,可 以 重 载configure()方法,如configure(“hibernate_.cfg.xml”) 2)SessionFactory.openSession()与SessionFactory.getCurrentSession(),openSession()重新开一个session,getCurrentSession()为
12、如 果 上 下 文 中 有session , 就 用 原 来 的session, 否则就新建一个session 3)对象的三种状态:Transient,Persisent, Detached,参考 11.1 1.Transient:使用构造方法构造出来的对象,没有和hibernate session关联2.Persisent:在数据库中存在记录,在session范围内3.Detached:已被持久化,但session关闭4)三种状态如何区分1.有没有主键id, 没有主键id 就是 Transient状态2.有主键 id ,在 session缓存中也有就是Persisent状态3.有主键 id
13、,在 session缓存中没有就是Detached 状态5)save() 方法,参考hibernate API 6)delete()方法,参考hibernate API 7)load() 与 get() 方法,参考文档11.2 及 API 1.load() 方法加载指定id 对应的实体, 当获取实体的某个属性时才发出sql语句;获取实体的属性必须在commit() 方法之前,因为获取的实体是放在 session缓存中的名师归纳总结 精品学习资料 - - - - - - - - - - - - - - -精心整理归纳 精选学习资料 - - - - - - - - - - - - - - - 第
14、3 页,共 10 页 - - - - - - - - - 2.get() 方法根据指定查询对应的实体3.load() 与 get() 的异同点a)均是先从缓存中开始寻找,如果没有再去数据库中查询b)load 方法是在获取对象的某个属性时才发出发出sql 语句,get 方法是在调用get() 方法时就发出sql 语句c)如果使用load ()方法,必须在commit()方法之前d)如 果 查 询 一 条id不 存 在 的 记 录 , load( ) 方 法 报org.hibernate.ObjectNotFoundException, get( ) 方 法 报java.lang.NullPoin
15、terException 8)update 9) SaveOrUpdate 方法6. Hibernate 数据库连接池配置 (重点掌握怎么配置)1)数据库连接池的解释参考我画的连接池结构图2)Hibernate可使用的数据库连接池C3P0 、Proxool 、 JNDI, 重点掌握C3P0,其余只做了解3)C3P0的配置a)添加 C3P0所需的 jar包b)注释掉 hibernate.cfg.xml的 connection.pool_size属性c)在 hibernate.cfg.xml中添加 C3P0配置,参考文档3.3 ,其余保持不变7. Hibernate 关系映射 (重点)1)一对一(
16、 one-to-one )a)单向( unidirectional)i.annotation 1.OneToOne 2.如果需要改变映射字段的名字,加上JoinColumn(name=” ”) ii.xml 1. b)双向( bidirectional)i.annotation 1.在需要做关系映射的实体上均加上OneToOne 2.若 要 取 消 其 中 一 方 的 外 键 , 这 样 写 OneToOne(mappedBy= ” ”)ii.Xml 1.在另外一方加上 2)多对一( many-to-one )a)单向( unidirectional)i.annotation 1.在多的一方加
17、上ManyToOne 名师归纳总结 精品学习资料 - - - - - - - - - - - - - - -精心整理归纳 精选学习资料 - - - - - - - - - - - - - - - 第 4 页,共 10 页 - - - - - - - - - ii.Xml 1.在多的一方加上 b)双向( bidirectional)i.annotataion 1.在多的一方加上ManyToOne 2.在一的一方加上OneToMany JoinColumn(name=” ), 此时会生成两个外键3.若不想生成两个外键,在一的一方去掉JoinColumn,在一的一方加上OneToMany(mappe
18、dBy=” ), 引号的内容为多的一方中主表的属性ii.Xml 1.参考帮助文档8.4.1 3)一对多( one-to-many )a)单向( unidirectional)i.Annotation 1.在一的一方加上多的一方的Set 集合2.在一的一方加上OneToMany, 会生成中间表3.若不想生成中间表,要加上JoinColumn(name=” ),name的值为多的一方外键的列名ii.xml 1.在一的一方加上 b)双向( bidirectional)i.同多对一的双向关联4)多对多( many-to-many )a)单向( unidirectional)i.annotation 1
19、.只在任何一方加上 2.若想改变中间表的名字或列名,这样写ManyToManyJoinTable(name= r_a, joinColumns=JoinColumn(name= r_id), inverseJoinColumns=JoinColumn(name= a_id ) ) 具体参考java ee api ii.xml 1.具体参考文档8.4.3 b)双向( bidirectional)i.Annotation 1.双方均加上ManyToMany,会生成两张中间表名师归纳总结 精品学习资料 - - - - - - - - - - - - - - -精心整理归纳 精选学习资料 - - -
20、- - - - - - - - - - - - 第 5 页,共 10 页 - - - - - - - - - 2.加上 mappedBy可取消多余的中间表ii.Xml 1.参考文档8.5.3 8. Hibernate 关系映射的增删改查( CRUD ) (重点)(a)新增1) 单向多对一1.设置对象之间的关系,保存两个对象。2.设置对象之间的关系,在多的一方添加级联,保存从表对象。2)双向多对一1.设置对象之间的关系,在多的一方添加级联,保存所有从表对象。2.设置对象(双向)之间的关系,在一的一方设置级联,保存主表对象。(b)查询1) 单向多对一1.查询多的一方,默认也把一的一方查出来了。2.
21、设置多的一方的fetch为 lazy ,就不会查出一的一方的数据。3.查询一的一方,不会把多的一方的数据查出来。2) 双向多对一1.设置多的一方的fetch为 eager ,可查出的多的一方的数据。3) xml fetch=select:简单查询(单表)fetch=join:连接查询cascade:all/save-update (c)修改1) 在同一事物内,可直接修改持久态对象的属性,不用保存。2) 在不同事物内,由持久态到游离态,级联更新。(d)删除1) 删除一条不存在的记录需要做判断2) 级联删除1.解除关系2.hql 语句9. HQL(Hibernate Query Language)
22、 (a)Hibernate推荐的查询方法,是一种面向对象的查询方法。(b)from 语句(c)关联查询(d)select (e)条件查询(f )insert (g)delete (h)update (i )怎样执行 hql 语句:1) session.createQuery().list() 2) session.createQuery().iterate() 名师归纳总结 精品学习资料 - - - - - - - - - - - - - - -精心整理归纳 精选学习资料 - - - - - - - - - - - - - - - 第 6 页,共 10 页 - - - - - - - - -
23、3) session.executeUpate(); 请参考文档16 章10.Criteria Queries 1)查询所有Criteria crit = sess.createCriteria(Cat.class); crit.setMaxResults(50); List cats = crit.list(); 2)条件查询List cats = sess.createCriteria(Cat.class) .add( Restrictions.like(name, Fritz%) ) .add( Restrictions.between(weight, minWeight, maxWei
24、ght) ) .list(); 关于条件参考:Restrictions里的方法3)分页查询(请参考文档11.4 及 17)Query q = sess.createQuery(from DomesticCat cat); q.setFirstResult(20); q.setMaxResults(10); List cats = q.list(); 4)参数绑定/named parameter (preferred) Query q = sess.createQuery(from DomesticCat cat where cat.name = :name); q.setString(name
25、, Fritz); Iterator cats = q.iterate(); /positional parameter Query q = sess.createQuery(from DomesticCat cat where cat.name = ?); q.setString(0, Izi); Iterator cats = q.iterate(); /named parameter list List names = new ArrayList(); names.add(Izi); names.add(Fritz); Query q = sess.createQuery(from Do
26、mesticCat cat where cat.name in (:namesList); q.setParameterList(namesList, names); List cats = q.list(); 11.Hibernate 一级缓存、二级缓存、查询缓存名师归纳总结 精品学习资料 - - - - - - - - - - - - - - -精心整理归纳 精选学习资料 - - - - - - - - - - - - - - - 第 7 页,共 10 页 - - - - - - - - - (a)一级缓存: session级别的缓存(b)二级缓存 SessionFactory级别的缓存1
27、) 将 hibernate发行包 liboptionalehcache下的包拷贝到工程里2) 在 hibernate.cfg.xml中打开二级缓存1.注释掉 属性2.添加true 3.添加缓存提供商提供的缓存实现类org.hibernate.cache.ehcache.EhCacheRegionFactory 4.在要缓存的类上添加Cache 注解,或在class节点下添加cache 节点5.测试(c)查询缓存1) 开启查询缓存1.true 2.setCacheable(true)添加缓存结果集3.与 session无关,缓存的是普通属性,对于对象只缓存id ,query.list()不使用查
28、询缓存。12.事务隔离级别(a)事物并发容易出现的问题第一类丢失更新(Lost Update )时间取款事务A 存款事务B T1 开始事务T2 开始事务T3 查询账户余额为1000 元T4 查询账户余额为1000 元T5 汇入 100 元, 余额为 1100元T6 提交事物T7 取出 100 元,余额 900 元T7 撤销事物,T9 余额恢复为1000 元(丢失更新)脏读( dirty read)时间取款事务A 存款事务B T1 开始事务T2 开始事务T3 查询账户余额为1000 元T4 汇入账户100 元把余额改为 1100 元T5 查询账户余额为1100 元(读取脏数据)名师归纳总结 精品
29、学习资料 - - - - - - - - - - - - - - -精心整理归纳 精选学习资料 - - - - - - - - - - - - - - - 第 8 页,共 10 页 - - - - - - - - - T6 回滚T7 取款 1100 元T8 提交事务失败不可重复读( Non-repeatable Reads)时间取款事务A 存款事务B T1 开始事务T2 查询账户余额为1000 元开始事务T3 汇入账户100 元把余额改为 1100 元T4 提交事务T5 查询账户余额为1100 元T6 提交事务第二类丢失更新(second lost updates)时间取款事务A 存款事务B
30、T1 开始事务T2 开始事务T3 查询账户余额为1000 元T4 查询账户余额为1000 元T5 取出 100 元,余额为900元T6 提交事物T7 存入 100 元,余额1100元T7 提交事物,T9 余额恢复为1100 元(丢失更新)幻读( phantom read )时间事务 A 事务 B T1 开始事务T2 开始事务T3 查询学生为10 人T4 插入一个学生T5 查询学生为11 人T6 提交事物T7 提交事物(b)五种隔离级别1.TRANSACTION_NONE 2.TRANSACTION_READ_COMMITTED 3.TRANSACTION_READ_UNCOMMITTED 4.
31、TRANSACTION_REPEATABLE_READ 5.TRANSACTION_SERIALIZABLE 名师归纳总结 精品学习资料 - - - - - - - - - - - - - - -精心整理归纳 精选学习资料 - - - - - - - - - - - - - - - 第 9 页,共 10 页 - - - - - - - - - (c)悲观锁session.get(Employee.class, 3,LockOptions.UPGRADE); (d)乐观锁在表中加version字段引入 C3P0数据库连接池之后报错:Disabling contextual LOB creation as createClob() method threw error : java.lang.reflect.InvocationTargetException 可在 hibernate.cfg.xml中加上false 名师归纳总结 精品学习资料 - - - - - - - - - - - - - - -精心整理归纳 精选学习资料 - - - - - - - - - - - - - - - 第 10 页,共 10 页 - - - - - - - - -