HIbernate的“1+N”问题

HibernateTest.java

代码:

/**  *  */ package com.b510.examples;

import java.util.Iterator;

import org.hibernate.Query; import org.hibernate.Session; import org.hibernate.Transaction;

/**  *  * @author XHW  *  * @date 2011-7-18  *  */ public class HibernateTest {  public static void main(String[] args) {   new HibernateTest().update();  }

 public void update() {   Session session = HibernateSessionFactoryUtil.getSessionFactory()     .getCurrentSession();   Transaction tx = session.beginTransaction();

  Query query = session.createQuery("from Product");   Iterator it=query.iterate();   while(it.hasNext()){    Product p=(Product)it.next();    System.out.println("id:"+p.getId()+"   name:"+p.getName());   }   tx.commit();  }

}

运行效果:

log4j:WARN No appenders could be found for logger (org.hibernate.cfg.Environment). log4j:WARN Please initialize the log4j system properly. Hibernate:     select         product0_.id as col_0_0_     from         users.product product0_ Hibernate:     select         product0_.id as id0_0_,         product0_.category_id as category2_0_0_,         product0_.name as name0_0_,         product0_.price as price0_0_,         product0_.descripton as descripton0_0_     from         users.product product0_     where         product0_.id=? id:1   name:java SE应用程序设计 Hibernate:     select         product0_.id as id0_0_,         product0_.category_id as category2_0_0_,         product0_.name as name0_0_,         product0_.price as price0_0_,         product0_.descripton as descripton0_0_     from         users.product product0_     where         product0_.id=? id:3   name:java  web Hibernate Hibernate:     select         product0_.id as id0_0_,         product0_.category_id as category2_0_0_,         product0_.name as name0_0_,         product0_.price as price0_0_,         product0_.descripton as descripton0_0_     from         users.product product0_     where         product0_.id=? id:4   name:HIbernate Hibernate:     select         product0_.id as id0_0_,         product0_.category_id as category2_0_0_,         product0_.name as name0_0_,         product0_.price as price0_0_,         product0_.descripton as descripton0_0_     from         users.product product0_     where         product0_.id=? id:5   name:Hibernate2 Hibernate:     select         product0_.id as id0_0_,         product0_.category_id as category2_0_0_,         product0_.name as name0_0_,         product0_.price as price0_0_,         product0_.descripton as descripton0_0_     from         users.product product0_     where         product0_.id=? id:6   name:hibernate3 Hibernate:     select         product0_.id as id0_0_,         product0_.category_id as category2_0_0_,         product0_.name as name0_0_,         product0_.price as price0_0_,         product0_.descripton as descripton0_0_     from         users.product product0_     where         product0_.id=? id:7   name:hibernate4 Hibernate:     select         product0_.id as id0_0_,         product0_.category_id as category2_0_0_,         product0_.name as name0_0_,         product0_.price as price0_0_,         product0_.descripton as descripton0_0_     from         users.product product0_     where         product0_.id=? id:8   name:hibernate5 Hibernate:     select         product0_.id as id0_0_,         product0_.category_id as category2_0_0_,         product0_.name as name0_0_,         product0_.price as price0_0_,         product0_.descripton as descripton0_0_     from         users.product product0_     where         product0_.id=? id:2   name:java WEB开发与实战

我们明明要查询7条记录,但是hibernate用的是8条selelct语句

为什么会出现这种情况呢?

这个主要是hibernate考虑到了一级和二级缓存的效果, 如果缓存中有我们要查询的数据

那么这时我们就不用到数据库中去查询数据,而是直接从缓存中读取我们需要的数据。这就大大

提高了我们程序的运行效率。

但是一旦缓存中没有我们需要的数据,那么这时hibernate就会向数据库发出请求,所以我们看到上面的

运行效果会出现“1+N”的效果;(说明缓存中并没有我们要查询的 数据)

我们要避免这种问题,方法:

测试代码:

HibernateTest.java

代码:

/**  *  */ package com.b510.examples;

import java.util.List;

import org.hibernate.Query; import org.hibernate.Session; import org.hibernate.Transaction;

/**  *  * @author XHW  *  * @date 2011-7-18  *  */ public class HibernateTest {  public static void main(String[] args) {   new HibernateTest().update();  }

 public void update() {   Session session = HibernateSessionFactoryUtil.getSessionFactory()     .getCurrentSession();   Transaction tx = session.beginTransaction();

  Query query = session.createQuery("from Product");  List<Product> list=query.list();   for(Product p:list){    System.out.println("id:"+p.getId()+"  name :"+p.getName() );   }   tx.commit();  }

}

运行效果:

log4j:WARN No appenders could be found for logger (org.hibernate.cfg.Environment). log4j:WARN Please initialize the log4j system properly. Hibernate:     select         product0_.id as id0_,         product0_.category_id as category2_0_,         product0_.name as name0_,         product0_.price as price0_,         product0_.descripton as descripton0_     from         users.product product0_ id:1  name :java SE应用程序设计 id:2  name :java WEB开发与实战 id:3  name :java  web Hibernate id:4  name :HIbernate id:5  name :Hibernate2 id:6  name :hibernate3 id:7  name :hibernate4 id:8  name :hibernate5

我们用List的时候,”1+N“的方法,就会解决,而List是只从数据库中读取数据,不会

到缓存中读取数据,但是list会把从数据库中读取的数据放入到缓存中,而Iterator则是先查询缓存

,如果缓存中有我们需要的数据,那么,这时就读取缓存。如果缓存中没有我们需要的数据,即:没有命中

这时再向数据库发出请求。所以会有”1+N“的运行效果。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏C/C++基础

CMake简介及使用实例

CMake是一个跨平台的建构系统的工具,可以用简单的语句来描述所有平台的安装(编译过程)。他能够输出各种各样的构建文档makefile或者project文件,描...

20320
来自专栏aoho求索

Spring Cloud Stream应用与自定义RocketMQ Binder:实现RocketMQ绑定器

前言: 本文作者张天,节选自笔者与其合著的《Spring Cloud微服务架构进阶》,即将在八月出版问世。本文将其中Spring Cloud Stream应用与...

37430
来自专栏Linyb极客之路

SpringBoot中REST API的错误异常处理设计

1.3K30
来自专栏IT 指南者专栏

Spring框架系列(二)之Bean的注解管理

微信公众号:compassblog 欢迎关注、转发,互相学习,共同进步! 有任何问题,请后台留言联系! 1、Spring中的两种容器 在系列(一)中我们已经知道...

34960
来自专栏IT笔记

SpringBoot开发案例之整合Dubbo提供者(一)

既然是开发案例,显然不会扯那么多老婆舌,有不清楚这两个东东的请自行百度。 ? 0.jpg 开发环境 JDK1.7、Maven、Eclipse、SpringBoo...

451130
来自专栏猿天地

知识点-Spring Boot 统一异常处理汇总

上面讲的是做页面开发的时候遇到的问题,还有一种情况就是用来开发Rest接口,当错误的时候我们希望返回给用户的是我们接口的标准格式,不是返回一段html代码。

16120
来自专栏帅小子的日常

使用redis做缓存

82670
来自专栏青青天空树

spring基础(2:最小化XML配置)

  byType在出现多个匹配项时不会自动选择一个然是报错,为避免报错,有两种办法:1.使用<bean>元素的primary属性,设置为首选Bean,但所有be...

11020
来自专栏代码拾遗

深入理解Spring MVC

使用Spring Boot和web,thymeleaf的starter来设置初始工程。xml配置如下:

12220
来自专栏玩转JavaEE

Spring Cloud中Hystrix的请求缓存

高并发环境下如果能处理好缓存就可以有效的减小服务器的压力,Java中有许多非常好用的缓存工具,比如Redis、EHCache等,当然在Spring Cloud的...

37380

扫码关注云+社区

领取腾讯云代金券