学习hibernate总结

各位码友大家好,最近学习了开源框架hibernate,真心感觉太有用了,可是鄙人一向资质平平,深层次的还没理解,只盼来日开天眼,一眼看透hibernate,同时也请大家多多的指点指点,闲言少叙,言归正传:

1.为什么有hibernate

先假设没有hibernate和其他类似开源框架会怎么样?我们一遍又一遍的使用jdbc ,造成代码冗余,jdbc是直接面向数据库操作,对象属性和表中的字段之间的转换全都交给代码开发者,效率低下,这你感觉好吗?而hibernate是一个开放源代码的对象关系映射框架,它对jdbc进行了非常轻量级的对象封装,使得java程序员可以随意的使用面向对象编程的思想来操纵数据库。hibernate不仅管理java类到数据库表的映射,还提供数据查询和获取数据的方法,可以大幅减少开发时人工使用sql和jdbc处理数据的时间。

2.创建实体类应注意的问题

为了通过反射机制来实例化类的对象,我们需要提供一个无参的构造器,所有的实体类都要求有无参的构造器,因为Hibernate需要使用Java反射机制来为你创建对象
为实体类实现Java.io.Serializable 接口,以便Hibernate能更好的缓存实体对象。

3.主配置文件的配置与创建:

  • 数据库连接信息
  • 方言以及各种数据库信息
  • 连接池相关配置
  • 映射文件路径

主配置文件代码
4.hibernate映射:

对象和关系数据库之间的映射是用一个xml文档来定义的。

三种映射关系:类与表的映射

属性与主键的映射

属性与普通字段的映射

映射文件的配置与创建:

映射文件代码

关联映射: 

  • many-to-one: many的一端应持有one的一端的对象(引用),映射文件体现多对一,关联操作
<many-to-one name="seeker" class="org.ijob.bean.Seeker">       1
<column name="seeker_id"></column>                 2
</many-to-one>

1、name为属性名,class为“one”端类名
2、外键列列名

  • one-to-many:one的一端应持有many端的对象集合,映射文件体现一对多,关联操作
<set name="resumes" >                                                1
<key column="seeker_id"></key>                           2
<one-to-many class="org.ijob.bean.Resume"/>              3
</set>
1、set集合节点适用于配置一对多关联关系, name属性指定one的一端对应属性名。
2、外键列列名。
3、class属性指定many端的全限定类名。

  • many to many:将多对多转换成两个一对多,为中间表建立实体类及映射文件,两个端点和中间端分别建立双向一对多关联
如果中间表是联合主键:

<composite-id>
<key-many-to-one name=“**” column=“***" class=“***" ></key-many-to-one>
<key-many-to-one name=“**” column=“**" class=“**" ></key-many-to-one>
</composite-id>

主键生成策略

increment:类似于数据表中的自增列,往数据库插入一个新的实体对象时,其标识符(主键)为上一次插入对象的标识符加1。
identity:每次新增对象时,调用数据库本身的“identity”生成器产生标识符。
sequence:每次新增对象时,调用数据库的sequence对象产生标识符。
配置举例:
<generator class="sequence" >
<param name="sequence">sequence_name</param><!--sequence对象的名字 -->
</generator>
这样配置之后,每次往数据库中插入新对象,都调用数据库的“sequence_name”所指定的sequence对象来产生其标识符。
uuid:每次新增对象时,用一个128-bit的UUID算法生成长度为32的字符串类型的标识符。这是本书实际采用的主键生成方式。
assigned:不提供主键自动生成支持,而是让应用程序在save()之前手动为对象分配一个标识符,这是没有<generator>元素时的默认生成策略。

5.数据库操作七步法:

数据库操作代码

6.hibernate主要接口:

  • Configuration
  • Sessionfactory
  • Session
  • Transcation
  • Query

7.hibernate中实体对象三种状态及转换:

瞬时状态(Transient)

持久态(persisent)

游离态(Detached)



new产生的对象—瞬时态
通过save saveOrUpdate方法转换为持久态,通过delete方法可以将对象变回瞬时态
session关闭之后,原有的持久态就变成了游离态,游离态通过系列方法可重新回到持久态,并在事务提交的时候和数据库同步
session的get load方法可直接获得一个持久态对象。


持久态和游离态的共同点在于,都有数据表的一行与之对应,不同的是,持久态在session范围内,而游离态不在session范围内。

8.使用session.fiush()的使用:

session.flush详解

9.hibernate中的延迟加载问题:

hibernate默认启用延迟加载,关联的对象和集合不会随着主体对像的加载而加载,只有在需要的时候才去加载,此时加载的只是关联对象或集合的代理,用时给予初始化。

解决延迟加载的办法:

  • 暂时不关闭session 
  • Hibernate.initialize();//强制初始化关联集合或关联对象
  • HQL中的热抓取fetch join

10.HQL

是一种面向对象的查询语言,其中没有表和字段的概念,只有类、对象和属性的概念 。HQL看上去很像SQL,但是我们不要被语法结构上的相似所迷惑,HQL是非常有意识的被设计为完全面向对象的查询。

  • 得到session
  • hql语句的编写
  • 创建Query对象  Query接口是HQL查询接口
  • 执行查询得到结果

这里只是各个重要知识点的罗列,关于hibernate的内在机制,需在以后的学习工作中慢慢研究,只有深入理解了hibernate内在,才能更好地利用hibernate框架。



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值