美文网首页程序员
撩课-Java每天5道面试题第14天

撩课-Java每天5道面试题第14天

作者: 撩课学院 | 来源:发表于2018-12-02 11:48 被阅读4次

    101.请解释下 ORM?

    对象关系映射(Object Relational Mapping)模式
    是一种为了解决面向对象与关系数据库
    存在的互不匹配的现象的技术。
    简单来说,
    ORM是通过使用描述对象和数据库之间映射的元数据,
    将程序中的对象自动持久化到关系数据库中。
    
    传统如何实现持久化:
    1、采用硬编码方式,
    为每一种可能的数据库访问
    操作提供单独的方法,
    2、ORM提供了对数据库的映射,
    不用sql直接编码,
    能够像操作对象一样从数据库获得数据。
    
    ORM核心原则:
    
    1、简单:
    以最基本的形式建模数据。
    
    2、传达性:
    数据库结构被任何人都能理解的语言文档化。
    
    3、精确性:
    基于数据库模型创建正确标准化的结构。
    
    ORM技术特点:
    1、提高开发效率。
    由于可以自动对entity对象与数据库中的table
    进行字段与属性的映射,
    所以我们实际可能已经不需要一个专用的、
    庞大的数据访问层。
    
    ORM缺点:
    使用ORM所生成的代码
    一般不太可能写出很高效的算法,
    性能会受影响。
    
    

    102.Hibernate 与 JPA 区别在哪?

    在讨论Hibernate与Jpa的关系是,
    首先要明确Jpa的用途。
    JPA全称为Java Persistence API ,
    Java持久化API是Sun公司在Java EE 5规范中
    提出的Java持久化接口。
    JPA吸取了目前Java持久化技术的优点,
    旨在规范、简化Java对象的持久化工作。
    使用JPA持久化对象,
    并不是依赖于某一个ORM框架。
    与Jpa相关的就是这个ORM技术,
    ORM 是Object-Relation-Mapping,
    即对象关系影射技术,
    是对象持久化的核心。O
    RM是对JDBC的封装,
    从而解决了JDBC的各种存在问题:
    
    知道Jpa是一种规范,
    而Hibernate是它的一种实现。
    除了Hibernate,
    还有EclipseLink(曾经的toplink),
    OpenJPA等可供选择,
    所以使用Jpa的一个好处是,
    可以更换实现而不必改动太多代码。
    
    

    103.什么是懒加载(Lazy Loading)?

     1. 懒加载顾名思义就是延迟加载。
    即当两个及以上表
    使用Hibernate来管理级联关系时,
    一个表被加载到JVM内存中,
    而其他表会被暂存在数据库的缓存中,
    当需要使用相关表数据的时候
    再加载到JVM内存中。
    因此通过懒加载机制可以
    减少内存中不必要的开销,
    以提高程序的性能。
    2. 问题描述:当使用懒加载时,
    如果将session关闭,
    则断开了与数据库的连接,
    这时如果要访问字表数据,
    由于字表数据存放在数据库缓存中,
    而连接已经关闭,
    则访问字表数据时会抛出LazyInitializationException异常。
    
    解决办法:
    1. 不使用懒加载,将字表配置文件中的lazy属性改为false
    2.使用过滤器,
    把close session操作推迟到得到页面结果后执行,
    这里可以采用Spring中的OpenSessionViewFilter过滤器来实现
    3.手动将需要的字表数据
    从数据库缓存加载到jvm内存中
    
    

    104.什么是 N+1 难题?

    一般而言说n+1意思是,
    无论在一对多还是多对一当查询出n条数据之后,
    每条数据会关联的查询1次他的关联对象,
    这就叫做n+1。
    
    本来所有信息可以一次性查询出来,
    也就是简单的连表查询,
    但是Hibernate会首先查询1次得到当前对象,
    然后当前对象里面的n个关联对象
    会再次访问数据库n次,
    这就是1+n问题。
    
    Hibernate给出了3中解决方案,
    1.延迟加载,
    当需要的时候才查询,不
    需要就不查询,
    但是感觉这种方式治标不治本,
    尤其是在那种报表统计查询的时候更为明显。
    
    2.fetch="join",
    默认是fetch="select",
    这个其实说白了就是一个做外连接,
    允许外键为空的情况之下。
    
    3.二级缓存,
    第一次查询之后存在内存中,
    后面的相同查询就快了。
    但是有2个缺点:
    二级缓存首先是有点浪费内存空间,
    如果多了的话浪费还比较严重,
    
    

    105.简介下 Hibernate Session 与 SessionFactory。

    Session接口负责执行
    被持久化对象的CRUD操作
    CRUD的任务是完成与数据库的交流,
    包含了很多常见的SQL语句。
    需要注意的是,
    Session对象是非线程安全的,
    同时,
    Hibernate的Session
    不同于JSP应用中的HttpSession。
    这里当使用Session这个术语时,
    其实指的是Hibernate中的Session,
    而以后会将HttpSession对象
    称为用户Session。
    
    SessionFactory接口负责初始化Hibernate。
    它充当数据存储源的代理,
    并负责创建Session对象。
    这里用到了工厂模式。
    需要注意的是,
    SessionFactory并不是轻量级的,
    因为一般情况下,
    一个项目通常只需要
    一个SessionFactory就够,
    当需要操作多个数据库时,
    可以为每个数据库指定
    一个SessionFactory。
    
    

    相关文章

      网友评论

        本文标题:撩课-Java每天5道面试题第14天

        本文链接:https://www.haomeiwen.com/subject/svqofqtx.html