• Hibernate常见面试题


    1.get和load区别。
    (1)get如果没有找到会返回null, load如果没有找到会抛出异常。

    (2)get会先查一级缓存, 再查二级缓存,然后查数据库;load会先查一级缓存,如果没有找到,就创建代理对象, 等需要的时候去查询二级缓存和数据库

    2.Hibernate中的三种数据状态

    (1)临时态(瞬时态/Transient)

    不存在于session中,也不存在于数据库中的数据,被称为临时态。

    比如:刚刚使用new关键字创建出的对象。

    (2)持久态(Persistent)

    存在于session中,事务还未提交,提交之后最终会进入数据库的数据,被称为持久态。

    比如:刚刚使用session.save()操作的对象。

    (3)游离态(脱管态/Detached)

    存在于数据库中,但不存在于session中的数据,被称为游离态。

    比如:使用了session.save(),并且事务已经提交之后,对象进入数据库,就变成了游离态。

    3.Hibernate工作原理及为什么要用?

    1.读取并解析配置文件
    2.读取并解析映射信息,创建SessionFactory
    3.打开Sesssion
    4.创建事务Transation
    5.持久化操作
    6.提交事务
    7.关闭Session
    8.关闭SesstionFactory

    为什么要用:
    1. 对JDBC访问数据库的代码做了封装,大大简化了数据访问层繁琐的重复性代码。

    Hibernate是一个基于JDBC的主流持久化框架,是一个优秀的ORM实现。他很大程度的简化DAO层的编码工作

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

    hibernate的性能非常好,因为它是个轻量级框架。映射的灵活性很出色。它支持各种关系数据库,从一对一到多对多的各种复杂关系。

    4.Hibernate缓存机制

    首先说下Hibernate缓存的作用(即为什么要用缓存机制),然后再具体说说Hibernate中缓存的分类情况,最后可以举个具体的例子。
    Hibernate缓存的作用:
    Hibernate是一个持久层框架,经常访问物理数据库,为了降低应用程序对物理数据源访问的频次,从而提高应用程序的运行性能。缓存内的数据是对物理数据源中的数据的复制,应用程序在运行时从缓存读写数据,在特定的时刻或事件会同步缓存和物理数据源的数据Hibernate缓存分类:
    Hibernate缓存包括两大类:Hibernate一级缓存和Hibernate二级缓存Hibernate一级缓存又称为“Session的缓存”,它是内置的,不能被卸载(不能被卸载的意思就是这种缓存不具有可选性,必须有的功能,不可以取消session缓存)。由于Session对象的生命周期通常对应一个数据库事务或者一个应用事务,因此它的缓存是事务范围的缓存。第一级缓存是必需的,不允许而且事实上也无法卸除。在第一级缓存中,持久化类的每个实例都具有唯一的OID。 Hibernate二级缓存又称为“SessionFactory的缓存”,由于SessionFactory对象的生命周期和应用程序的整个过程对应,因此Hibernate二级缓存是进程范围或者集群范围的缓存,有可能出现并发问题,因此需要采用适当的并发访问策略,该策略为被缓存的数据提供了事务隔离级别。第二级缓存是可选的,是一个可配置的插件,在默认情况下,SessionFactory不会启用这个插件。
    什么样的数据适合存放到第二级缓存中?
    1 很少被修改的数据
    2 不是很重要的数据,允许出现偶尔并发的数据
    3 不会被并发访问的数据
    4 常量数据
    不适合存放到第二级缓存的数据?
    1 经常被修改的数据
    2 .绝对不允许出现并发访问的数据,如财务数据,绝对不允许出现并发
    3 与其他应用共享的数据。
    Hibernate查找对象如何应用缓存?
    当Hibernate根据ID访问数据对象的时候,首先从Session一级缓存中查;查不到,如果配置了二级缓存,那么从二级缓存中查;如果都查不到,再查询数据库,把结果按照ID放入到缓存,删除、更新、增加数据的时候,同时更新缓存。Hibernate管理缓存实例无论何时,当你给save()、update()或saveOrUpdate()方法传递一个对象时,或使用load()、 get()、list()、iterate() 或scroll()方法获得一个对象时, 该对象都将被加入到Session的内部缓存中。 当随后flush()方法被调用时,对象的状态会和数据库取得同步。 如果你不希望此同步操作发生,或者你正处理大量对象、需要对有效管理内存时,你可以调用evict() 方法,从一级缓存中去掉这些对象及其集合。

    5.Hibernate有哪几种查询数据的方式

    3种:hql、条件查询QBC(QueryBy Criteria)、原生sql (通过createSQLQuery建立)

    6.JDBC hibernate 和 ibatis 的区别

    (1)jdbc:手动

    手动写sql
    delete、insert、update要将对象的值一个一个取出传到sql中,不能直接传入一个对象。
    select:返回的是一个resultset,要从ResultSet中一行一行、一个字段一个字段的取出,然后封装到一个对象中,不直接返回一个对象。
    (2)ibatis的特点:半自动化
    sql要手动写
    delete、insert、update:直接传入一个对象
    select:直接返回一个对象
    (3)hibernate:全自动
    不写sql,自动封装
    delete、insert、update:直接传入一个对象
    select:直接返回一个对象

    7.在数据库中条件查询速度很慢的时候,如何优化?

    1.建索引
    2.减少表之间的关联
    3.优化sql,尽量让sql很快定位数据,不要让sql做全表查询,应该走索引,把数据量大的表排在前面
    4.简化查询字段,没用的字段不要,已经对返回结果的控制,尽量返回少量数据

  • 相关阅读:
    3里氏代换原则LSP
    2单一职责原则SRP
    1开放封闭原则OCP
    24访问者模式Visitor
    python json模块,处理json文件的读写
    python zip 绑定多个list
    python 字符串重复多次的技巧 *操作符
    python 刷新缓冲区,实时监测
    python os.getcwd 获取工作目录
    python datetime 获取时间
  • 原文地址:https://www.cnblogs.com/e-x-c-e-ption/p/11847087.html
Copyright © 2020-2023  润新知