hibernate自我总结的部分知识点.doc_第1页
hibernate自我总结的部分知识点.doc_第2页
hibernate自我总结的部分知识点.doc_第3页
hibernate自我总结的部分知识点.doc_第4页
hibernate自我总结的部分知识点.doc_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Hibernate基本知识点Hibernate介绍Hibernate的Hello WorldXml配置形式Annotation配置形式Hibernate原理的模拟,重点讲思路,代码不全部实现Hibernate的基本配置Hibernate常用类介绍与对象三种状态Hibernate数据库连接池配置Hibernate关系映射一对一一对多多对多Hibernate关系映射的增删改查Hibernate查询(HQL语句的使用)Hibernate条件查询(Criteria Queries)1. Hibernate介绍1) 参考我画的hibernate结构图,结合官方文档结构图去理解2) 是一个对象关系映射框架,对jdbc进行了轻量级的封装,可以让开发者以面OOP编程思维去持久化数据3) 持久层框架。ORM框架2. Hibernate的Hello World1) xml配置形式i. 新建java项目hibernate01ii. 引入hibernate4的相关包iii. 引入oracle驱动包,建立student表iv. 新建hibernate配置文件hibernate.cfg.xmla) 从官方文档中copy样例b) 修改相应的数据库连接,修改数据库方言v. 新建实体类Studentvi. 新建实体类Student对应的映射文件vii. 将映射文件添加到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) Annotation配置形式i. 建立teacher表ii. 新建Teacher实体类iii. 在Teacher类上加上注解i. 在类名上Entity,在主键属性的get方法上加IDii. GeneratedValue指定主键的生成策略,根据数据库自动判断iv. 在hibernate.cfg.xml中添加Teacher类实体映射i. ,注意包名之间是点号v. 编写测试类进行测试注意Hibernate3 xml配置和注解配置的区别:注解:Configuration cfg = new AnnotationConfiguration();cfg.configure().bulidSessionFactory();3. Hibernate原理模拟(了解)1) 思路:客户新建了一个实体对象例如Student,调用session.save()方法,就帮我们把对象保存到了数据库中去,Hibernate框架中肯定是对这一块进行了封装,帮我们构造了sql语句。2) 模拟步骤:(1)模拟sql语句的创建(2)直接通过jdbc获取connection(3)模拟sql语句参数的注入,重点关注如何通过反射得到实体类属性的返回值。(4)进行模拟测试4. Hibernate基本配置(重点)1) 配置hibernate.cfg.xml: hbm2ddl.autoa) validate:加载hibernate时验证数据库表结构,例如实体类某个属性的类型和表里列的类型不一致时,加载Hibernate会报错;或者实体类的属性个数比表里的列数多一个也会报错。b) create:每次加载hibernate重新创建表结构,数据会丢失c) create-drop:加载hibernate创建表,session关闭时删除表结构d) update:加载hibernate时自动更新数据库表结构2) 配置hibernate日志环境(了解)i. hibernate4采用的SLF4J(Simple Logging Faade for Java),已集成到框架里ii. hibernate3需要手动添加日志jia包3) hibernate.cfg.xml:show_sql、format_sql4) 注解和xml文件详细1) 表名和类名不一致2) 字段名和属性名一致,注解默认是Basic,xml形式参考文档3) 字段名和属性名不一致,注解:在方法上加上Column;xml:在property中加上column属性4)transient,注解为transient的属性都不被持久化,参考5)hibernate基本数据类型,参考docuemntation/manual/index.html/5.25. Hibernate主键生成策略(重点)常见的主键生成策略有increment、identity、sequence、uuid。具体参见.1a) 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(name=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)当使用sequence时,数据库生成同一个sequence。需要自定义sequence名字,请参考Hibernate常用类介绍与对象三种状态(重点)1) Configuration.configure(),默认读取hibernate.cfg.xml,可以重载configure()方法,如configure(“hibernate_.cfg.xml”)2) SessionFactory.openSession()与SessionFactory.getCurrentSession(),openSession()重新开一个session,getCurrentSession()为如果上下文中有session,就用原来的session,否则就新建一个session3) 对象的三种状态:Transient,Persisent,Detached,参考11.11. Transient:使用构造方法构造出来的对象,没有和hibernate session关联2. Persisent:在数据库中存在记录,在session范围内3. Detached:已被持久化,但session关闭4) 三种状态如何区分1. 有没有主键id,没有主键id就是Transient状态2. 有主键id,在session缓存中也有就是Persisent状态3. 有主键id,在session缓存中没有就是Detached状态5) save()方法,参考hibernate API6) delete()方法,参考hibernate API7) load()与get()方法,参考文档11.2及API1. load()方法加载指定id对应的实体,当获取实体的某个属性时才发出sql语句;获取实体的属性必须在commit()方法之前,因为获取的实体是放在session缓存中的2. get()方法根据指定查询对应的实体3. load()与get()的异同点a) 均是先从缓存中开始寻找,如果没有再去数据库中查询b) load方法是在获取对象的某个属性时才发出发出sql语句,get方法是在调用get()方法时就发出sql语句c) 如果使用load()方法,必须在commit()方法之前d) 如果查询一条id不存在的记录,load()方法报org.hibernate.ObjectNotFoundException,get()方法报java.lang.NullPointerException8)update9)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) 一对一(one-to-one)a) 单向(unidirectional)i. annotation1. OneToOne2. 如果需要改变映射字段的名字,加上JoinColumn(name=”)ii. xml1. b) 双向(bidirectional)i. annotation1. 在需要做关系映射的实体上均加上OneToOne2. 若要取消其中一方的外键,这样写OneToOne(mappedBy=”)ii. Xml1. 在另外一方加上2) 多对一(many-to-one)a) 单向(unidirectional)i. annotation1. 在多的一方加上ManyToOneii. Xml1. 在多的一方加上b) 双向(bidirectional)i. annotataion1. 在多的一方加上ManyToOne2. 在一的一方加上OneToMany JoinColumn(name=”),此时会生成两个外键3. 若不想生成两个外键,在一的一方去掉JoinColumn,在一的一方加上OneToMany(mappedBy=”),引号的内容为多的一方中主表的属性ii. Xml1. 参考帮助文档8.4.13) 一对多(one-to-many)a) 单向(unidirectional)i. Annotation1. 在一的一方加上多的一方的Set集合2. 在一的一方加上OneToMany,会生成中间表3. 若不想生成中间表,要加上JoinColumn(name=”),name的值为多的一方外键的列名ii. xml1. 在一的一方加上 b) 双向(bidirectional)i. 同多对一的双向关联4) 多对多(many-to-many)a) 单向(unidirectional)i. annotation1. 只在任何一方加上2. 若想改变中间表的名字或列名,这样写ManyToMany JoinTable(name=r_a, joinColumns=JoinColumn(name=r_id), inverseJoinColumns=JoinColumn(name=a_id)具体参考java ee apiii. xml1. 具体参考文档8.4.3b) 双向(bidirectional)i. Annotation1. 双方均加上ManyToMany,会生成两张中间表2. 加上mappedBy可取消多余的中间表ii. Xml1. 参考文档8.5.38. Hibernate关系映射的增删改查(CRUD)(重点)(a) 新增1) 单向多对一1. 设置对象之间的关系,保存两个对象。2. 设置对象之间的关系,在多的一方添加级联,保存从表对象。2) 双向多对一1. 设置对象之间的关系,在多的一方添加级联,保存所有从表对象。2. 设置对象(双向)之间的关系,在一的一方设置级联,保存主表对象。(b) 查询1) 单向多对一1. 查询多的一方,默认也把一的一方查出来了。2. 设置多的一方的fetch为lazy,就不会查出一的一方的数据。3. 查询一的一方,不会把多的一方的数据查出来。2) 双向多对一1. 设置多的一方的fetch为eager,可查出的多的一方的数据。3) xmlfetch=select:简单查询(单表)fetch=join:连接查询cascade:all/save-update(c) 修改1) 在同一事物内,可直接修改持久态对象的属性,不用保存。2) 在不同事物内,由持久态到游离态,级联更新。(d) 删除1) 删除一条不存在的记录需要做判断2) 级联删除1. 解除关系2. hql语句9. HQL(Hibernate Query Language)(a) Hibernate推荐的查询方法,是一种面向对象的查询方法。(b) from语句(c) 关联查询(d) select(e) 条件查询(f) insert(g) delete(h) update(i) 怎样执行hql语句:1) session.createQuery().list()2) session.createQuery().iterate()3) session.executeUpate();请参考文档16章10. Criteria Queries1) 查询所有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, maxWeight) ) .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 = :name);q.setString(name, Fritz);Iterator cats = q.iterate();/positional parameterQuery q = sess.createQuery(from DomesticCat cat where = ?);q.setString(0, Izi);Iterator cats = q.iterate();/named parameter listList names = new ArrayList();names.add(Izi);names.add(Fritz);Query q = sess.createQuery(from DomesticCat cat where in (:namesList);q.setParameterList(namesList, names);List cats = q.list();11. Hibernate一级缓存、二级缓存、查询缓存(a) 一级缓存:session级别的缓存(b) 二级缓存SessionFactory级别的缓存1) 将hibernate发行包liboptionalehcache下的包拷贝到工程里2) 在hibernate.cfg.xml中打开二级缓存1. 注释掉属性2. 添加true3. 添加缓存提供商提供的缓存实现类org.hibernate.cache.ehcache.EhCacheRegionFactory4. 在要缓存的类上添加Cache注解,或在class节点下添加cache节点5. 测试(c) 查询缓存1) 开启查询缓存1. true2. setCacheable(true)添加缓存结果集3. 与session无关,缓存的是普通属性,对于对象只缓存id,query.list()不使用查询缓存。12. 事务隔离级别(a) 事物并发容易出现的问题第一类丢失更新(Lost Update)时间取款事务A存款事务BT1开始事务T2开始事务T3查询账户余额为1000元T4查询账户余额为1000元T5汇入100元,余额为1100元T6提交事物T7取出100元,余额900元T7撤销事物,T9余额恢复为1000元(丢失更新)脏读(dirty read)时间取款事务A存

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论