java面试题_day17(5道)

101.请解释下 ORM?

对象关系映射(Object Relational Mapping)模式
是一种为了解决面向对象与关系数据库
存在的互不匹配的现象的技术。
简单来说,
ORM是通过使用描述对象和数据库之间映射的元数据,
将程序中的对象自动持久化到关系数据库中。

传统如何实现持久化:
1、采用硬编码方式,
为每一种可能的数据库访问
操作提供单独的方法,
2、ORM提供了对数据库的映射,
不用sql直接编码,
能够像操作对象一样从数据库获得数据。

ORM核心原则:
1、简单:
以最基本的形式建模数据。
2、传达性:
数据库结构被任何人都能理解的语言文档化。
3、精确性:
基于数据库模型创建正确标准化的结构。

ORM技术特点:
1、提高开发效率。
由于可以自动对entity对象与数据库中的table
进行字段与属性的映射,
所以我们实际可能已经不需要一个专用的、
庞大的数据访问层。

ORM缺点:
使用ORM所生成的代码
一般不太可能写出很高效的算法,
性能会受影响。

102.Hibernate 与 JPA 区别在哪?

JPA指在规范、简化Java对象的持久化工作。
使用JPA持久化对象,
并不是依赖于某一个ORM框架。
与Jpa相关的就是这个ORM技术。

ORM (Object-Relation-Mapping),
即对象关系影射技术,
是对象持久化的核心。
ORM是对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;

本来所有信息可以一次性查询出来,
也就是简单的连表查询,
但是Hibernate会首先查询1次得到当前对象,
然后当前对象里面的n个关联对象
会再次访问数据库n次,
这就是1+n问题。

Hibernate给出了3种解决方案,
1.延迟加载,
需要的时候才查询,
不需要就不查询,
但是感觉这种方式治标不治本,
尤其是在那种报表统计查询的时候更为明显。

2.fetch="join",
默认是fetch="select",
这个其实说白了就是一个做外连接,
允许外键为空的情况之下。

3.二级缓存,
第一次查询之后存在内存中,
后面的相同查询就快了。
但是有2个缺点:
二级缓存首先是有点浪费内存空间,
如果多了的话浪费还比较严重,

105.简介下 HibernateSession 与 SessionFactory。

Session接口负责执行,被持久化对象的CRUD操作,Session对象是非线程安全。
Hibernate的Session,不同于JSP应用中的HttpSession。
这里当使用Session这个术语时,指的是Hibernate中的Session。

SessionFactory接口负责初始化Hibernate,充当数据存储源的代理,
并负责创建Session对象,这里用到了工厂模式。
需要注意的是,SessionFactory并不是轻量级的,
一般情况下,一个项目通常只需要,一个SessionFactory就够。
当需要操作多个数据库时,可以为每个数据库指定一个SessionFactory。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。