1、Session的概念.
a) Session只是对connection做了近一部封装,虽然做了封装,但是当你open时,它不一定open了connection,而是从连接池里获取了一个connection.
b) Session还负责管理了缓存.
c) Session用完之后必须关闭,一般一个业务对应一个session,而且session不是线程安全的.
2、给我谈谈OpenSessionInView?
a) OpenSessionInView最主要的功能就是使Session一直打开(使lazy失效),如果不这样的话,lazy的实现机制就是当用到数据时才去真正的加载数据,如果此时session已经关闭的话,Hibernate会抛出异常,当你使用了OpenSessionInView它会使Session一直打开的.
b) OpenSessionInView的实现是采用Filter,在处理请求时候打开session,当请求全部处理完成,服务器返回给客户端信息时候,关闭session.
3、如何解决懒加载抛出异常的问题?
a) 方法一:偷懒的做法就是使用OpenSessionInView,这样可以使Session一直被打开.
b) 方法二:例如我们现在在呈现层要显示人员列表信息,只需要显示人员的姓名,年龄,职位,但是不幸,数据库的字段却有100个,当然,我们可以使用from Person,在页面使用,但是这样性能会大大的消耗.最实际的做法,就是需要什么就查询什么,在页面直接显示出来即可,这样完全可以不使用OpenSessionInView.
4、谈谈为什么会产生N+1?
a) 产生N+1的问题是因为使用query.iterator()使用的不当.
b) Iterator它Load对象时,会发出n+1条SQL语句,第一条会加载所有对象的主键,然后根据主键加载对应的实体,当然,有多少个主键,它就会发送多少条SQL.
5、谈谈query.list() 和 query.iterator().
a) list每次都会发出sql语句,list不会使用缓存的数据,但是它会把查询的数据存储进缓存.
b) iterator在默认情况下,它会利用缓存,但是如果缓存不存在数据,有可能出现N+1问题.
6、谈谈inverse / lazy / cacsde.
a) inverse,一般在one-to-many双向关联的情况下使用,一般都会在一的一方加上inverse关键字,inverse就代表把关系交给多的一方来维护,这样可以大大的提高性能.
例如:现在有班级和学生,关系为1对多.现在如果要加入1个班级和2个学生,它会出现一些问题,你插入多少个学生,它就会发出多少条update语句,因为你insert学生的时候,它并不知道自己属于哪个班级的,首先将该字段的值默认为null,然后最后来更新.所以一般都要使用inverse,使1的一方维护权失效,交给多的一方来维护.
如果不使用inverse就相当于让姚明记13Y中国人的名字一样,所以我们最好采用13Y人来记姚明.
b) lazy,延迟加载,使用lazy可以大大的维护系统的性能,使用了lazy以后,只有当我真正的使用时,它才会发出SQL来加载对象.
i. 例如:现在有班级和学生,当我查询班级时,此时我并不想查询班级对应的学生,如果在这里,不使用lazy的话,它会直接帮你把班级对应的学生也加载上来, 如果现在有1万个学生呢?它会理所当然的帮你全部加载上来,这样的话,性能就可向而知了.
c) cascade级联操作,加上cascade会产生连锁上的反应.
i. 举个最简单的例子:还是班级和学生,我现在要删除一个班级,如果我没使用cascade关键字的话,必须亲自去先删除和班级关联的学生,再来删除班级,不然的话,Hibernate会直接抛出异常,因为还有表在引用它,如果加了cascade的话,它会首先根据加载主键的id,删除对应这个班级的这个学生,然后在删除班级.
7、请谈谈你对一级缓存,二级缓存,以及查询缓存的看法.
a) 一级缓存:可以称为session级缓存或者事物级缓存,它的声明周期主要是跟随session存在而存在,session消逝即消逝.
i. 从两个方面来说明一级缓存.
ii. 查询实体对象:Iterator查询时,首先会看一级缓存里到底有没有,List不会使用一级缓存,但是结果会存在在一级缓存里.
iii. 查询普通属性:Iterator查询时,你查询多少次,它会发送多少次SQL语句,不会使用一级缓存,查询结果也不会存放在一级缓存里.
iv. 结论:一级缓存主要就是存放实体对象的,只有查询,迭代实体对象时,它才会去看看一级缓存里有没有,普通属性则不会.
b) 二级缓存:可以称为SessionFactory级缓存或者称为进程级缓存,它的声明周期和SessionFactory是一样的,它可以被所有的session共享,它的特性也是只缓存实体对象.
c) 查询缓存:如果当前表发生了任何操作,查询缓存立刻立即消息.它是针对普通结果集的缓存,对待实体对象,只缓存ID.
i. 查询缓存对Iterator没有任何效果,Iterator在查询普通属性,没有使用缓存.只对List有效果.
ii. 查询实体数据,也是只对List有效果,Hibernate会根据实体对象的id去查询实体,如果缓存中存在相应的实体,则不继续查询,否则发出SQL语句加载对象.
8、谈谈并发控制.
a) 并发控制包括悲观锁定,乐观锁定.
i. 悲观锁定,分享到:
相关推荐
然而,由于其内部的映射和对象创建过程,对于大量数据操作,Hibernate可能会比JDBC慢一些,尤其是在使用Iterator遍历大数据集时。 在性能方面,JDBC通常在数据读写速度上占有优势,特别是当使用批处理时。而...
1. **数据持久化**: 对于常规的CRUD操作和复杂的业务逻辑,可以使用Hibernate,它能够自动处理对象的持久化,简化代码,提高开发效率。 2. **性能优化**: 对于大数据量的查询或者需要进行复杂SQL操作的部分,可以...
描述中提到的“下载速度太慢”,暗示了可能在官方源或者其他常规渠道下载该版本时遇到了网络问题,所以提供了另一种下载途径。 **关于Hibernate的知识点** 1. **对象关系映射(ORM)**: Hibernate作为ORM框架,...
由于提供的【标题】和【描述】内容完全相同,且信息量较少,【部分内容】中提供的信息也仅是标题重复和版本号...由于提供的信息有限,以上知识点是基于对Hibernate框架的理解和常规介绍。希望这些信息对您有所帮助。
虽然具体的文件列表没有提供,但根据常规的Hibernate和MySQL开发环境,我们可以推测压缩包中可能包含以下内容: 1. Hibernate的核心库JAR文件(如hibernate-core.jar) 2. MySQL的Java连接驱动(mysql-connector-...
在“hibernate应用包”中,我们通常会发现与Hibernate框架相关的各类库和配置文件,特别是关于注解(Annotation)的使用部分。注解是Java语言的一个重要特性,它允许开发者在源代码中嵌入元数据,使得框架能够自动...
Oracle的Clob数据类型...此外,对于非常大的Clob数据,可能需要分段读取和写入,以避免一次性处理大量数据带来的性能问题。理解并熟练掌握Clob在Hibernate中的处理方式,对于开发高效且稳定的数据库应用程序至关重要。
例如,可能有一个名为"defaultDataSource"的数据源用于常规业务操作,另一个名为"auditDataSource"的数据源用于审计记录。 实现多数据源的关键步骤包括: 1. 配置多个DataSource实例,每个实例对应一个数据库。 2. ...
在常规配置中,我们通常只配置一个数据库连接。但在多数据库连接的场景下,我们需要为每个数据库创建独立的`sessionFactory`。每个`sessionFactory`对应一个`<hibernate-configuration>`标签,里面包含与特定数据库...
但需要注意的是,这种方式可能会丢失一些Hibernate的自动转换和事务管理功能。 总结,Hibernate提供了多种查询方式以适应不同场景的需求。HQL适用于大多数常规查询,其面向对象的特性使代码更易于理解。Criteria ...
但根据常规做法,集成步骤通常包括以下几个部分: 1. 添加Spring和Hibernate的依赖库到项目中。 2. 配置Hibernate的session工厂或entity manager工厂。 3. 创建DAO接口及其实现类,使用HibernateTemplate或JPA的...
### 批量更新的常规方法 在Hibernate中,最直观的批量更新方式是通过循环遍历查询结果集,并对每个实体进行更新,然后提交事务。例如: ```java Transaction tx = session.beginTransaction(); Iterator<Customer>...
Hibernate是一个开源的ORM框架,它的主要目标是为了解决在Java应用程序中处理关系数据库时遇到的问题。通过ORM,Hibernate将数据库中的表映射成Java对象,使得开发者可以使用面向对象的方式来操作数据库,而无需编写...
因此,我们将基于常规的Hibernate缓存知识进行解释。 **一、Hibernate一级缓存** 一级缓存是每个Hibernate Session内的缓存,它是一个内存中的对象图,存储了最近查询到的持久化对象。当我们在Session中执行CRUD...
在`hibernate.cfg.xml`配置文件中,除了常规配置外,还需要添加一个资源路径,指向包含SQL文件的目录。 2. **读取SQL文件**:在Java代码中,使用`java.io`或`org.springframework.core.io`等类库读取SQL文件。例如...
6. **Criteria查询和HQL**:除了常规的SQL查询,Hibernate提供了Criteria API和HQL(Hibernate Query Language),它们是面向对象的查询方式,更符合面向对象编程的思维。 7. **事务管理**:Hibernate支持事务处理...
Hibernate的主要目标是使开发者在数据持久化相关的编程任务中解脱出来,大约95%的常规任务可以由Hibernate自动处理。尽管对于完全依赖数据库存储过程实现业务逻辑的数据密集型应用程序,Hibernate可能不是最佳选择,...
在引入依赖时,除了常规的Hibernate JAR包,还需要加入Hibernate Annotations的JAR包,即`hibernate-annotations.jar`,以及`hibernate-commons-annotations.jar`和`persistence-api.jar`等,这些包提供了注解的支持...
3. 最后,定义`Person`实体,主键是常规的自动增长ID,但包含对`Passport`的引用: ```java import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType;...
- 不推荐常规使用,因为这增加了开发者的负担。 #### 三、increment - 自动递增 **定义:** `increment`策略允许Hibernate从数据库中获取当前最大主键值,并在此基础上每次增加1来生成新的主键值。该策略在内存中...