`
ddzero
  • 浏览: 7305 次
  • 性别: Icon_minigender_1
  • 来自: 厦门
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

HibernateTemplate与HibernateDaoSupport分析

阅读更多

HibernateTemplate是Spring当中一个很方便的类,主要用于Hibernate中的DAO类中,对数据库记录进行直接操作,常用方法有(这里偷个懒,不把重载方法都一一列出来了,只有方法名以及简单功能介绍):

get                       从数据库相关表中获取一条记录并封装返回一个对象(Object)

load                     作用与get基本相同,不过只有在对该对象的数据实际调用时,才会去查询数据库

save                    添加记录

saveOrUpdate     判断相应记录是否已存在,据此进行添加或修改记录

update                修改记录

delete                 删除记录

 

HibernateTemplate介绍就到这里,接下来我们考虑其使用。

既然是Spring,我们当然要用到IOC了(不知道IOC?问谷老师去!),注入次序是:

DataSource -> SessionFactory -> HibernateTemplate -> DAO

 

以下是相关代码:

applicationContext.xml

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
		<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
		<property name="url" value="jdbc:mysql://localhost:3306/myDB"/>
		<property name="username" value="root"/>
		<property name="password" value="abc"/>
 	</bean>
 	
 	<bean id="sessionFactory" 
               class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
		<property name="dataSource" ref="dataSource"/>
		
		<property name="annotatedClasses">
     		<list>
       			<value>dj.pojo.Plant</value>
     		</list>
   		</property>
		
   		<property name="hibernateProperties">
   			<value>
   				hibernate.dialect = org.hibernate.dialect.MySQLDialect
   				hibernate.show_sql = true
   				hibernate.format_sql = true
   				hbm2ddl.auto = create
   			</value>
   		</property>
	</bean>
	
	<bean id="hibernateTemplate" 
                   class="org.springframework.orm.hibernate3.HibernateTemplate">
		<property name="sessionFactory" ref="sessionFactory"></property>
	</bean>
	
	<bean id="plantDao" class="dj.dao.PlantDao">
		<property name="hibernateTemplate" ref="hibernateTemplate"/>
	</bean>
 

PlantDao.java

public class PlantDao{
        private HibernateTemplate hibernateTemplate;
	
	public HibernateTemplate getHibernateTemplate() {
		return hibernateTemplate;
	}

	public void setHibernateTemplate(HibernateTemplate hibernateTemplate) {
		this.hibernateTemplate = hibernateTemplate;
	}

	public void save(Plant plant){
		this.getHibernateTemplate().save(plant);
	}
	
	public static void main(String[] args){
		ClassPathXmlApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContext.xml");
		PlantDao pd=(PlantDao) ctx.getBean("plantDao");
		Plant plant=new Plant();
		plant.setName("data");
		pd.save(plant);
		
	}
}
 

这里的main方法主要是用于测试,当然更标准的测试需要使用Junit。注意在Spring中applicationContext默认是放在WEB-INF目录中,但为了测试方便我把它放在src里了。

 

因为所有DAO类中都会有HibernateTemplate的bean方法,于是

private HibernateTemplate hibernateTemplate;
	
	public HibernateTemplate getHibernateTemplate() {
		return hibernateTemplate;
	}

	public void setHibernateTemplate(HibernateTemplate hibernateTemplate) {
		this.hibernateTemplate = hibernateTemplate;
	}

 这段代码就会大量重复。

 

考虑到复用性,我们将这段代码封装在独立的类中,让所有DAO类继承。不过这个类Spring已经有了,那就是HibernateDaoSupport(除此之外,HibernateDaoSupport也有SessionFactory的bean方法),于是PlantDao.java可以简化为:

 

PlantDao.java

public class PlantDao extends HibernateDaoSupport{

	public void save(Plant plant){
		this.getHibernateTemplate().save(plant);
	}

	public static void main(String[] args){
		ClassPathXmlApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContext.xml");
		PlantDao pd=(PlantDao) ctx.getBean("plantDao");
		Plant plant=new Plant();
		plant.setName("data");
		pd.save(plant);
		
	}
} 

 

到目前为止,我们所使用的是XML的注入方式,那么如果用annotation呢?

 

如果实际测试一下,你会发现出现了类似底下的异常:

 org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'plantDao' defined in file [E:\javaWorks\plantAtlas\WebRoot\WEB-INF\classes\dj\dao\PlantDao.class]: Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: 'sessionFactory' or 'hibernateTemplate' is required

 

它找不到SessionFactory或者HibernateTemplate,即SessionFactory或者HibernateTemplate没有注入给DAO类!

 

原因在于HibernateDaoSupport的setter方法前并没有加入@Resource这样的注解,并且它的所有bean方法都是不可改写的(final),这就相当于你的DAO类和HibernateTemplate都被实例化了(DAO实例化需要使用@Component注解)但DAO实例并没有被注入HibernateTemplate,即:

DataSource -> SessionFactory -> HibernateTemplate ,DAO

HibernateTemplate与DAO之间的注入关系断开了

 

解决此问题的方法是:

    重写一个加入了 @Recource HibernateDaoSupport 的替代类,让 DAO 类继承

 

以下是使用annotation方式注入的相关代码:

 

applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
		http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context-2.5.xsd">
	<context:annotation-config />
	<context:component-scan base-package="dj.dao"/>
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
		<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
		<property name="url" value="jdbc:mysql://localhost:3306/myDB"/>
		<property name="username" value="root"/>
		<property name="password" value="abc"/>
 	</bean>
 	
 	<bean id="sessionFactory" 
               class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
		<property name="dataSource" ref="dataSource"/>
		
		<property name="annotatedClasses">
     		<list>
       			<value>dj.pojo.Plant</value>
     		</list>
   		</property>
		
   		<property name="hibernateProperties">
   			<value>
   				hibernate.dialect = org.hibernate.dialect.MySQLDialect
   				hibernate.show_sql = true
   				hibernate.format_sql = true
   				hbm2ddl.auto = create
   			</value>
   		</property>
	</bean>
	
	<bean id="hibernateTemplate" 
                   class="org.springframework.orm.hibernate3.HibernateTemplate">
		<property name="sessionFactory" ref="sessionFactory"></property>
	</bean>
</beans>
  

 

PlanteDao.java

@Component
public class PlantDao extends SuperDao{
   
    public void save(Plant plant){
        this.getHibernateTemplate().save(plant);
    }
   
    public static void main(String[] args){
        ClassPathXmlApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContext.xml");
        PlantDao pd=(PlantDao) ctx.getBean("plantDao");
        Plant plant=new Plant();
        plant.setName("sae");
        pd.save(plant);
       
    }
}

 

SuperDao.java

public class SuperDao {
	private HibernateTemplate hibernateTemplate;
	
	public HibernateTemplate getHibernateTemplate() {
		return hibernateTemplate;
	}

	@Resource
	public void setHibernateTemplate(HibernateTemplate hibernateTemplate) {
		this.hibernateTemplate = hibernateTemplate;
		System.out.println("hibernateTemplate is null:"+hibernateTemplate==null);
	}
}

 

 

测试,ok!

到此算讲完了,这是我的第一篇关于程序开发的博客,欢迎各位拍砖。

以上!

分享到:
评论
1 楼 sumskyjia 2011-01-04  
请问我也按照你这样写了的,可是为什么不能生成bean呢?
org.springframework.beans.factory.NoSuchBeanDefinitionException: No matching bean of type [org.springframework.orm.hibernate3.HibernateTemplate] found for dependency:

相关推荐

    hibernateTemplate和HibernateDaoSupport

    HibernateTemplate 是 Spring 提供的一个模板类,它封装了对 Hibernate Session 的操作,避免了直接与 Session 进行交互时出现的事务管理、异常处理等问题。HibernateTemplate 提供了一组丰富的静态方法,涵盖了大...

    HibernateDaoSupport 与@Autowired

    在Java开发领域,尤其是Spring框架的应用中,`HibernateDaoSupport`和`@Autowired`是两个非常重要的概念。它们分别代表了Hibernate对DAO层的支持以及Spring框架的依赖注入机制。接下来,我们将深入探讨这两个知识点...

    HibernateDaoSupport的使用

    《Spring框架下HibernateDaoSupport的深度解析与应用》 在Java企业级开发中,Spring框架以其优秀的IoC(控制反转)和AOP(面向切面编程)特性,成为了事实上的标准。而Hibernate作为主流的对象关系映射(ORM)工具...

    hibernateDaoSupport类的运用实例

    通过上述步骤,我们了解了如何使用`hibernateDaoSupport`类来简化Hibernate与Spring的集成。这种方法不仅提高了代码的可读性和可维护性,还大大减少了开发过程中的错误可能。在实际开发过程中,开发者可以根据项目...

    Spring+Hibernate实现增删改查的两种方法

    本文将深入探讨如何利用Spring与Hibernate整合,通过两种不同的方式来实现这些基本操作:HibernateTemplate和HibernateDaoSupport。 **一、HibernateTemplate** HibernateTemplate是Spring提供的一个方便的类,它...

    spring 理解文件HibernateDaoSupport

    以上就是关于Spring与Hibernate集成的关键知识点,包括基本配置、HibernateDaoSupport与UserDaoHibernateImpl的区别,以及Spring+Struts+Hibernate集成的具体实现细节。这些内容有助于更好地理解和运用Spring框架与...

    spring+hibernate整合

    - 配置 HibernateTemplate 或 HibernateDaoSupport,这两个类提供了对 Hibernate Session 的管理,使得业务层可以方便地调用。 3. **事务管理** - 在 `applicationContext.xml` 中配置事务管理器,如 `...

    hibernateDaoSurpport和hibernateTemplate

    ### HibernateDaoSupport与HibernateTemplate详解 #### 一、引言 在Java开发中,Spring框架与Hibernate框架的结合使用非常普遍。Spring框架以其强大的依赖注入(DI)和面向切面编程(AOP)功能,极大地简化了Java...

    Spring,Hibernate整合源码

    4. **HibernateTemplate与HibernateDaoSupport**:Spring提供了HibernateTemplate和HibernateDaoSupport,它们为DAO层提供了便捷的操作方法,如save、update、delete、find等,同时处理了事务和异常。 5. **JPA集成...

    hibernate_jar.rar

    DataSource通常配置数据库连接信息,SessionFactory用于创建和管理Hibernate会话,而HibernateTemplate或HibernateDaoSupport则为DAO层提供了便捷的数据库操作接口。 4. Hibernate JAR文件解析 "hibernate_jar.rar...

    跟我学Spring3(8.2)对ORM的支持之集成Hibe

    1. **HibernateTemplate和HibernateDaoSupport**:Spring提供了一组Hibernate相关的工具类,如HibernateTemplate和HibernateDaoSupport,它们简化了Hibernate的使用。HibernateTemplate是一个模板类,它封装了许多...

    HibernateTemplate及generator用法.doc

    为了简化Hibernate与Spring的整合,Spring提供了`HibernateTemplate`类,它是一个封装了Hibernate Session的工具类,使得在处理数据库操作时更加方便。`HibernateTemplate`在事务管理、异常转换等方面提供了很多便利...

    HibernateDaoSupport与JdbcDaoSupport

    ### HibernateDaoSupport与JdbcDaoSupport详解 #### 一、概述 在软件开发过程中,特别是企业级应用开发中,数据库操作是一项重要的任务。为了简化这一过程并提高代码的可维护性和扩展性,Spring框架提供了多种支持...

    Spring相关测试4

    在“Spring相关测试4”中,我们将重点探讨Spring框架如何与Hibernate ORM工具进行整合,特别是在使用HibernateTemplate和HibernateDaoSupport这两个关键组件时的不同版本测试。这将帮助我们了解如何在不同版本的...

    HibernateDaoSupport.docx

    【HibernateDaoSupport】是Spring框架中的一个抽象类,主要用于简化Hibernate的数据访问操作,它为DAO层提供了方便的事务管理和Session管理。这个类是Spring与Hibernate集成的重要组件,尤其对于初学者来说,理解其...

    Spring3整合Hibernate4测试Demo

    4. **Spring的HibernateTemplate或HibernateDaoSupport**:Spring提供了HibernateTemplate和HibernateDaoSupport类,用于简化Hibernate操作。在这个Demo中,可能会使用它们来封装数据访问操作。 5. **Entity(实体...

    HibernateTemplate及generator用法.docx

    为了简化Hibernate与Spring的集成,Spring提供了HibernateTemplate类,它是Spring对Hibernate的一种封装,使得在DAO层操作数据库变得更加简便和安全。 首先,我们来看如何在DAO中使用HibernateTemplate。通常,DAO...

    javaee源代码ssh

    Hibernate 提供了 HibernateDaoSupport 和 HibernateTemplate 两个工具类来简化数据库操作。 HibernateDaoSupport 是 Spring 为 Hibernate DAO(数据访问对象)层提供的一个抽象基类,它并不直接执行数据库操作,...

    JavaEE spring和Hibernate整合(没有hibernate.cfg.xml)

    - Spring提供了`HibernateTemplate`和`HibernateDaoSupport`工具类,方便我们在Service层操作数据库。`HibernateTemplate`可以直接注入到Service类中,而`HibernateDaoSupport`需要我们继承,并在子类中注入`...

    spring java

    `spring_integration_hibernate3_hibernateDaoSupport`和`spring_integration_hibernate3_basic`两个文件,展示了如何利用Spring的HibernateTemplate和HibernateDaoSupport类进行数据操作。这些类提供了一套简化...

Global site tag (gtag.js) - Google Analytics