`

Spring 2.5 和 Hibernate 3 基于Annotation的集成

    博客分类:
  • SSH
阅读更多

网上的例子不少,但没有一个是说的很清楚的,而且有的例子和我的目标不同,于是自己尝试着配了一下~

目标:尽量多的使用Annotation,完成事务自动管理
版本:Spring-2.5.6 Hibernate-3.3.1及相关的包

首先定义Spring配置文件(也是最主要的一块),内容如下:
//spring.xml

Xml代码 复制代码
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <beans  
  3.     xmlns="http://www.springframework.org/schema/beans"  
  4.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  5.     xmlns:context="http://www.springframework.org/schema/context"  
  6.     xmlns:tx="http://www.springframework.org/schema/tx"  
  7.     xsi:schemaLocation="   
  8.         http://www.springframework.org/schema/beans   
  9.         http://www.springframework.org/schema/beans/spring-beans-2.5.xsd   
  10.         http://www.springframework.org/schema/context   
  11.         http://www.springframework.org/schema/context/spring-context-2.5.xsd   
  12.         http://www.springframework.org/schema/tx   
  13.         http://www.springframework.org/schema/tx/spring-tx-2.5.xsd"   
  14.     default-autowire="autodetect"  
  15. >  
  16.   
  17.     <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">  
  18.         <property name="driverClassName" value="org.postgresql.Driver"/>  
  19.         <property name="url" value="jdbc:postgresql://localhost/demo"/>  
  20.         <property name="username" value="demo"/>  
  21.         <property name="password" value="demo"/>  
  22.     </bean>  
  23.        
  24.     <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">  
  25.         <property name="configurationClass" value="org.hibernate.cfg.AnnotationConfiguration" />  
  26.         <property name="configLocations" value="hibernate.model.xml" />  
  27.         <property name="hibernateProperties">  
  28.             <props>  
  29.                 <prop key="hibernate.dialect">org.hibernate.dialect.PostgreSQLDialect</prop>  
  30.                 <prop key="hibernate.show_sql">true</prop>  
  31.                 <prop key="hibernate.hbm2ddl.auto">update</prop>  
  32.             </props>  
  33.         </property>  
  34.     </bean>  
  35.        
  36.     <bean id="txManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager" />  
  37.        
  38.     <context:component-scan base-package="com.itone.spring.demo.service">  
  39.         <context:include-filter type="regex" expression=".*ServiceImpl" />    
  40.     </context:component-scan>  
  41.        
  42.     <tx:annotation-driven transaction-manager="txManager"/>  
  43.        
  44. </beans>  
<?xml version="1.0" encoding="UTF-8"?>
<beans
	xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:tx="http://www.springframework.org/schema/tx"
	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
		http://www.springframework.org/schema/tx
		http://www.springframework.org/schema/tx/spring-tx-2.5.xsd"
	default-autowire="autodetect"
>

	<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
		<property name="driverClassName" value="org.postgresql.Driver"/>
		<property name="url" value="jdbc:postgresql://localhost/demo"/>
		<property name="username" value="demo"/>
		<property name="password" value="demo"/>
	</bean>
	
	<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
		<property name="configurationClass" value="org.hibernate.cfg.AnnotationConfiguration" />
		<property name="configLocations" value="hibernate.model.xml" />
		<property name="hibernateProperties">
			<props>
				<prop key="hibernate.dialect">org.hibernate.dialect.PostgreSQLDialect</prop>
				<prop key="hibernate.show_sql">true</prop>
				<prop key="hibernate.hbm2ddl.auto">update</prop>
			</props>
		</property>
	</bean>
	
	<bean id="txManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager" />
	
	<context:component-scan base-package="com.itone.spring.demo.service">
		<context:include-filter type="regex" expression=".*ServiceImpl" /> 
	</context:component-scan>
	
	<tx:annotation-driven transaction-manager="txManager"/>
	
</beans>



由于Hibernate model的定义一般会很多(本例不多,呵呵),所以我把它放到另一个文件中,代码如下:
//hibernate.model.xml

Xml代码 复制代码
  1. <?xml version="1.0"?>  
  2. <!DOCTYPE hibernate-configuration PUBLIC   
  3.     "-//Hibernate/Hibernate Configuration DTD 3.0//EN"   
  4.     "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">  
  5.   
  6. <hibernate-configuration>  
  7.     <session-factory>  
  8.         <mapping class="com.itone.spring.demo.model.Book"/>  
  9.     </session-factory>  
  10. </hibernate-configuration>  
<?xml version="1.0"?>
<!DOCTYPE hibernate-configuration PUBLIC
	"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
	"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

<hibernate-configuration>
	<session-factory>
		<mapping class="com.itone.spring.demo.model.Book"/>
	</session-factory>
</hibernate-configuration>



这里需要注意的几点:
1、是要加上命名空间tx,因为我们用到了tx:annotation-driven;
2、default-autowire="autodetect"或default-autowire="byName",因为我不知道怎么将sessionFactory或hibernateTemplate annotate到我的ServiceImpl中;
3、要用接口/实现的方式来做Service。

看一下我们的Hibernate model代码吧,很简单,代码如下:
//Book.java

Java代码 复制代码
  1. package com.itone.spring.demo.model;   
  2.   
  3. import java.io.Serializable;   
  4.   
  5. import javax.persistence.Entity;   
  6. import javax.persistence.GeneratedValue;   
  7. import javax.persistence.GenerationType;   
  8. import javax.persistence.Id;   
  9.   
  10. import org.hibernate.annotations.Proxy;   
  11.   
  12. @Entity  
  13. @Proxy(lazy = false)   
  14. public class Book implements Serializable {   
  15.   
  16.     private static final long serialVersionUID = 1L;   
  17.   
  18.     @Id  
  19.     @GeneratedValue(strategy = GenerationType.IDENTITY)   
  20.     public int id;   
  21.   
  22.     public String name;   
  23. }  
package com.itone.spring.demo.model;

import java.io.Serializable;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

import org.hibernate.annotations.Proxy;

@Entity
@Proxy(lazy = false)
public class Book implements Serializable {

	private static final long serialVersionUID = 1L;

	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	public int id;

	public String name;
}



接下来就是服务接口及实现了,只做读和写操作,以验证@Transactional是否起作用。
//BookService.java

Java代码 复制代码
  1. package com.itone.spring.demo.service;   
  2.   
  3. import java.util.List;   
  4.   
  5. import com.itone.spring.demo.model.Book;   
  6.   
  7. public interface BookService {   
  8.   
  9.     public void save(Book book) throws Exception;   
  10.   
  11.     public List<Book> list() throws Exception;   
  12. }  
package com.itone.spring.demo.service;

import java.util.List;

import com.itone.spring.demo.model.Book;

public interface BookService {

	public void save(Book book) throws Exception;

	public List<Book> list() throws Exception;
}



//BookServiceImpl.java

Java代码 复制代码
  1. package com.itone.spring.demo.service;   
  2.   
  3. import java.util.List;   
  4.   
  5. import org.springframework.orm.hibernate3.support.HibernateDaoSupport;   
  6. import org.springframework.stereotype.Service;   
  7. import org.springframework.transaction.annotation.Transactional;   
  8.   
  9. import com.itone.spring.demo.model.Book;   
  10.   
  11. @Service("bookService")   
  12. public class BookServiceImpl extends HibernateDaoSupport implements BookService {   
  13.   
  14.     @Transactional(readOnly = false, rollbackFor = Throwable.class)   
  15.     public void save(Book book) throws Exception {   
  16.         getHibernateTemplate().save(book);   
  17.         //throw new Exception("test exception");这样会回滚   
  18.     }   
  19.   
  20.     @SuppressWarnings("unchecked")   
  21.     @Transactional(readOnly = true, rollbackFor = Throwable.class)   
  22.     public List<Book> list() throws Exception {   
  23.                 //这里如果有写操作也会出异常   
  24.         return getSession().createCriteria(Book.class).list();   
  25.     }   
  26. }  
package com.itone.spring.demo.service;

import java.util.List;

import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.itone.spring.demo.model.Book;

@Service("bookService")
public class BookServiceImpl extends HibernateDaoSupport implements BookService {

	@Transactional(readOnly = false, rollbackFor = Throwable.class)
	public void save(Book book) throws Exception {
		getHibernateTemplate().save(book);
		//throw new Exception("test exception");这样会回滚
	}

	@SuppressWarnings("unchecked")
	@Transactional(readOnly = true, rollbackFor = Throwable.class)
	public List<Book> list() throws Exception {
                //这里如果有写操作也会出异常
		return getSession().createCriteria(Book.class).list();
	}
}



然后来做个测试吧
//Test.java

Java代码 复制代码
  1. package com.itone.spring.demo;   
  2.   
  3. import java.util.List;   
  4.   
  5. import org.springframework.context.ApplicationContext;   
  6. import org.springframework.context.support.ClassPathXmlApplicationContext;   
  7.   
  8. import com.itone.spring.demo.model.Book;   
  9. import com.itone.spring.demo.service.BookService;   
  10.   
  11. public class Test {   
  12.     public static void main(String[] args) throws Exception {   
  13.         ApplicationContext ctx = new ClassPathXmlApplicationContext(   
  14.                 new String[] { "spring.xml" });   
  15.   
  16.         BookService bookService = (BookService) ctx.getBean("bookService");   
  17.   
  18.         Book book = new Book();   
  19.         book.name = "血色浪漫";   
  20.         bookService.save(book);   
  21.   
  22.         List<Book> books = bookService.list();   
  23.         for (Book b : books) {   
  24.             System.out.println(b.id + ":" + b.name);   
  25.         }   
  26.     }   
  27. }  
package com.itone.spring.demo;

import java.util.List;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.itone.spring.demo.model.Book;
import com.itone.spring.demo.service.BookService;

public class Test {
	public static void main(String[] args) throws Exception {
		ApplicationContext ctx = new ClassPathXmlApplicationContext(
				new String[] { "spring.xml" });

		BookService bookService = (BookService) ctx.getBean("bookService");

		Book book = new Book();
		book.name = "血色浪漫";
		bookService.save(book);

		List<Book> books = bookService.list();
		for (Book b : books) {
			System.out.println(b.id + ":" + b.name);
		}
	}
}



然后的任务就是来改动BookServiceImpl的Annotation设置及代码,来检验一下是否起作用了,我发现是起作用的。

这里只写了一个简单的模型,对于Spring的Annotation还需要更进一步的学习~~

分享到:
评论

相关推荐

    Struts2+Spring2.5+Hibernate3+annotation 整合程序

    以上就是关于"Struts2+Spring2.5+Hibernate3+annotation"整合程序的相关知识点,这样的集成方案在多年前非常流行,为大型企业应用提供了稳定的基础。随着技术的发展,如今Spring Boot和Spring MVC等现代框架已经取代...

    struts2.1 + spring 2.5 + hibernate 3.2 增删改查

    Struts2.1、Spring 2.5 和 Hibernate 3.2 是经典的Java Web开发框架组合,用于构建高效、可维护的企业级应用。这个详细例子将深入探讨如何使用这三个框架协同工作,实现数据库的增(Add)、删(Delete)、改(Modify...

    struts2+spring2.5+hibernate3.2 annotation配置完整eclipse项目,带数据库脚本

    Struts2、Spring2.5和Hibernate3.2是经典的Java Web开发框架组合,它们各自在应用程序的不同层面提供了强大的功能。这个"sshTest"项目是一个使用这三个框架的注解配置的完整Eclipse工程,同时也包含了数据库脚本,...

    基于Struts2.18+Spring2.5+Hibernater3.3+Annotation注解开发的电子商务网站demo

    这个“基于Struts2.18+Spring2.5+Hibernate3.3+Annotation注解开发的电子商务网站demo”是一个很好的学习资源,可以帮助开发者加深对这些框架的理解并熟悉实际应用。 1. **Struts2.18**:Struts2是MVC(模型-视图-...

    struts1.3+spring2.5+hibernate3.3 组合开发 annotation实现

    Struts1.3、Spring2.5 和 Hibernate3.3 是经典的 Java Web 开发框架组合,它们在企业级应用中广泛使用。这个组合被称为“SSH”(Struts-Spring-Hibernate),它允许开发者构建可扩展且松耦合的后端系统。在本项目中...

    struts2 spring2.5 hibernate3.0 annotation 整合

    同时,Spring2.5也加强了对其他框架的集成,包括Struts2和Hibernate。 Hibernate3.0是一个持久层框架,它简化了Java对象与数据库表之间的映射关系。通过ORM(Object-Relational Mapping)技术,Hibernate允许开发者...

    spring2.5+hibernate3.2+struts2.0组合配置说明

    通过以上配置,我们能够有效地将 Spring2.5、Hibernate3.2 和 Struts2.0 这三个框架集成在一起,为开发高质量的企业级应用提供了一个坚实的基础。这种集成不仅提高了开发效率,还使得系统的维护和扩展变得更加容易。

    基于Annotation的Struts2.0+Hibernate3.3+Spring2.5图文教程整合开发.doc

    6. **Spring2.5的Annotation集成**: - Spring2.5支持基于注解的依赖注入(DI),可以将服务、组件等的配置直接写在类的声明上,例如`@Service`、`@Component`、`@Repository`等。 - Spring的AOP(面向切面编程)也...

    传智播客spring2.5源代码

    3. **AOP(Aspect-Oriented Programming,面向切面编程)**:在Spring 2.5中,AOP支持更加丰富,包括注解式切面定义,如`@Before`、`@After`、`@Around`等,以及基于注解的切入点表达式,让切面的定义更加直观。...

    基于Annotation的Struts2.0+Hibernate3.3+Spring2.5整合开发

    Struts2.0、Hibernate3.3和Spring2.5是经典的Java企业级开发框架,它们各自负责不同的职责:Struts2处理MVC模式中的控制层,Hibernate负责对象关系映射,Spring则提供了全面的依赖注入(DI)和面向切面编程(AOP)...

    spring2.5源码

    Spring 2.5加强了与第三方库的集成,如JMS、JPA、Hibernate等,提供了更丰富的适配器和抽象层,使得开发者能够更容易地利用这些技术。 9. **容器性能提升** 通过对容器内部的优化,Spring 2.5的启动速度和内存...

    Spring2.5中文帮助文档

    **Spring 2.5 中文帮助文档概述** Spring框架是Java平台上的...阅读"Spring2.5中文帮助手册.pdf"和"Spring2.5有哪些改进.txt"这两个文件,将能详细了解到这些改进的实施细节和使用方法,为实际开发工作提供有力支持。

    基于Annotation的Struts2.0+Hibernate3.3+Spring2.5整合开发 (1)

    标题中的“基于Annotation的Struts2.0+Hibernate3.3+Spring2.5整合开发”指的是使用注解的方式将三个流行的Java企业级框架——Struts2、Hibernate和Spring进行集成开发。这样的集成有助于简化配置,提高代码的可读性...

    spring2.5官方jar

    10. **集成测试支持**:Spring 2.5提供了丰富的测试工具,如`@ContextConfiguration`和`@DirtiesContext`等注解,帮助开发者编写更有效的集成测试。 综上所述,Spring 2.5在提升开发效率、简化配置、增强功能方面...

    Spring2.5_学习笔记.doc.zip

    此外,对于ORM框架,如Hibernate和JPA,Spring2.5提供了更丰富的集成支持,简化了事务管理,并通过声明式事务处理进一步降低了事务管理的复杂度。 在Web开发领域,Spring MVC框架在2.5版本中也得到了增强,新增了...

    Spring2.5中文开发手册

    《Spring2.5中文开发手册》是一本专为Spring 2.5框架用户提供深度解析和实践指导的重要参考资料。Spring作为Java领域中极为重要的轻量级框架,2.5版本是其发展历程中的一个重要里程碑,它引入了许多增强特性和优化,...

    Spring2.5-中文参考手册

    《Spring2.5-中文参考手册》是一份详尽阐述Spring框架2.5版本的中文文档,对于理解和应用Spring框架的开发人员来说,是不可或缺的参考资料。这份CHM(Compiled HTML Help)版本的手册,集成了Spring 2.5的所有核心...

Global site tag (gtag.js) - Google Analytics