并肩负创立Session对象,并且将数据库表中的字段和涉及映射为目的

 

  1. Hibernate简介

    • Hibernat是3个O中华VM(关系映射)框架,对JDBC访问数据库的操作举办了简化,并且将数据库表中的字段和关系映射为对象,简化了对数据库的操作。
  2. 应用格局

    • 读取并分析配置文件

    • 读取并解析映射新闻,创制SessionFactory

    • 打开Sesssion

    • 开创工作Transation

    • 持久化操作

    • 交付业务

    • 关闭Session

    • 关闭SesstionFactory

  3. 何以要用Hibernate

    • 对JDBC访问数据库的代码做了包装,大大简化了多少访问层繁琐的重复性代码。

    • Hibernate是三个依照JDBC的主流持久化框架,是一个上佳的O瑞鹰M完成。他极大程度的简化DAO层的编码工作

    • hibernate使用Java反射机制,而不是字节码增强程序来落到实处透明性。

    • hibernate的习性尤其好,因为它是个轻量级框架。映射的灵活性很精粹。它协助各样关周详据库,从一对一到多对多的各样复杂关系。

  4. 推迟加载

    • 有类的推移加载和聚集的推迟加载,hibernate三添加了品质,查询对象的时候不是当下发出sql语句而是在真正用到对象的时候才发生sql语句

    • lazy=false 管理是否开启懒加载

    • 目的是用load方法,而集合默许为懒加载

  5. session

    • session是保险数据库连接并且实施查询,更新,删除操作,Session不是线程安全的
  6. update和saveOrUpdate的区别

    • update()方法操作的目标必须是持久化了的靶子。相当于说,若是此目的在数据库中不设有的话,就无法采纳update()方法。

    • saveOrUpdate()方法操作的靶子既能够使持久化了的,也可以使未有持久化的目的。借使是持久化了的指标调用saveOrUpdate()则会
      更新数据库中的对象;如若是未持久化的对象使用此措施,则save到数据库中。

  7. 超级缓存

    • 超级缓存为session内的缓存 生命周期和session注脚周期相同,
  8. 二级缓存

    • 二级缓存是在SessionFactory这几个级别维护的缓存,它亦可因此节省几番数据库调用往返来拉长质量。

    • 坐落二级缓存中的数据应该为不平时转移,保密性底的数码

    • Hibernate框架并未实现二级缓存,是依赖第一方插件来完成的(ehcache)

  9. 询问缓存

    • 查询缓存实际上保存的是sql查询的结果,那样再拓展相同的sql查询就可以之间从缓存中获得结果了。

    • 生命周期:
      数据放到查询缓存中,将会平素留存,直到缓存中的数据被改成,则缓存中的数据流失

    • 根据时间戳来判断数据状态

    • 私下认可关闭,供给安排文件开启,还亟需用query.setCacheable(true);来启动

  10. load和get

    • get查询时先查询超级缓存然后二级缓存然后数据数据库,直接回到实体对象,假设查询不到再次来到null

    • load要是一级缓存查询不到对象会回去叁个代理对象,然后等到确实使用那几个目的的时候才去查询二级和数据库。查询不到抛至极

  11. hibernate的两种情状之间什么转移

    • 当目的由须臾时意况(Transient)壹save()时,就变成了持久化状态;

    • Session 一Close()了,它的缓存也都关门了,整个Session也就失效了,那年,那么些目的变成了游离状态(Detached),但数据库中或然存在的。

    • 当游离状态(Detached)update()时,又变成了持久状态(Persistent)。

    • 当持久状态(Persistent)delete()时,又变成了弹指间意况(Transient),
      此时,数据库中未有与之相应的笔录。

  12. hibernate里面的sorted collection 和ordered collection有怎么着界别

    • sorted collection是在内部存款和储蓄器中通过Java比较器实行排序的

    • ordered collection是在数据库中经过order by进行排序的

  13. persist和save的区别

    • persist不保障及时执行,也许要等到flush;persist不更新缓存;
  14. cascade,即对住对象的翻新怎么影响到子对象;

    • save-update:
      级联合保障存(load未来假设实对象产生了翻新,也会级联更新).
      但它不会级联删除

    • delete: 级联删除, 但不具有级联合保证存和翻新

    • all-delete-orphan:
      在化解老爹和儿子关系时,自动删除不属于父对象的子对象,
      也帮忙级联删除和级联合保障存更新.

    • all: 级联删除, 级联更新,但解除老爹和儿子关系时不会自动删除子对象.

    • delete-orphan:删除全体和当前指标解除关系关系的对象

  15. fetch 抓取策略,在安顿文件的Set标签配置

    • join : 左外链接
      而join方式,主体对象和事关对象用一句外键关联的sql同时询问出来,不会形成往往查询。

    • select :
      默许select方式时先查询再次来到要询问的珍视点对象(列表),再遵照关系外键id,每三个指标发二个select查询,获取涉及的靶子,形成n+二回查询;

    • subselece : 子查询

  16. 贯彻关系

    • many-to-one 对象

    • one-to-many set

    • many-to-may Set

  17. POJO的要求

    • 不可能不有2个无参的构造方法

    • 不能为final

    • 性情要为Private,并且提供get/set

  18. inverse

    • 在多对多涉及中默许为flase 表示为两者都在保养关系

    • 有道是改为1端维护关系而不是两端。 inverse=true
      代表布置这些的一方吐弃了维护关系的任务

  19. 数据库中询问速度慢

    • 建索引

    • 压缩表之间的涉嫌

    • 优化sql,尽量让sql不慢定位数据,不要让sql做全表查询,应该走索引,把数据量大的表排在前边

    • 简化查询字段,没用的字段不要,已经对回到结果的支配,尽量重回少量多少

  20. SessionFactory

    • SessionFactory便是1个用于创设Hibernate的Session对象的工厂。SessionFactory平日是在行使运转时创立好的,应用程序中的代码用它来得到Session对象。作为三个单个的数额存款和储蓄,它也是线程安全的,所以多个线程可同时选择同2个SessionFactory,hibernate中的配置文件,映射文件,持久化类的信息都保存在SessionFactory。

    • 一个SessionFactory 在运营的时候只可以创设二遍

  21. 多个主导接口

    • Configuration 接口:配置Hibernate,依据其运行hibernate,创设

    • SessionFactory 接口:开首化Hibernate,充当数据存款和储蓄源的代办,创立

    • Session
      接口:负责保存、更新、删除、加载和查询对象,是线程不安全的,

    • Transaction 接口:管理业务;

    • Query 和Criteria 接口:执行数据库的查询。

  22. Hiberante和Mybatis的区别

    • Hibernate属于自行O奥迪Q三M映射工具,使用Hibernate查询关联对象也许关联合公司合对象时,能够根据目的关联模型间接拿走,所以它是机关的。而Mybatis在查询关联对象或涉及集合对象时,需求手动编写sql来完毕,所以,称之为半自动O福特ExplorerM映射工具。

1、什么是SessionFactory?什么是Session?httpsession和hibernate的session的有何样分化?

   
SessionFactory接口负责开首化Hibernate。它充当数据存款和储蓄源的代办,并肩负创立Session对象。那里运用了工厂方式。须求小心的是SessionFactory并不是轻量级的,因为1般景色下,3个类型1般只必要贰个SessionFactory就够,当供给操作三个数据库时,能够为各样数据库钦赐八个SessionFactory。—-百度百科

 
 在hibernate中的session并不是http中所说的session,壹般把HttpSession对象称为用户会话。。。

 
 而hibernate中的Session呢?是用来表示,应用程序和数据库的1回交互(会话)。在那一个Session中,包涵了相似的持久化方法(CRUD)。而且,Session是二个轻量级对象(线程不安全),平时将各类Session实例和多少个数据库事务绑定,也正是每执行一个数据库事务,都应超越成立二个新的Session实例,在使用Session后,还要求关闭Session

 

2、n+1问题?

壹般而言说n+一意思是,无论在壹对多依旧多对一当查询出n条数据未来,每条数据会波及的询问2遍他的关联对象,这就叫做n+1。

上面是三中国化工进出口总集团解方案:

    1. 设置@ManyToOne的fetch属性值为fetchType.LAZY,那种办法缓解后,前边的n条sql语句按需而发。可是有个弊端,便是只要急需级联合检查询就不能够赢得级联对象了。
    2. 安装@BatchSize(size=5)(该注脚要加在类地点,跟@Entity在平等地方),那样发生的sql语句减弱。那几个设置在放任自流程度上增强了频率。
    3.  join fetch , 如 使用”from Student s left join fetch s.group
      g”, 举办表连接查询,此时就发一条SQL语句。
    4.  使用QBC查询,默许效果与三同等。

              1)fetch=”select” 会别的发出一条语句询问集合

              二) 设置 fetch=”join” 采纳外接连集合的 lazy 失效

             
3) 那只 fetch=”subselect” 此外发出一条 select 语句抓取前边查询到的兼具的实业对象的涉嫌集合 fetch只对 HQL 查询发生影响此外的则不会

 

 

三、Hibernate中的get和load加载有怎么样界别?

当大家运用session.load()方法来加载三个对象时,此时并不会发生sql语句,当前取得的这几个目的实际是三个代理对象,这些代理对象只保留了实体对象的id值,只有当大家要运用那个指标,获得任何性质时,这一年才会发生sql语句,从数据库中去询问大家的靶子。

相对于load的延期加载方式,get就一向的多,当大家采用session.get()方法来获取1个对象时,不管大家使不应用这一个指标,此时都会发生sql语句去从数据库中询问出来。

 

肆、脏读和幻读?

脏读:是指当二个作业正在访问数据,且对数码做了修改,不过还从未交到到数据库。另3个事务查询到这一个数量、这一个数量就是脏数据,依靠这几个数目所做的操作就是不正确的、

幻读:比如第一个事情对数据库的整套行开展了修改,同时第3个工作插入一条数据到数据库中,那时第三个业务就会意识,数据库中有一条记下未有被修改,像爆发了幻觉1样、