Hibernate概况

持久化对象的三种状态

  • 瞬时态

    由new命令创建,开辟内存空间的对象,不存在持久化标记OID(相当于主键值),尚未与Hibernate session 关联,在数据库也没有记录,失去引用后被jvm回收。瞬时状态的对象在内存中是孤立存在的,与数据库中的数据无关联,仅是一个信息携带的载体

  • 持久态

    持久态的对象存在持久化标识OID,加入到session缓存中,并且相关联的session并没有关闭,在数据中有对应的记录,每条记录只对应唯一的持久化对象,需注意的是持久态对象在事务还未提交之前变为持久态的。

    持久态对象可以动态更新数据库

  • 脱管态

    脱管态对象无法直接获取,由其他状态对象转换来,当某个持久化状态的实例与session关联被关闭时,就变成了托管态。托管态对象存在持久化标识OID,并且人与数据库的数据关联,只是失去了与当前session的关联,脱管状态对象发生改变时,Hibernate不能检测到。

[图片上传失败...(image-d5d29-1510802804288)]

备注:

瞬 -- 脱:为瞬间态设置持久化标识OID

脱-- 瞬:为瞬间态设置持久化标识OID设置为null

hibernate一级缓存(Session缓存)

Hibernate向一级缓存放入数据时,同时复制一份数据到hibernate快照中,当时用commit()方法提交事务时,会清理session一级缓存,这时会使用oid判断一级缓存中的对象和快照中的对象是否一致,否则执行update语句,将缓存内的内容同步到数据库,并更新快照

事务的特性

原子性,一致性,隔离性,持久性

管理session对象的方法

  • session对象的生命周期与本地线程绑定(thread)

    SessionFactory.getCurrentSession();这个方法必须配合hibernate.cfg.xml配置(下方)

  • session对象的生命周期与JTA事务绑定(jta)

  • Hibernate委托程序管理Session对象的生命周期(managed)

    hibernate.cfg.xml配置

    <property name="hibernate.current_session_context_class">thread</property>

表的关系

  • 一对一
    • 唯一外键对应,假设一对一的任意一方为多,在多的一方创建外键指向一的一方的主键,然后将外键设置成唯一
    • 主键对应,一方的主键作为另一方的主键
  • 一对多
    • 在多的一方创建外键,指向一的一方的主键
  • 多对多
    • 创建一个中间表,中间表至少有两个字段最为外键分别指向多对多双方的主键

级联保存及更新

  • 用来简化代码书写

    //ALL:增删改都可以级联(cascade)
    //save-update:增加和更新可以级联
    //delete:删除可以级联
    //如果不设置,则增删改都不可以级联
    //注意:查询例外,不受级联权限的控制,默认级联
    @Cascade(value=CascadeType.ALL)

  • 级联操作

    当定义方执行保存,更新,删除操作时,其关联对象也执行相应的操作

关系维护

  • 为了减少sql语句的条数,提高执行效率

  • inverse属性配置关系是否维护,强调外键维护权

    ​true:放弃外键维护权

    ​false:不放弃外键维护权(默认值)

  • 注解通过mappedBy来实现此功能

  • 当双向维护关系时,才需要强调外键维护权

    一对多维护:一的一方放弃维护,多的一方不放弃维护。如果一方放弃维护关系,则可以省略相关维护的代码

    多对多维护:如果进行了双向维护关系,就必须有一方放弃外键维护权,一般由被动方放弃

查询方式

  • Query

    多表查询,但不复杂时使用,可使用?占位符及:命名占位符

  • Criteria

    单表条件查询

  • SQLQuery

    复杂的业务查询

检索方式

  • 对象图导航检索

    根据已加载的对象导航到他的关联对象

     Session session = HibernateUtils.getCurrentSession();
     Transaction transaction = session.beginTransaction();
     LinkmanEntity linkmanEntity = session.get(LinkmanEntity.class, 4);
     CustomerEntity customerEntity = linkmanEntity.getCstCustomerByLkmCustId();
     transaction.commit();
    
  • OID检索方式

    用session的get()或load()方法加载某条记录对应的对象

    LinkmanEntity linkmanEntity = session.get(LinkmanEntity.class, 4);
    LinkmanEntity linkmanEntity = session.load(LinkmanEntity.class, 4);
    
  • HQL检索

    面向对象的查询语言,它与SQL查询语言有些类似,但它使用的是类,对象,属性概念,没有表和字段的概念,在Hibernate提供的各种检索方式中,HQL是官方推荐的查询语言,也是最广泛的一种检索方式。功能如下:

    • 在查询语句中设定各种查询条件

    • 支持投影查询,即检索出对象部分属性

    • 支持分页查询

    • 支持分组查询,使用group by和having关键字

    • 提供内置聚合函数,如sum(),min()和max()

    • 能够调用用户定义的SQL函数

    • 支持子查询即嵌套查询

    • 支持动态绑定参数

    • 多表查询

      • 迫切内链接与内链接区别在于封装数据的形式

        内链接会将两个表的数据封装到两个实体类中,执行查询会返回list<Object[]>对象,Object[]内容是两个表的实体

        Query query = session.createQuery("select c.custId,c.custLinkman,l.lkmName  from Customer c inner join c.linkmans l");
        List<Object[]> customerList = query.list();
        

        迫切内链接则会仅返回一个实体类,另一个数据库相关的实体类会封装到返回的实体类中,但是迫切内链接封装后会出现重复数据的问题,所以要进行去重

  • BQC检索

    是Hibernate提供的另一种检索对象的方式,主要由Criteria接口,Criterion接口和Expression类组成。Criteria接口是Hibernate API中的一个查询接口,需要由session来创建。Criterion是查询条件,在Criteria中提供了add(Criterion criterion)方法来添加查询条件。

  • SQL检索

多表查询

  • 连接查询

    • 交叉连接

      交叉连接返回的是被连接的两个表中所有数据行的卡迪尔积,也就是返回第一个表中符合查询条件的数据行数乘以第二个表中符合插叙吧条件的数据行数

      select * from 表1 cross join 表2

      select * from 表1,表2

    • 内连接

      内连接又称简单连接或自然连接,是一种常见的连接查询。内链接使用比较运算符对两个表中的数据进行比较,并列出与连接条件匹配的数据行,组合成新的记录,也就是说在内连接查询中,只有满足条件的记录才能出现在查询结果中。

      select 查询字段 from 表1 [inner] join 表2 on 表1.关系字段=表2.关系字段

      inner join用于连接两个表,on用来指定连接条件,其中inner可以省略

      • 隐式内连接

        我们看不到 inner join的关键字,而使用where关键字来替代

        select * from 表1,表2 where 表1.关系字段 = 表2.关系字段

      • 显示内连接

        select * from 表1 inner join 表2 on 表1.关系字段=表2.关系字段

        select * from 表1 join 表2 on 表1.关系字段=表2.关系字段

    • 外连接

      返回的查询结果中不仅包含符合条件的数据,而且还包括左表(左连接或左外连接)、右表(右连接或右外连接)或两个表(全外连接)中所有的数据,此时就需要使用外连接查询,外连接分为左连接和右连接。

      select 所查字段 from 表1 left|right [outer] join 表2 on 表1.关系字段=表2.关系字段 where 条件

      left join,right join关键词左边的表叫做左表,右边的表叫做右表,使用左连接和右连接查询时,查询结果不一致

      • left join(左连接):返回符合连接条件的查询记录及左表中剩余的所有记录

        select * from 表1 left outer join 表2 on 表1.关系字段=表2.关系字段 where 条件

        select * from 表1 left join 表2 on 表1.关系字段=表2.关系字段 where 条件

      • right join(右连接):返回符合连接条件的查询记录及右表中剩余的所有记录

        select * from 表1 right outer join 表2 on 表1.关系字段=表2.关系字段 where 条件

        select * from 表1 right join 表2 on 表1.关系字段=表2.关系字段 where 条件

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 157,298评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,701评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 107,078评论 0 237
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,687评论 0 202
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,018评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,410评论 1 211
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,729评论 2 310
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,412评论 0 194
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,124评论 1 239
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,379评论 2 242
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,903评论 1 257
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,268评论 2 251
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,894评论 3 233
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,014评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,770评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,435评论 2 269
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,312评论 2 260

推荐阅读更多精彩内容

  • 本文中我们介绍并比较两种最流行的开源持久框架:iBATIS和Hibernate,我们还会讨论到Java Persi...
    大同若鱼阅读 4,257评论 4 27
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,292评论 18 399
  • Hibernate: 一个持久化框架 一个ORM框架 加载:根据特定的OID,把一个对象从数据库加载到内存中OID...
    JHMichael阅读 1,931评论 0 27
  • 一. Java基础部分.................................................
    wy_sure阅读 3,731评论 0 11
  • 二十多年了,自十二岁离家至今,对家乡的记忆越来越淡,村里的人都住上了新房子,把房子盖到了田里,老房子大都成了...
    國國2580阅读 403评论 0 0