撩课-Java每天5道面试题第14天
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。