Hibernate面试题详解
目录
hibernate是什么?... 1
HttpSession与Hibernate中Session的区别... 1
介绍Hibernate. 1
Hibernate有哪几种查询数据的方式... 1
load()和get()的区别... 1
请解释Session的load方法和get方法的不同;以及Query的list和iterator方法的不同... 1
Hibernate工作原理及为什么要用?... 2
Hibernate是如何延迟加载?. 2
Hibernate中怎样实现类之间的关系?(如:一对多、多对多的关系). 2
说下Hibernate的缓存机制... 2
Hibernate的查询方式... 2
Sql、Criteria,object comptosition. 2
如何优化Hibernate?... 3
hibernate的三种状态之间如何转换... 3
请解释说明Hibernate控制下的POJO会呈现三种状态,分别是transient、persistenet和detached,请解释这三种状态... 3
update()和saveOrUpdate()的区别?... 3
hibernate中一对多配置文件返回的是什么?... 3
Hibernate与spring的联系... 3
Hibernate自带的分页机制是什么?如果不使用Hibernate自带的分页,则采用什么方式分页?... 4
什么是Hibernate的并发机制?怎么去处理并发问题?... 4
Hibernate与jdbc的联系... 4
hibernate拒绝连接、服务器崩溃的原因?最少写5个... 4
hibernate.cfg.xml文件的作用... 5
hibernate中的继承关系按照数据库的表结构来分的话有那几种?... 5
hibernate中常见的关联关系有那3种?那种事最常见的... 5
hibernate中的cascade属性的作用:5
hql中能否使用max(),sum(),sount()等组函数?... 5
hql中能否使用Groupby?. 5
hql中加select和不加select的区别... 5
Hql中query.uniqueResult()和query.list()的区别?... 5
简述一下qbc. 5
请解释为什么SessionFactory一般以单例方式使用... 5
请解释说明hibernate配置文件中dialect属性的确切含义... 5
请解释Hibernate3.2主键的生成方式中,native和identity方式的区别。... 6
Native主键生成方式会根据不同的底层数据库自动选择Identity、Sequence、Hilo主键生成方式... 6
请简要的描述一下使用Hibernate进行大批量更新的经验... 6
请简要的描述一下使用Hibernate二级高速缓存的经验... 6
Hibernate的延迟加载怎么看?... 6
hibernate的sessionFactory说说... 6
什么事O/RM?. 7
在o/rm中java中的类名,属性,对象分别转换为数据库中的什么?... 7
Hibernate笔试题==========================. 7
A)
hibernate是基于ORM对象关系映射(完成对象数据到关系数据映射的机制)实现的,做数据持久化的工具
1. javax.servlet.http.HttpSession是一个抽象接口
用途:存放这个用户的一些经常被用到的信息,例如:用户名,权限等
2. 它是hibernate操作数据库的一个句柄对象 手动或者通过业务层获取
介绍 Hibernate
Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端程序使用,也可以在Servlet/JSP的Web应用中使用,最具革命意义的是,Hibernate可以在应用EJB的J2EE架构中取代CMP,完成数据持久化的重任。
(1)导航对象图查询 (2)OID查询 (3)HQL (4)QBC (5)本地SQL
load加载方法:
Usersuser = (Users)session.load(Users.class, userId);
get加载方法:
Usersuser = (Users)session.get(Users.class, userId);
两加载方法区别:
区别1:如果数据库中,没有userId的对象。如果通过get方法加载,则返回的是一个null;如果通过load加载,则返回一个代理对象,如果后面代码如果调用user对象的某个属性(比如user.getPassword())会抛出异常:org.hibernate.ObjectNotFoundException;
区别2:load支持延迟加载,get不支持延迟加载。
也就是说:Users user =(Users)session.load(Users.class, userId);
这句代码不会去执行数据库查询,只有用到user时才会去执行数据库查询。
而:Users user =(Users)session.get(Users.class, userId);
则立即去执行数据库查询。 所以Users user = (Users)session.load(Users.class,userId);不会执行任何sql。
注意:
Usersuser = (Users)session.load(Users.class, userId);
System.out.println(user.getId());
上面这2句代码,不会去执行数据库操作。因为load后会在hibernate的一级缓存里存放一个map对象,该map的key就是userId的值,但是当你getId()时,它会去一级缓存里拿map的key值,而不去执行数据库查询。所以不会报任何错。不会执行任何数据库操作。
请解释Session的load方法和get方法的不同;以及Query的list和iterator方法的不同
load():现在session缓存中寻找,如果找到了返回该对象,如果没找到,程序会新建一个对象,并且返回,存在session中,不会在数据库中查找,在程序中如果没有用到这个实体类,可以节省一次数据库连接。如果在程序中用到了这个实体类,这个实体类就会在数据库去查找,如果没有查找到就会抛异常。(延时加载)
get():在缓存在查找,如果找到该对象,返回该对象。如果没找到,会到数据库中查找,如果数据库中有则返回该对象,如果没找到这返回空。(立即加载)
Hibernate工作原理及为什么要用?
原理:
1.读取并解析配置文件
2.读取并解析映射信息,创建SessionFactory
3.打开Sesssion
4.创建事务Transation
5.持久化操作
6.提交事务
7.关闭Session
8.关闭SesstionFactory
为什么要用:
1.对JDBC访问数据库的代码做了封装,大大简化了数据访问层繁琐的重复性代码。
2.Hibernate是一个基于JDBC的主流持久化框架,是一个优秀的ORM实现。他很大程度的简化DAO层的编码工作
3.hibernate使用Java反射机制,而不是字节码增强程序来实现透明性。
4.hibernate的性能非常好,因为它是个轻量级框架。映射的灵活性很出色。它支持各种关系数据库,从一对一到多对多的各种复杂关系。
Hibernate是如何延迟加载?
1.Hibernate2延迟加载实现:a)实体对象 b)集合(Collection)
2.Hibernate3 提供了属性的延迟加载功能
当Hibernate在查询数据的时候,数据并没有存在与内存中,当程序真正对数据的操作时,对象才存在与内存中,就实现了延迟加载,他节省了服务器的内存开销,从而提高了服务器的性能。
Hibernate中怎样实现类之间的关系?(如:一对多、多对多的关系)
类与类之间的关系主要体现在表与表之间的关系进行操作,它们都市对对象进行操作,我们程序中把所有的表与类都映射在一起,它们通过配置文件中的many-to-one、one-to-many、many-to-many、
说下Hibernate的缓存机制
1.内部缓存存在Hibernate中又叫一级缓存,属于应用事物级缓存
2.二级缓存:
a)应用及缓存
b)分布式缓存
条件:数据不会被第三方修改、数据大小在可接受范围、数据更新频率低、同一数据被系统频繁使用、非 关键数据
c)第三方缓存的实现
Hibernate的查询方式
Sql、Criteria,objectcomptosition
Hql:
1、属性查询
2、参数查询、命名参数查询
3、关联查询
4、分页查询
5、统计函数
如何优化Hibernate?
1.使用双向一对多关联,不使用单向一对多
2.灵活使用单向一对多关联
3.不用一对一,用多对一取代
4.配置对象缓存,不使用集合缓存
5.一对多集合使用Bag,多对多集合使用Set
6.继承类使用显式多态
7.表字段要少,表关联不要怕多,有二级缓存撑腰
hibernate的三种状态之间如何转换
当对象由瞬变状态(Transient)一save()时,就变成了持久化状态。
当我们在Session里存储对象的时候,实际是在Session的Map里存了一份,
也就是它的缓存里放了一份,然后,又到数据库里存了一份,在缓存里这一份叫持久对象(Persistent)。
Session 一Close()了,它的缓存也都关闭了,整个Session也就失效了,
这个时候,这个对象变成了游离状态(Detached),但数据库中还是存在的。
当游离状态(Detached)update()时,又变为了持久状态(Persistent)。
当持久状态(Persistent)delete()时,又变为了瞬时状态(Transient),
此时,数据库中没有与之对应的记录。
请解释说明Hibernate控制下的POJO会呈现三种状态,分别是transient、persistenet和detached,请解释这三种状态
Transient:瞬变状态:数据库中没数据。跟session不相关。没存过。
Persistenet:游离态:在数据库中有记录,但是在session中没有。需要手工同步。
Detached:持久态:数据库中有记录,session中也有这记录。自动更新
update()和saveOrUpdate()的区别?
update()和saveOrUpdate()是用来对跨Session的PO进行状态管理的。
update()方法操作的对象必须是持久化了的对象。也就是说,如果此对象在数据库中不存在的话,就不能使用update()方法。
saveOrUpdate()方法操作的对象既可以使持久化了的,也可以使没有持久化的对象。如果是持久化了的对象调用saveOrUpdate()则会
更新数据库中的对象;如果是未持久化的对象使用此方法,则save到数据库中
hibernate中一对多配置文件返回的是什么?
hibernate中一对多配置文件会相应的映射为两张表,并且它们之间的关系是一对多的。
例如:一个student和classes表的关系 。一个学生只能是一个班的,一个班可以有多个学生。
Hibernate与spring的联系
hibernate中的一些对象可以给Spring来管理,让Spring容器来创建hibernate中一些对象实例化。例如:SessionFactory,HibernateTemplate等。
Hibernate本来是对数据库的一些操作,放在DAO层,而Spring给业务层的方法定义了事务,业务层调用DAO层的方法,很好的将Hibernate的操作也加入到事务中来了。
Hibernate自带的分页机制是什么?如果不使用Hibernate自带的分页,则采用什么方式分页?
1、hibernate自带的分页机制:
获得Session对象后,从Session中获得Query对象。用Query.setFirstResult():设置要显示的第一行数据,
Query.setMaxResults():设置要显示的最后一行数据。
2、不使用hibernate自带的分页,可采用sql语句分页,
如:5:为每页显示的记录,2为当前页: select * top 5 from table where tabIdnot in (select tabId top (2-1)*5 from table);、
什么是Hibernate的并发机制?怎么去处理并发问题?
Hibernate并发机制:
a、Hibernate的Session对象是非线程安全的,对于单个请求,单个会话,单个的工作单元(即单个事务,单个线程),它通常只使用一次,然后就丢弃。
如果一个Session实例允许共享的话,那些支持并发运行的,例如Http request,session beans将会导致出现资源争用。
如果在HttpSession中有hibernate的Session的话,就可能会出现同步访问Http Session。只要用户足够快的点击浏览器的“刷新”,就会导致两个并发运行的线程使用同一个Session。
b、多个事务并发访问同一块资源,可能会引发第一类丢失更新,脏读,幻读,不可重复读,第二类丢失更新一系列的问题。解决方案:设置事务隔离级别。
Serializable:串行化。隔离级别最高
Repeatable Read:可重复读
Read Committed:已提交数据读
Read Uncommitted:未提交数据读。隔离级别最差
设置锁:乐观锁和悲观锁。
乐观锁:使用版本号或时间戳来检测更新丢失,在的映射中设置 optimistic-lock=”all”可以在没有版本或者时间戳属性映射的情况下实现 版本检查,此时Hibernate将比较一行记录的每个字段的状态 行级悲观锁:Hibernate总是使用数据库的锁定机制,从不在内存中锁定对象!只要为JDBC连接指定一下隔 离级别,然后让数据库去搞定一切就够了。类LockMode 定义了Hibernate所需的不同的锁定级别:LockMode.UPGRADE,LockMode.UPGRADE_NOWAIT,LockMode.READ;
Hibernate与jdbc的联系
hibernate是jdbc的轻量级封装,包括jdbc的与数据库的连接(用hibernate.property的配置文件实现当然本质是封装了jdbc的forname),和查询,删除等代码,都用面向对象的思想用代码联系起来,hibernate通过hbm 配置文件把po类的字段和数据库的字段关联起来比如数据库的id,在po类中就是pravite Long id; public Long getId() ;publicsetId(Long id);
然后hql语句也是面向对象的,它的查询语句不是查询数据库而是查询类的,这些实现的魔法就是xml文件,其实hibernate=封装的jdbc+xml文件
hibernate拒绝连接、服务器崩溃的原因?最少写5个
1. db没有打开
2. 网络连接可能出了问题
3. 连接配置错了
4. 驱动的driver,url是否都写对了
5. LIB下加入相应驱动,数据连接代码是否有误
6. 数据库配置可能有问题
7. 当前联接太多了,服务器都有访问人数限制的
8. 服务器的相应端口没有开,即它不提供相应的服务
9 hibernate有哪些缓存,分别怎么使用?
10 你对hibernate的了解到了一个什么样的程度?
11 写出一个sql语句体现hibernate中一对多的关系
hibernate.cfg.xml文件的作用
该配置文件主要用来描述数据库连接的相关信息,以及该应用中关心映射文件所在的位置,和一些其他的设置,该文件一般放在项目的根目录下。
hibernate中的继承关系按照数据库的表结构来分的话有那几种?
1.所有类在一张表中,通过添加一个鉴别字段来区分子类。
2.每个子类一张表,父类的字段被分配到每个表中。
3.每个类一张表,包括父类和子类,通过父类和子类的ID来体现继承关系
hibernate中常见的关联关系有那3种?那种事最常见的
一对一
一对多
多对多
一对多最常见
hibernate中的cascade属性的作用:
级联操作
hql中能否使用max(),sum(),sount()等组函数?
能
hql中能否使用Group by?
能
hql中加select和不加select的区别
不加select会根据用户所提供的条件查询数据,并打成所映射的对象
加了select则不会
Hql中query.uniqueResult()和query.list()的区别?
前者指返回一个对象,后者返回一个list集合
简述一下qbc
qbc(queryby criteria)这种ape封装了sql语句的动态拼接,对查询提供了更加面向对象的功能接口
请解释为什么SessionFactory一般以单例方式使用
SessionFactory是一个大型对象,而且线程安全。在一个程序中只需要一个
请解释说明hibernate配置文件中dialect属性的确切含义
数据库方言:多种数据库拥有不同的语言语法,通过设置dialect指定所用的数据库,并生成对应语法和语言的sql语句。
请解释Hibernate3.2主键的生成方式中,native和identity方式的区别。
Native主键生成方式会根据不同的底层数据库自动选择Identity、Sequence、Hilo主键生成方式
Identity当时根据底层数据库,来支持自动增长,不同的数据库用不同的主键增长方式
“native” 由Hibernate 根据使用的数据库自行判断采用 identity、hilo、sequence 其中一种作为主键生成方式。 在HIBERNATE配置中native是默认的,泛指的自增,也就是说除了oracle数据库外(oracle下用native需要用到一个叫hibernate_sequence的sequence),大部分数据库你都可以使用默认的native来代表自增。
“assigned” 主键由外部程序负责生成,在 save() 之前指定一个。
“hilo” 通过hi/lo算法实现的主键生成机制,需要额外的数据库表或字段提供高位值来源
“seqhilo” 与hilo类似,通过hi/lo算法实现的主键生成机制,需要数据库中的Sequence,适用于支持Sequence的数据库,如Oracle。
“increment” 主键按数值顺序递增。此方式的实现机制为在当前应用实例中维持一个变量,以保存着当前的最大值,之后每次需要生成主键的时候将此值加1作为主键。这种方式可能产生的问题是:不能在集群下使用。
“identity采用数据库提供的主键生成机制。如DB2、SQL Server、MySQL 中的主键生成机制。
“sequence” 采用数据库提供的 sequence 机制生成主键。如 Oralce 中的Sequence。
“uuid.hex” 由 Hibernate基于128位UUID 算法生成16进制数值(编码后以长度32的字符串表示)作为主键。
“uuid.string” 与uuid.hex 类似,只是生成的主键未进行编码(长度16),不能应用在PostgreSQL数据库中。
“foreign” 使用另外一个相关联的对象的标识符作为主键。
请简要的描述一下使用Hibernate进行大批量更新的经验
直接使用hibernate API 进行批量更新和批量删除都不推荐,而直接通过JDBC API执行相关的SQl语句或调用相关的存储过程是最佳的方式。
1.Hibernate3的二级缓存和session级别的缓存一样都只对实体对象做缓存,不对属性级别的查询做缓存;二级缓存的生命周期和sessionFactory的生命周期是一样的,sessionFactory可以管理二级缓存;
2.sessionFactory级别的缓存,需要手动配置;所有的session可以共享sessionFactory 级别的缓存;(一般把一些不经常变化的实体对象放到sessionFactory级别的缓存中,适合放不经常变化的实体对象。)
3.Hiberante3二级缓存的配置和使用方法如下:
必须把ehcache.jar包导入,然后到Hibernate3.2的etc文件下把ehcache.xml复制到工程src目录下(ehcache.xml里边的参数里边有详细英文说明);
说明:ehcache.jar是第三方法的缓存产品,hiberante只是把它做了集成,还有好多第三方hibernate集成的缓存产品,相关说明请查阅hiberante3开发手册;ehcache是不支持分布应用的,如果有分布式需求,请换成支持分布式的二级缓存产品,hiberate3开发手册都有相头说明。配置方法都类似);
4.Hibernate3的二级缓存默认是开起的,也可以指定开起。
Hibernate的延迟加载怎么看?
当Hibernate查询数据的时候,数据并没有存在于内存中,当数据真正对数据操作时,才存在于内存中,就实现了延迟加载,他节省了服务器内存的开销,从而提升了服务器的性能。
hibernate的sessionFactory说说
是管理session的一个工厂,由sessionFactory的相关方法返回session对象,而不是平常的new关键字创建session,它的另一个好处就是,你只管要session而不用管它是如何产生的。这样在效率和安全性是比较好的。
对象关心映射是一种为了解决面向对象与关心数据库互不匹配的技术。简单的说,orm是通过使用描述对象和数据库之间映射的元数据,将java程序中的对象自动持久化到关系数据库中,本质上就是将数据从一种形式转换到另一种形式。
类名--表名
属性--字段
对象--记录
(1)一般情况下,关系数据模型与对象模型之间有哪些匹配关系(多选)
A)表对应类
B)记录对应对象
C)表的字段对应类的属性
D)表之间的参考关系对应类之间的依赖关系
(2)以下关于SessionFactory的说法哪些正确?(多选)
A)对于每个数据库事务,应该创建一个SessionFactory对象
B)一个SessionFactory对象对应一个数据库存储源。
C)SessionFactory是重量级的对象,不应该随意创建。如果系统中只有一个数据库存储源,只需要创建一个。
D)SessionFactory的load()方法用于加载持久化对象
(3)Customer类中有一个Set类型的orders属性,用来存放Order订单对象,在Customer.hbm.xml文件中,用哪个元素映射orders属性?
A)
(4)
A)none
B)save
C)delete
D)save-update
(5)以下哪些属于Session的方法?
A)load()
B)save()
C)delete()
D)update()
E)open()
F)close()
(6)以下程序的打印结果是什么?(单选)
tx= session.beginTransaction();
Customerc1=(Customer)session.load(Customer.class,new Long(1));
Customerc2=(Customer)session.load(Customer.class,new Long(1));
System.out.println(c1==c2);
tx.commit();
session.close();
A)运行出错,抛出异常
B)打印false
C)打印true
(7)以下程序代码对Customer的name属性修改了两次:
tx= session.beginTransaction();
Customercustomer=(Customer)session.load(Customer.class,new Long(1));
customer.setName(\"Jack\");
customer.setName(\"Mike\");
tx.commit();
执行以上程序,Hibernate需要向数据库提交几条update语句?(单选)
A)0B)1 C)2 D)3
(8)在持久化层,对象分为哪些状态?(多选)
A)临时状态
B)独立状态
C)游离状态
D)持久化状态
(9)对于以下程序,Customer对象在第几行变为持久化状态?(单选)
Customercustomer=new Customer(); //line1
customer.setName(\"Tom\");//line2
Sessionsession1=sessionFactory.openSession(); //line3
Transactiontx1 = session1.beginTransaction(); //line4
session1.save(customer);//line4
tx1.commit();//line5
session1.close();//line6
A) line1B)line2 C)line3 D)line4 E)line5 F)line6
(10)对于以下程序,Customer对象在第几行变为游离状态?(单选)
Customercustomer=new Customer(); //line1
customer.setName(\"Tom\");//line2
Sessionsession1=sessionFactory.openSession(); //line3
Transactiontx1 = session1.beginTransaction(); //line4
session1.save(customer);//line4
tx1.commit();//line5
session1.close();//line6
A) line1B)line2 C)line3 D)line4 E)line5 F)line6
(11)以下哪一种检索策略利用了外连结查询?(单选)
A)立即检索B)延迟检索 C)迫切左外连结检索
(12)假设对Customer类的orders集合采用延迟检索策略,编译或运行以下程序,会出现什么情况(单选)
Sessionsession=sessionFactory.openSession();
tx= session.beginTransaction();
Customercustomer=(Customer)session.get(Customer.class,new Long(1));
tx.commit();
session.close();
IteratororderIterator=customer.getOrders().iterator();
A) 编译出错 B)编译通过,并正常运行C)编译通过,但运行时抛出异常
(13)关于HQL与SQL,以下哪些说法正确?(多选)
A)HQL与SQL没什么差别
B)HQL面向对象,而SQL操纵关系数据库
C)在HQL与SQL中,都包含select,insert,update,delete语句
D)HQL仅用于查询数据,不支持insert,update和delete语句
(14)事务隔离级别是由谁实现的?(单选)
A)Java应用程序B)Hibernate C)数据库系统D)JDBC驱动程序
(15)悲观锁与乐观锁,哪个具有较好的并发性能?(单选)
A)悲观锁B)乐观锁