1、Hibernate中对象的三种状态?
-------------------------------------------------------------------------------------------------------------------------------------
1)、瞬态:对象刚刚创建,还没有和Hibernate中的Session有任何关联
2)、持久化态:通过get、load、save之类的方法和Session关联上在其管理下,并在数据库中有相应的一条记录。
3)、游离态:对象经过持久化后,Session关闭,对象脱离了Session的管理,处于游离状态
注意:瞬态和游离态的区别在于,游离态对象包含一个数据库标识符(主键id),而瞬态对象是没有的。
游离态对象一定是从持久态转变过来的,而且游离态对象可以通过save()或者saveOrUpdate()方法再变成持久态。
当Session执行clear()、evict()时,Session缓存中的持久态会变成游离态。
当执行delete()操作后,事务提交了,游离对象还是有对应的数据库标识符(原主键id),如果通过save()方法重新进入持久态,同步到数据库中的记录主键就不是原来的那个了。
-------------------------------------------------------------------------------------------------------------------------------------
2、hibernate中的update()和saveOrUpdate()的区别?
-------------------------------------------------------------------------------------------------------------------------------------
1)、如果是一个瞬态对象,调用update()没任何反应,而调用saveOrUpdate()方法会插入一条新的记录
2)、update()只对持久态和游离态对象起作用,saveOrUpdate()方法对于持久态和游离态对象相当于执行update()方法,而对于瞬态对象则相当于执行save()方法。
-------------------------------------------------------------------------------------------------------------------------------------
3、Hibernate中update()和merge()的区别?
-------------------------------------------------------------------------------------------------------------------------------------
1)、如果是瞬态对象,执行merge()方法会插入一条数据到数据库,而update()不做任何处理。
2)、瞬态对象如果设置了主键Id,在数据库能找到相应记录,则两个方法均做更新操作,而如果id在数据库没有相关记录,则merge()会向数据库中插入一条新的记录,而update()不做处理。
3)、当session中存在两个相同的持久化标示(主键Id)时,(这种情况一般是第一个session获取到某个对象,然后session关闭,第二个session开启再去获取这个对象,然后第二个session.update()第一个游离状态的对象,如果正常的update()的话,那session中就会有两个持久化标示一样的持久态对象,显然不合适,所以会报错),而通过merge()方法则可以把游离态的属性变化copy到当前session持久态对象中,然后更新。
4)、上面一大堆也就是说,如果出现了一个session有相同持久化标示的一个持久态对象和一个游离态对象,当通过update()方法持久化游离态对象时会报错,而通过merge()方法则可以把游离态对象变更的属性同步到持久态对象,继而做更新操作。
-------------------------------------------------------------------------------------------------------------------------------------
4、Hibernate中update()和flush()的区别?
-------------------------------------------------------------------------------------------------------------------------------------
1)、update操作瞬态和游离态的对象,持久态对象在事务提交的时候或者session.flush()的时候会自动持久化到数据库中,不需要通过update()来执行。
2)、flush()操作的是持久态对象。
3)、flush()是把缓存中的对象状态与数据库同步,知道事务提交才真正插入或更新,而且flush()不会清楚session中的对象。
-------------------------------------------------------------------------------------------------------------------------------------
5、Hibernate中get()和load()的区别?
-------------------------------------------------------------------------------------------------------------------------------------
1)、load()方法支持延迟加载,而get()方法不支持
2)、get()方法的流程是这样的,先去一级缓存中查找是否有对应id的对象,如果没有再去二级缓存中查找,如果还没有则直接从数据库取出返回
3)、load()方法的流程是先去一级缓存查找,如果没有则返回一个代理对象,在真正使用到对象的时候才去二级缓存和数据库中获取
4)、通过get()、load()的对象都会缓存在一级缓存中。
5)、通过get()获取对象如果不存在则返回null,通过load()显示返回代理对象,实际使用时如果不存在则抛出异常。
注意:get()返回的不一定是实体对象,也可能是代理对象,get()方法在一级缓存中查找对象有可能是之前通过load()方法延迟加载的代理对象,此时就会直接返回这个代理对象,而不是实体对象。
-------------------------------------------------------------------------------------------------------------------------------------
6、Hibernate中list()和Iterator()的比较?
-------------------------------------------------------------------------------------------------------------------------------------
1)、 list()方式是一次性把所有结果集全部查询出来放在内存中,而iterator()是采用懒加载的形式,首先取出的是所有记录的id,如果真正访问具体对象的时候,再拿这个id去一二级缓存中查询是否存在对应对象,不存在则去数据库查找,这就是所谓N+1次查询问题。
2)、list()开销大,但查找速度快,iterator开销小,不过后期查找如果二级缓存没有或者命中率不高的话,则还得一条一条去数据库中查找,效率差。
-------------------------------------------------------------------------------------------------------------------------------------
7、Hibernate对象关联关系?
-------------------------------------------------------------------------------------------------------------------------------------
关联关系有 单向 和 双向 之分
单向:A和B两个持久化类,A类有B类的引用,通过A可以查询到关联的B,而通过B不能查询到A
双向:A和B两个互相持有对方的引用,通过A可以查询到关联的B,通过B也可以查询到关联的A
one-to-one:一对一关系(一个人User对应一个身份证卡号Code),JoinColumn用来标示外键信息
@OneToOne(cascade=CascadeType.ALL) @JoinColumn(name="code_id") public Code getCode() { return code; }
one-to-many和many-to-one在双向关系上是一样的,参照物不同罢了:一对多(一篇文章Aticle有多个评论Comment)
Aticle: private Set<Comment> comments; @OneToMany(cascade=CascadeType.ALL,fetch=FetchType.LAZY,mappedBy="aticle") public Set<Comment> getComments() { return comments; } Comment: private Aticle aticle; @ManyToOne(cascade=CascadeType.ALL) @JoinColumn(name="aticle_id") public Aticle getAticle() { return aticle; }
Many-to-Many:多对多(一篇文章属于多个分类,一个分类有多篇文章,文章Aticle和分类Category是多对多关系)
Aticle: private Set<Category> category; @ManyToMany @JoinTable( name="aticle_category", joinColumns={@JoinColumn(name="aticle_id")}, inverseJoinColumns={@JoinColumn(name="category_id")} ) public Set<Category> getCategory() { return category; } Category: private Set<Aticle> aticles; @ManyToMany(mappedBy="category",fetch=FetchType.LAZY) public Set<Aticle> getAticles() { return aticles; }
-------------------------------------------------------------------------------------------------------------------------------------
8、Hibernate中cascade和inverse定义?
-------------------------------------------------------------------------------------------------------------------------------------
1)、cascade是指一方数据变化(新增、删除、更新)另一方应该做什么反应(级联操作),比如你一篇文章如果删除了,那级联着相应的评论也应该被删除,而在进行save()操作的时候,可以通过save(aticle)就可以把aticle和Comment一起插入到表中,因为Aticle类中的comment属性中配置了CascadeType.ALL,在保存Aticle对象的时候会自动级联保存Comment对象,不过不建议在一的这方来维护对象之间的关系,一般是在多的一方来维护。
2)、inverse:是用来指定谁来维护对象之间的关系(这个关系无外乎就是外键之类的东西),在一对多的情况下,文章和评论,由谁维护关系呢?一般我们是看着文章来留言,直接comment.setAticle(aticle),当然如果执行aticle.set(Set<Comments> comment)也行,选择前者就是指让评论Comment来维护两者之间的关系,保存数据的时候保存Aticle(aticle生成持久化标示)然后再保存Comment记录(此时直接把前面aticle标示set到comment中去了),而如果选择后者,是用Aticle来维护两者之间的关系,则save(Aticle)的时候,先插入aticle(但此时comment还没有被持久化),然后插入comment(这时候comment有持久化标示了),然后还会对aticle进行update()操作。
注意:inverse:一般交由多方来维护对象之间的关系(set方法),因为如果交给一方,他会先插入一方,再插入多方,然后再把关联的多方全部更新一遍,而交由多方,在插入一方的时候已经产生一方的持久化标示,再插入多方的时候就可以直接把这个外键插入进去,不需要多余的update语句。
inverse="false"表示关系由自己维护
-------------------------------------------------------------------------------------------------------------------------------------
9、Hibernate中save()和saveOrUpdate()区别?
-------------------------------------------------------------------------------------------------------------------------------------
1)、当对象是瞬态或者是持久态时,save()和saveOrUpdate()作用都是一样的,瞬态保存持久态更新
2)、当对象是游离态时,save()会重新新增一条记录,而saveOrUpdate只会更新原有记录。
-------------------------------------------------------------------------------------------------------------------------------------
10、Hibernate抓取策略?
-------------------------------------------------------------------------------------------------------------------------------------
1)、连接抓取(join/eager):即时加载,查询主对象的时候就会把其关联对象一起查询出来,通过left outer join的方式关联两张表
2)、查询抓取(select/lazy):默认懒加载,直到对象使用的时候才发出查询语句
3)、批量抓取(batch-size),可在类中设置也可在集合中设置:遍历对象的时候原来是查一个对象发出一条sql,通过批量抓取可以设置一个值,比如10,就是每查询十个对象再发出一条sql,如果个数小于10,也发出。
-------------------------------------------------------------------------------------------------------------------------------------
11、Hibernate Annotation相关?
-------------------------------------------------------------------------------------------------------------------------------------
1)、@Entity:定义一个持久化类
2)、@Table:指定持久化类对应表信息
3)、@JoinColumn:指定对象或集合在表中的字段名(用于维护对象关系的字段)
4)、@JoinTable:中间表
5)、@joinColumns:标示中间表维护方存放外键的字段
6)、@inverseJoinColumns:标示中间表被维护方存放外键的字段
7)、@mappedBy:相当于inverse,指定谁来维护对象之间的关系,在被维护方声明。
8)、@Column:属性对应字段信息
-------------------------------------------------------------------------------------------------------------------------------------
12、Hibernate session线程安全吗?
-------------------------------------------------------------------------------------------------------------------------------------
1)、是线程安全的,在多线程的环境下,可以保证每个线程只维护自己的session,不会与其他线程的session发生交互。
2)、通过ThreadLocal实现的线程绑定机制,主要用于对共享资源的线程隔离,使每个线程都有自己独一无二的副本,线程之间互不影响。
3)、具体实现:
Thread类中有一个变量ThreadLocals,它是一个HashMap,当一个请求(线程)过来需要获取session的时候,他首先会去线程中查找这个变量,然后找这个Map是否为空,是否存在key为ThreadLocal对象的值,没有,则创建一个session然后放入到当前线程的这个Map中去,key为ThreadLocal对象,value就是这个session。
所以当下次再去请求的时候,通过ThreadLocal对象的get()方法它就会去当前线程查找Map变量里面是否存在相对应的key,存在则直接返回原有的session,不存在则创建后set()进去。
注意:ThreadLocal<Session> sessionThread= new ThreadLocal<Session>(); 这个是用来维护Session的,可以给线程绑定多个共享局部变量,假如还有一个ActionContext之类的,假如啊:那就可以写成
ThreadLocal<ActionContext> actionThread= new ThreadLocal<ActionContext>();其实Struts2中的ActionContext也是通过ThreadLocal来维护的,每个Action请求都是一个新的实例,自己拥有自己的值栈空间。
-------------------------------------------------------------------------------------------------------------------------------------
13、Hibernate数据查询的几种方式?
-------------------------------------------------------------------------------------------------------------------------------------
1)、hql语句:通过Query接口的createQuery(String hql)进行查询。
2)、原生sql:通过Query接口的createSQLQuery(String sql)来进行查询,返回的是Object[]数组。
3)、get()、load():通过主键获取相应对象
4)、条件查询:Criteria query:以面向对象的方式调用api完成查询
5)、离线查询:DetachedCriteria,脱离session创建查询,只需要创建一个session,就可以生成Criteria进行查询
-------------------------------------------------------------------------------------------------------------------------------------
14、Hibernate缓存机制?
-------------------------------------------------------------------------------------------------------------------------------------
1)、Hibernate有三种缓存,一种是一级缓存,也就是session级别的缓存,是Hibernate自带的缓存机制,通常通过load、get、或者save一个瞬态对象都会往一级缓存中存放,不过一级缓存里的对象只在session级别可以共享,因此作用并不明显,所以我们需要二级缓存,应用级别的缓存。
2)、Hibernate二级缓存一般是由第三方厂家提供的,是属于应用级别的缓存,整个应用上下文环境的session均能利用到,常见的有几个:EhCache、OsCache、JBossCache... 可按各自配置方式在项目中配置,一般首先是要在hibernate.cfg.xml配置开启二级缓存,以及二级缓存的提供商。然后加入缓存配置文件,可配置全局策略,缓存某种对象,缓存数量,缓存策略(注解或者xml)。
3)、最后一种缓存是查询缓存,默认是关闭的,可以在hibernate.cfg.xml中开启,并且在查询的时候设置setCacheable(true),如果查询语句和缓存中的语句一模一样才算命中,并且查询缓存存放的是对应数据的id,命中后拿着这些id去一二级缓存中查找,如果没有还是要去数据库查询。
注意:一级缓存中的对象在session.close()之后就自动清除了。而且一级缓存可能出现内存溢出的现象,比如大批量新增数据,此时每次save()就会往一级缓存中加入一个对象,如果大批量save(),一级缓存中的对象占用的内存就有可能溢出,所以可以通过定量的session.flush() session.clear()持久化后清理掉,又或者直接通过sessino.evcit(Object o)直接清理指定对象。
什么对象放二级缓存:不常改变的数据、常量数据、不会被并发访问的数据、不是很重要的数据,也就是说首先不要频繁改动,不然缓存的数据一会一会就失效就没意义了,还有一个就是不能是频繁并发访问的数据或者是重要的数据,如果频繁的并发访问,可能出现数据不同步的情况,因为从缓存中取出的数据有可能出现脏读。
-------------------------------------------------------------------------------------------------------------------------------------
15、Hibernate主键生成策略?
-------------------------------------------------------------------------------------------------------------------------------------
1)、native:根据底层数据库的能力,从identity、sequence、hilo任选一个
2)、sequence:通过设置一个序列来生成主键,Oracle常用
3)、uuid:通过uuid算法生成一个全球唯一的32位字符串
4)、identify:自动增长,Oracle不支持自增字段,mySql常用
5)、foreign:使用外部表字段作为主键
6)、increment:自增长,由hibernate自己维护
7)、assigned:自己指定id,save一个对象时set一个id
8)、hilo:高地位算法生成的标识符,一个数据库是唯一的
-------------------------------------------------------------------------------------------------------------------------------------
16、Hibernate如何延迟加载?
-------------------------------------------------------------------------------------------------------------------------------------
1)、lazy="true"
2)、fetch="select"
-------------------------------------------------------------------------------------------------------------------------------------
17、Hibernate分页实现?
-------------------------------------------------------------------------------------------------------------------------------------
1)、通过Query接口的setFirstResult()和setMaxResult()来进行查询,显示结果集的起始行和查询数据数量
2)、通过条件查询Criteria的setFirstResult()和setMaxResult()
注意:Oracle的分页sql一般是:
select aa.user_id,aa.user_name from (select user_id,user_name,rownum rn from core_user where rownum<"截止位") aa where aa.rn>“起始位”
-------------------------------------------------------------------------------------------------------------------------------------
18、Hibernate的openSessionView问题?
-------------------------------------------------------------------------------------------------------------------------------------
1)、由于Hibernate有延迟加载的机制,所以会出现一种这样的情况,比如说访问一篇文章,先是发出一个请求到Action层,Action层会去调用Sevice层的getAticleById()方法,Service层中再调用Dao层的get()方法,此时Hibernate Session是在Dao层开启并在Dao层该方法结束后关闭的,像之前的例子,一篇文章有多篇评论,但是程序中设置成了延迟加载,所以Dao层返回回来的Aticle对象中的Comment只是个代理对象,所以最后这个Aticle返回到页面显示的时候,如果我们去获取这篇文章的评论它才会去查询数据库。但此时Session已经关闭了,所以会报错。
2)、解决的办法:Spring提供了OpenSessionInViewFilter这个过滤器来解决这个问题,它的主要功能就是把Hibernate Session和一个请求的线程绑定在一起,直到页面完整输出,这样就可以保证页面读取数据的时候Session一直是开启的状态,如果去获取延迟加载对象也不会报错。
3)、问题:使用了OpenSessionInViewFilter之后,一个完整的请求过程是这样的,请求----获取Session、开启事务----业务逻辑处理-----jsp、freemarker页面-------事务提交、Session关闭,使用OpenSessionInViewFilter之后,Session的生命周期从原来Dao层覆盖到整个请求过程,虽然解决了延迟加载的问题,但是如果在业务处理阶段大批量处理数据,有可能导致一级缓存里的对象占用内存过多导致内存溢出,另外一个是连接问题,Session和数据库Connection是绑定在一起的,如果业务处理缓慢也会导致数据库连接得不到及时的释放,造成连接池连接不够。
4)、配置Filter的时候要放在struts2过滤器的前面,因为它要页面完全显示完后再退出。
注意:使用openSessionInViewFilter之后因为Session在过滤器中已经创建好,所以Dao层获取session的时候使用getCurrentSession()来获取,而不要用openSession()。
-------------------------------------------------------------------------------------------------------------------------------------
19、Hibernate中getCurrentSession()和openSession()的区别?
-------------------------------------------------------------------------------------------------------------------------------------
1)、getCurrentSession()它会先查看当前线程中是否绑定了Session,如果有则直接返回,如果没有再创建,而openSession()则是直接new一个新的Session出来并返回。
2)、这里就用到ThreadLocal来实现线程session的隔离。
3)、getCurrentSession()在事务提交的时候会自动关闭Session,而openSession()需要手动关闭。
-------------------------------------------------------------------------------------------------------------------------------------
20、Hibernate的乐观锁和悲观锁?
-------------------------------------------------------------------------------------------------------------------------------------
1)、悲观锁:认为自己访问的数据很可能同时别其他事务访问,所以会对操作的数据强制加锁,自己访问的时候只能自己使用,直到事务提交。
2)、乐观锁:认为自己访问的数据不一定会同时被其他事务访问,它通过版本号或者时间戳的机制来控制数据的访问。通过@Version在字段前注释就可以实现乐观锁,当一个请求去访问这个数据它会先记住这个版本号,提交的时候如果一致则更新版本号并提交事务,如果提交的时候发现版本号和原来的不一致则抛出异常。
-------------------------------------------------------------------------------------------------------------------------------------
21、Hibernate的N/N+1问题?
-------------------------------------------------------------------------------------------------------------------------------------
1)、iterator,首先是查处记录的所有id,遍历的时候再根据id去缓存或数据库查找,如果缓存没有命中,则最后会发出1+N条sql,这里可以使用批量抓取策略,batch-size,使发送sql次数减少。
2)、查询缓存:key为查询语句,value为结果集的id,查询缓存如果命中了返回的也是id,然后拿着这些id去一二级缓存中查找,如果不存在则还是会发出N条sql语句去数据库查询。
3)、懒加载:一个对象关联N个关联对象,当关联对象是设置成懒加载方式,则遍历的时候会依次发出N次查询,还有之前查询主对象的1次,总共N+1次。
-------------------------------------------------------------------------------------------------------------------------------------
22、Hibernate的常见方法?
-------------------------------------------------------------------------------------------------------------------------------------
1)、save()方法:把一个瞬态对象持久化,如果对象多次更改属性值,则只会发出一条insert语句,如果对象先是save持久化后又更新属性值再save(),则是执行update语句。
保存一个游离态对象会新增一条记录。
持久态对象如果属性改变,不需要调用update或者save方法,因为最后事务提交的时候会刷新session自动持久化到数据库中。
save一个瞬态对象就会自动把该对象加入到一级缓存中,尽管事务还没有提交。
2)、get()、load():会从缓存中查询,然后再去数据库查询,查询出的数据也会放在一二级缓存中。
3)、delete():delete操作会删除数据库对应记录,删除后的对象和瞬态对象类似,不过它依然还有数据库标识符。如果调用save()方法或者saveOrUpdate()方法则会新增一条记录,标识符也会相应改变。
-------------------------------------------------------------------------------------------------------------------------------------
23、Hibernate中执行save()操作后,打印出的sql显示insert into语句了,但是数据库为什么查询不到?
-------------------------------------------------------------------------------------------------------------------------------------
1)、执行save()语句只是把对象持久化并保存在一级缓存中,当事务提交的时候,它会自动执行session.flush()操作同步到数据库中并插入,当然如果直接手动直接flush()一下也可以立即执行insert into语句,但是此时事务没提交,数据库还是没有这条数据,因为Hibernate默认Connection不是自动提交的。
2)、可以在hibernate.cfg.xml显示配置Connection自动提交,然后在不开启事务的情况下save()了一个对象之后手动执行session.flush(),则数据会立即插入到数据库中,不过不建议开启自动提交。
-------------------------------------------------------------------------------------------------------------------------------------
24、Hibernate批量操作?
-------------------------------------------------------------------------------------------------------------------------------------
1)、批量新增:一次新增大批量对象,避免一级缓存内存溢出,可以定时的显示flush()之后再clear()掉,如果只是flush()是不行的,缓存中的对象还是没有清除掉,还是占用了一级缓存内存。
2)、批量更新:可以通过hql来批量更新session.createQuery("update Aticle set content=:content where id > :id").setString("content","sb"),setStrubg("id","0").executeUpdate();
3)、还有一种无状态Session接口,它不会实现一二级缓存查询缓存交互,查询后的对象立即处于游离态,通过update或者delete可以操作并同步到数据库中。
-------------------------------------------------------------------------------------------------------------------------------------
25、Hibernate拦截器?
-------------------------------------------------------------------------------------------------------------------------------------
1)、Hibernate提供了对对象操作前台的一种拦截机制,继承EmptyInteceptor类,覆写其中的onSave()、onFlushDirty()之类的方法,然后在创建session的时候加载这个自定义的拦截器,对象在保存或者flush的时候就会先进入这个拦截器做相应的操作。
2)、还提供了事件监听机制来实现同样的功能。
-------------------------------------------------------------------------------------------------------------------------------------
26、什么是Hibernate,与传统JDBC的区别,优缺点?
-------------------------------------------------------------------------------------------------------------------------------------
-------------------------------------------------------------------------------------------------------------------------------------
27、HQL语句实例?
-------------------------------------------------------------------------------------------------------------------------------------
1)、hql支持delete、update、select,insert语句只支持insert into select ... from ... ,不支持insert into .. values(...)。
2)、
-------------------------------------------------------------------------------------------------------------------------------------
28、Hibernate优化建议?
-------------------------------------------------------------------------------------------------------------------------------------
-------------------------------------------------------------------------------------------------------------------------------------
29、Hibernate事务控制?
-------------------------------------------------------------------------------------------------------------------------------------
-------------------------------------------------------------------------------------------------------------------------------------
相关推荐
Hibernate面试题部分汇总集合Hibernate面试题部分汇总集合
【hibernate面试题2】涉及了许多关于Hibernate框架的核心知识点,包括检索策略、SQL日志显示、缓存策略以及Hibernate与其他技术(如Spring和Struts)的整合。下面将逐一详细解析这些概念。 1. **Hibernate检索策略*...
### 常见Hibernate面试题知识点详解 #### 1. Hibernate查询数据的方式 - **导航对象图查询**:这是最基本的查询方式之一,适用于查询对象之间的关联关系。通过已知对象来导航到其他对象,比如通过一个`User`对象...
### Hibernate面试题详解 #### 1. Hibernate中的关系类型 题目描述了一种关系选择题,但实际给出的信息并不清晰。不过,根据选项推测,此题意在考察Hibernate中实体间的关系类型。 - **一对一 (One-to-One)** - *...
【标题】与【描述】提及的是“Hibernate面试题专栏”,主要涵盖了全面的Hibernate面试题、笔试题以及相关问题,这表明我们将要讨论的是Java领域中著名的对象关系映射框架——Hibernate的相关知识。Hibernate是一个...
【标题】:“尚硅谷_佟刚_Hibernate面试题分析” 【描述】提到的资源是针对Hibernate框架的一份面试题分析资料,由尚硅谷教育机构的讲师佟刚提供。该资源可能包含了对Hibernate在实际开发中常见问题的解答,以及...
【知识点详解】 ...综上所述,Hibernate是一个强大的ORM框架,能够有效地处理对象与数据库之间的映射,优化查询性能,以及管理对象的状态。理解和熟练运用这些知识点对于开发基于Java的数据库应用程序至关重要。
### Hibernate面试题详解 #### 一、主键生成方式中的`native`与`identity`区别 **1.1 native方式** - **定义**: `native`是一种动态选择标识符生成策略的方式,它根据所使用的底层数据库系统自动选择最适合的生成...
### Hibernate面试题及答案大集合解析 #### 1. 关系数据模型与对象模型之间的匹配关系 - **选项分析**: - A) 表对应类:正确。在ORM(对象关系映射)中,数据库中的每一张表通常对应着Java中的一个类。 - B) ...
### Hibernate框架概述 #### 1. Hibernate框架定义与特点 - **定义**:Hibernate是一个开源的对象关系映射(ORM)框架,它为Java应用程序提供了一种简单高效的方式来处理数据库交互。通过将Java对象与数据库表建立...
《Hibernate面试题分析》 在Java开发领域,Hibernate作为一个强大的对象关系映射(ORM)框架,始终占据着举足轻重的地位。对于求职者来说,掌握Hibernate的基本概念、使用技巧以及常见问题的解决方法,是面试中必不...
在Java Web开发中,Struts、Spring和Hibernate是最常见的三大框架,它们...以上就是关于Struts、Spring和Hibernate面试题的详细解析,涵盖了这三大框架的关键概念和使用技巧,对于理解和解答相关面试问题非常有帮助。
Hibernate是Java领域中一款流行的持久...以上就是Hibernate面试中常见的问题和答案,涵盖了基本概念、缓存策略、查询方式以及事务和数据访问等方面的知识点。理解并掌握这些内容对于深入学习和使用Hibernate至关重要。
【hibernate面试题总汇】 hibernate 是一个强大的对象关系映射(ORM)框架,它的核心功能在于将Java对象的数据映射到关系数据库中,使得开发人员能够以面向对象的方式来处理数据库操作,而无需过多关注底层的SQL...
1. Hibernate 的检索方式有哪些 ? 2. 在 Hibernate 中 Java 对象的状态有哪些 ? 3. Session的清理和清空有什么区别? 4. load()和get()的区别 5. hibernate 优缺点......
一、Hibernate面试题分析: 1. Hibernate是什么?它与JDBC有什么区别? Hibernate是一个对象关系映射(ORM)框架,它将数据库操作转化为对Java对象的操作,简化了数据访问。与JDBC相比,Hibernate提供了更高级别的...