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“的运行效果。