欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Java面试题:Hibernate的二级缓存与Hibernate多表查询

程序员文章站 2022-07-02 17:29:15
我们来看两个有关Java框架之Hibernate的面试题,这是关于Hibernate的常考知识点。 1、请介绍一下Hibernate的二级缓存 解题按照以下思路来回答: (1)首先说清楚什么是缓存; (2)再说有了hibernate的Session就是一级缓存,即有了一级缓存,为什么还要有二级缓存; ......

我们来看两个有关java框架之hibernate的面试题,这是关于hibernate的常考知识点。

 

1、请介绍一下hibernate的二级缓存

解题按照以下思路来回答:

1)首先说清楚什么是缓存;

2)再说有了hibernatesession就是一级缓存,即有了一级缓存,为什么还要有二级缓存;

3)最后再说如何配置hibernate的二级缓存。

 

缓存就是把以前从数据库中查询出来和使用过的对象保存在内存中(一个数据结构中),这个数据结构通常是或类似hashmap,当以后要使用某个对象时,先查询缓存中是否有这个对象,如果有则使用缓存中的对象,如果没有则去查询数据库,并将查询出来的对象保存在缓存中,以便下次使用。下面是缓存的伪代码:

引出hibernate的第二级缓存,用下面的伪代码分析了cache的实现原理。

dao

{

hashmap map = new map();

user getuser(integer id)

{

user user = map.get(id)

if(user == null)

{

user = session.get(id);

map.put(id,user);

}

return user;

}

}

 

dao

{

cache cache = null

setcache(cache cache)

{

this.cache = cache

}

 

user getuser(int id)

{

if(cache!=null)

{

user user = cache.get(id);

if(user ==null)

{

user = session.get(id);

cache.put(id,user);

}

return user;

}

 

return session.get(id);

}

}

# 上海尚学堂java培训 shsxt.com

 

hibernatesession就是一种缓存,我们通常将之称为hibernate的一级缓存,当想使用session从数据库中查询出一个对象时,session也是先从自己内部查看是否存在这个对象,存在则直接返回,不存在才去访问数据库,并将查询的结果保存在自己内部。由于session代表一次会话过程,一个session与一个数据库连接相关连,所以session最好不要长时间保持打开,通常仅用于一个事务当中,在事务结束时就应关闭。并且session是线程不安全的,被多个线程共享时容易出现问题。通常只有那种全局意义上的缓存才是真正的缓存应用,才有较大的缓存价值,因此,hibernatesession这一级缓存的缓存作用并不明显,应用价值不大。hibernate的二级缓存就是要为hibernate配置一种全局缓存,让多个线程和多个事务都可以共享这个缓存。我们希望的是一个人使用过,其他人也可以使用,session没有这种效果。

 

二级缓存是独立于hibernate的软件部件,属于第三方的产品,多个厂商和组织都提供有缓存产品,例如,ehcacheoscache等等。在hibernate中使用二级缓存,首先就要在hibernate.cfg.xml配置文件中配置使用哪个厂家的缓存产品,接着需要配置该缓存产品自己的配置文件,最后要配置hibernate中的哪些实体对象要纳入到二级缓存的管理中。明白了二级缓存原理和有了这个思路后,很容易配置起hibernate的二级缓存。

 

扩展知识:一个sessionfactory可以关联一个二级缓存,也即一个二级缓存只能负责缓存一个数据库中的数据,当使用hibernate 的二级缓存后,注意不要有其他的应用或sessionfactory来更改当前数据库中的数据,这样缓存的数据就会与数据库中的实际数据不一致。 

 

2、hibernate进行多表查询每个表中各取几个字段,也就是说查询出来的结果集没有一个实体类与之对应如何解决?

解决方案一,按照object[]数据取出数据,然后自己组bean

解决方案二,对每个表的bean写构造函数,比如表一要查出field1,field2两个字段,那么有一个构造函数就是bean(type1 filed1,type2

field2) ,然后在hql里面就可以直接生成这个bean了。

 

更多hibernate的面试题请看上海尚学堂《划重点:java三大框架ssh之hibernate面试题集锦》。