`

《深入浅出Hibernate》书中的一个错误,误导了我好久。

    博客分类:
  • Java
阅读更多
后来想了想,有可能是因为hibernate的版本不一样吧,忘了在这说了。谢谢xujunJ2EE同学提醒。暂时没有时间去测试3.0的版本了。下面的内容是在hibernate3.2下测试的


3.load方法可以充分利用内部缓存和二级缓存的现有数据,而get方法则仅仅在内部缓存中进行数据查找,如没有发现对应数据,将越过二级缓存,直接调用SQL完成数据读取。
==========================================
以上是深入浅出Hibernate一书第245页中的一部分。
以前因为读过这本书,所以没有使用过get()方法,一直用load()。这两天认真的重新读了一遍,并且做了试验,发现这一句有误。我写了代码测试了,两个不同session中对同一条记录的查询动作,不论是get还是load,都只输出一句sql,也就是说get和load都利用到了二级缓存。

附上测试代码:
TestCase(JUnit4)
package test.hibernate;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import test.hibernate.entity.Member;

/**
 * @(#)HibernateTest.java 2008-6-21 下午04:43:55
 * 
 * @author Yuan
 * 类说明
 */
public class HibernateTest {

	private static SessionFactory sessionFactory;
	
	private static Session session;
	
	@Before
	public void setUp(){
		sessionFactory = new Configuration().configure().buildSessionFactory();
	}
	
	@After
	public void tearDown(){
		sessionFactory.close();
	}
	/**
	 * 测试Session.load()
	 */
	@Test
	public void testLoad(){
		System.out.println("**********************Load**********************");
		
		openSessionAndBeginTransaction();
		((Member)session.load(Member.class, "402880b31aab576f011aab5771bc0005")).getMemberName();
		commitTransactionAndCloseSession();
		
		openSessionAndBeginTransaction();
		((Member)session.load(Member.class, "402880b31aab576f011aab5771bc0005")).getMemberName();
		commitTransactionAndCloseSession();
	}
	
	/**
	 * 测试Session.get()
	 */
	@Test
	public void testGet(){
		System.out.println("**********************Get**********************");
		
		openSessionAndBeginTransaction();
		session.get(Member.class, "402880b31aab576f011aab5771bc0005");
		commitTransactionAndCloseSession();
		
		openSessionAndBeginTransaction();
		session.get(Member.class, "402880b31aab576f011aab5771bc0005");
		commitTransactionAndCloseSession();
	}
	
	private void openSessionAndBeginTransaction(){
		session = sessionFactory.openSession();
		session.beginTransaction();
	}
	
	private void commitTransactionAndCloseSession(){
		session.getTransaction().commit();
		session.flush();
		session.close();
	}
}

Entity
package test.hibernate.entity;

import java.io.Serializable;

/**
 * @(#)Member.java 2008-6-21 下午04:47:26
 * 
 * @author Yuan
 * Member Entity
 */
public class Member implements Serializable {

	private static final long serialVersionUID = 3667540833969806410L;

	private String memberID;
	
	private String memberName;
	
	private String password;
	
	private String realName;

	public String getMemberID() {
		return memberID;
	}

	public void setMemberID(String memberID) {
		this.memberID = memberID;
	}

	public String getMemberName() {
		return memberName;
	}

	public void setMemberName(String memberName) {
		this.memberName = memberName;
	}

	public String getPassword() {
		return password;
	}

	public void setPassword(String password) {
		this.password = password;
	}

	public String getRealName() {
		return realName;
	}

	public void setRealName(String realName) {
		this.realName = realName;
	}
}

Member.hbm.xml
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
	<class name="test.hibernate.entity.Member" table="t_member">
		<cache usage="read-write"/>
		<id name="memberID" type="string" length="32">
			<generator class="uuid"/>
		</id>
		<property name="memberName" type="string" length="32" not-null="true"/>
		<property name="password" type="string" length="32" not-null="true"/>
		<property name="realName" type="string" length="32"/>
	</class>
</hibernate-mapping>

hibernate.cfg.xml
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
	"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
	"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
	<session-factory>
		<property name="hibernate.connection.url">
			jdbc:mysql://127.0.0.1:3306/test
		</property>
		
		<property name="hibernate.connection.driver_class">
			com.mysql.jdbc.Driver
		</property>
		
		<property name="hibernate.dialect">
			org.hibernate.dialect.MySQL5InnoDBDialect
		</property>
		
		<property name="hibernate.connection.username">root</property>
		
		<property name="hibernate.connection.password">******</property>
		
		<property name="hibernate.show_sql">true</property>
		
		<property name="hibernate.cache.provider_class">
			net.sf.ehcache.hibernate.EhCacheProvider
		</property>
		
		<!--property name="hibernate.hbm2ddl.auto">
			create
		</property-->
		
		<mapping resource="test/hibernate/entity/Member.hbm.xml"/>
	</session-factory>
</hibernate-configuration>

ehcache.xml
<?xml version="1.0" encoding="utf-8"?>
<ehcache>
	<diskStore path = "java.io.tmpdir"/>
	<defaultCache
		maxElementsInMemory="10000"
		eternal="false"
		timeToIdleSeconds="120"
		timeToLiveSeconds="120"
		overflowToDisk="true"/>
</ehcache>
分享到:
评论
2 楼 yuan 2009-08-21  
嗯,这个我后来有想到,忘了补上了。
1 楼 xujunJ2EE 2009-08-21  
hibernate版本不一样而已,夏昕使用的hibernate的时候,get还没有利用缓存,所以你能说他错了吗

相关推荐

    深入浅出 Hibernate.pdf

    根据提供的标题“深入浅出 Hibernate.pdf”以及描述“深入浅出 Hibernate.pdf”,我们可以推断这份文档主要讲解了Hibernate框架的相关知识。接下来,我们将基于这些信息展开详细的解释与知识点的梳理。 ### ...

    深入浅出hibernate清晰版

    深入浅出hibernate 清晰版

    《深入浅出Hibernate》读书笔记

    《深入浅出Hibernate》这本书是关于Java ORM框架Hibernate的深度解析。读书笔记主要涉及了实体对象的生命周期、实体对象的识别以及数据缓存这三大核心概念。 首先,实体对象的生命周期是Hibernate中至关重要的概念...

    深入浅出hibernate

    夏昕的 深入浅出Hibernate&gt;&gt;是一本非常不错的解析Hibernate的书籍

    .深入浅出Hibernate

    深入浅出Hibernate

    深入浅出Hibernate(PDF)第二部分

    本书内容深入浅出,先讲述持久层设计与ORM,再由Hibernate概述、Hibernate基础Hibernate高级特性顺序展开,直至Hibernate实战,重点讲述了Hibernate的基础语法、基础配置、O/R映射、数据关联、数据检索、HQL实用技术...

    深入浅出hibernate(PDF)第三部分

    本书内容深入浅出,先讲述持久层设计与ORM,再由Hibernate概述、Hibernate基础Hibernate高级特性顺序展开,直至Hibernate实战,重点讲述了Hibernate的基础语法、基础配置、O/R映射、数据关联、数据检索、HQL实用技术...

    夏昕.深入浅出Hibernate.rar

    Hibernate是一个开源的对象关系映射(ORM)框架,它极大地简化了Java应用程序对数据库的操作,通过将Java对象与数据库表之间的映射关系进行抽象,使得开发人员可以专注于业务逻辑,而无需过多关注底层的SQL操作。...

    《深入浅出Hibernate》.pdf

    《深入浅出Hibernate》这本书是针对初学者设计的,旨在帮助读者快速掌握Hibernate这一流行的Java对象关系映射(ORM)框架。Hibernate是一个强大的工具,它简化了Java应用程序与数据库之间的交互,通过提供一种抽象...

    深入浅出Hibernate

    深入浅出Hibernate 作者:夏昕 曹晓刚 7Z压缩:分包一大小18mb、分包二4mb 使用:把两个压缩包一起解压就可以了

    深入浅出Hibernate.pdf

    尽管提供的“部分内容”并未直接涉及Hibernate的具体内容,但基于标题与描述中提到的“深入浅出Hibernate”,我们可以围绕Hibernate这一主题进行展开。 ### Hibernate简介 Hibernate是一个开源的对象关系映射...

    深入浅出Hibernate源码

    9, 在您的Eclipse 3中,按照书中的步骤安装hibernate synchronizer. 10,在您的eclipse中,建立两个User Library: 菜单window -&gt; preference -&gt; Java -&gt; Build Path -&gt; User Librarys,分别建立名为Hibernate2,...

    深入浅出Hibernate(第二部分,共两部分).pdf

    深入浅出 Hibernate 电子书 中文

    深入浅出Hibernate完整版1

    深入浅出Hibernate完整版,除了资料外,还包括PPT和类型映射关系图

    深入浅出hibernate,需要的下载

    《深入浅出Hibernate》这本书是Hibernate技术学习的重要参考资料,它为读者提供了全面、深入的Hibernate框架理解。Hibernate是一个开源的对象关系映射(ORM)框架,它简化了Java应用程序与数据库之间的交互,使得...

    夏昕.深入浅出Hibernate

    《深入浅出Hibernate》是夏昕撰写的一本关于Java持久化框架Hibernate的专业书籍。Hibernate作为一款流行的ORM(对象关系映射)工具,是Java开发者在处理数据库操作时的重要选择。这本书详细介绍了Hibernate的核心...

    深入浅出HIbernate (加标签)1

    加了标签的《深入浅出HIbernate》,方便阅读和查找。

    深入浅出hibernate 完整pdf

    part1 一个2个 目前网上能找到最好的中文hibernate教程

    深入浅出Hibernate(PDF)夏昕.part 04

    深入浅出Hibernate(PDF)+夏昕(31.1M.pdf)

Global site tag (gtag.js) - Google Analytics