频道栏目
首页 > 程序开发 > 软件开发 > Java > 正文
Spring3.0学习-注解模式下的Spring3+hibernate3-事务管理
2016-11-01 09:24:55      个评论    来源:bestcxx的专栏  
收藏   我要投稿

一、前言

最近一段时间学习了《Spring 实战(第3版)》的第5、6章,对Spring直接操作数据库有了一定的认识。由于书中前4章例子相对比较完整,学习起来还算顺利,第5、6章内容不是很多,但是涉及的技术迭代范围较广,例子也不是很完全,知识学习期间走了一些弯路,不过还好,总算是通过各种途径找到了最终想学的东西——注解模式下的Spring+Hibernate的基本使用。

二、Spring3+Hibernate3注解模式下的结合

1、相关jar包。

如果jar包确实或者版本不兼容,开发过程会变得十分纠结,所以务必注意版本问题;

这里我把我自己用到的jar包贴出来,struts2(本例没有使用到struts2)、Spring3是从官网下载的,hibernate3是通过maven一点一点“凑出来的”,还有mysql的驱动jar包,此外,本文使用的jsdk1.7版本。

\

\

2、数据源配置

我使用的是mysql数据库,数据库名称为 test,由于使用了hibernate自动建表,而且表只有两个字段,所以这里不再多说表结构。

 


	
		
		
		
		
		
		
		
		
	

 

3、sessionFactory配置

含义可以参考文章http://www.cnblogs.com/lihaoyang/p/4853712.html

 

	
	
	
	    
		
		
		
		
		
		
			
				${hibernate.dialect}
				${hibernate.show_sql}
				${hibernate.format_sql}
				 ${hibernate.hbm2ddl.auto}
			
		
	
	

4、Spring具有较为完善的异常表达体系

将异常转化为Spring的表达方式,其实就一句配置文件

 


	


 

5、transactionManager配置

事务管理器配置

 


	
		
	

 

 

6、tx配置。通过切面将事务管理器织入到指定“接口的实现”

可以看介绍http://wcp88888888.iteye.com/blog/1279603

6.1 xml配置

这里注意设置切点,可以是采取下面的限定到一个文件夹,但是为了同时实验xml配置和注解配置,我们使用了限定到一个java文件,本例符合下面事务切面配置的java文件只有两个。

 


	
		
			
			
		
	
	
	
	
		
		
		
		
		
	


 

6.2注解模式

Spring配置文件部分比较简单

 


	

 

 

java部分,需要注解@Transactional以及其他个性化设置
@Transactional(readOnly=false,isolation=Isolation.DEFAULT)

7、代码结构

本文代码结构包含,Dao接口类,Dao实现类(需注解@Repository),Service接口类,Service实现类(需注解@Service以及6.2注解模式下的@Transactional,调用Dao接口),Model类,Spring配置文件(自动注入,切面设置,bean声明,异常转化等),常量文件(数据库驱动等)和测试jave类。

Person.java为实体类,本例演示保存实体对象到mysql数据库。

\

\

 

8、代码

Mode类:Person.java

 

package stu.demo.model;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity(name="PERSON")
@Table(name="PERSON")
public class Person {
	private String username;
	private String password;
	
	@Id
	@Column(name="USERNAME",unique=true,nullable=false)
	public String getUsername() {
		return username;
	}
	public void setUsername(String username) {
		this.username = username;
	}
	
	@Column(name="PASSWORD")
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	
	

}

 

 


Dao接口类:PersonDao.java

 

package stu.demo.dao;

import stu.demo.model.Person;

public interface PersonDao {
	//使用当前session完成数据库的相关操作
	public void addPerson(Person person);
}

Dao接口类:Person2Dao.java

 

 

package stu.demo.dao;

import stu.demo.model.Person;

public interface Person2Dao {
	public void addPerson(Person person);
}

Dao接口实现类:PersonDaoImpl.java

 

 

package stu.demo.daoImpl;

import org.hibernate.SessionFactory;
import org.hibernate.classic.Session;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import stu.demo.dao.PersonDao;
import stu.demo.model.Person;

@Repository
public class PersonDaoImpl implements PersonDao {
	private SessionFactory sessionFactory;
	
	@Autowired
	public PersonDaoImpl(SessionFactory sessionFactory) {
		// TODO Auto-generated constructor stub
		this.sessionFactory=sessionFactory;
	}
	
	//获取当前session
	private Session currentSession(){	
		return sessionFactory.getCurrentSession();
	}
	
	//使用当前session完成数据库的相关操作
	public void addPerson(Person person){
		currentSession().save(person);
	}

}

Dao接口实现类:Person2DaoImpl.java

 

 

package stu.demo.daoImpl;

import org.hibernate.SessionFactory;
import org.hibernate.classic.Session;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

import stu.demo.dao.Person2Dao;
import stu.demo.model.Person;

@Repository
public class Person2DaoImpl implements Person2Dao {	
	private SessionFactory sessionFactory;

	@Autowired
	public Person2DaoImpl(SessionFactory sessionFactory){
		this.sessionFactory=sessionFactory;
	}

	public Session currentSession(){	
		return sessionFactory.getCurrentSession();
	}
	
	/**
	 * 保存新用户
	 */
	public void addPerson(Person person) {
		// TODO Auto-generated method stub
		currentSession().save(person);
	}

}

Service接口类:PersonService.java

 

 

package stu.demo.service;

import stu.demo.model.Person;

public interface PersonService {
	public void addPerson(Person person);

}


 

Service接口类:Person2Service.java

 

package stu.demo.service;

import stu.demo.model.Person;

public interface Person2Service {
	public void addPerson(Person person);

}


 

service接口实现类:PersonServiceImpl.java

 

package stu.demo.serviceImpl;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import stu.demo.dao.PersonDao;
import stu.demo.model.Person;
import stu.demo.service.PersonService;

@Service
public class PersonServiceImpl  implements PersonService { 
	
	@Autowired
	private PersonDao personDao;
	
	public void addPerson(Person person) {
		// TODO Auto-generated method stub
		personDao.addPerson(person);

	}

}


 

service接口实现类:Person2ServiceImpl.java

 

package stu.demo.serviceImpl;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Isolation;
import org.springframework.transaction.annotation.Transactional;

import stu.demo.dao.Person2Dao;
import stu.demo.model.Person;
import stu.demo.service.Person2Service;

@Service
@Transactional(readOnly=false,isolation=Isolation.DEFAULT)
public class Person2ServiceImpl implements Person2Service {
	@Autowired
	private Person2Dao person2dao;
	
	public void addPerson(Person person) {
		// TODO Auto-generated method stub
		person2dao.addPerson(person);
	}

}


 

常量配置

jdbc.properties

 

#jdbc settings
jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/test
jdbc.username=root
jdbc.password=root
jdbc.initialSize=5
jdbc.maxActive=10

#hibernate settings
hibernate.dialect=org.hibernate.dialect.MySQLDialect
hibernate.show_sql=false
hibernate.format_sql=false
hibernate.hbm2ddl.auto=update

常量配置

 

application.properties

内容为空

 

Spring 配置文件

applicationContext.xml

 



	
	
	
	
	
	
		
		
		
			
				
				classpath:config/application.properties
				
				classpath:config/jdbc.properties
			
		
	
	
	
	
		
		
		
		
		
		
		
		
	
	
	
	
	    
		
		
		
		
		
		
			
				${hibernate.dialect}
				${hibernate.show_sql}
				${hibernate.format_sql}
				 ${hibernate.hbm2ddl.auto}
			
		
	
	
	
	
	
	
	
		
	
	
	
	
		
			
			
		
	
	
	
	
		
		
		
		
		
	
	
	
	
	

测试类:HibernatePersonDaoTest.java

 

 

package stu.demo.dao;


import java.text.SimpleDateFormat;
import java.util.Date;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.annotation.DirtiesContext;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.transaction.TransactionConfiguration;

import stu.demo.model.Person;
import stu.demo.service.Person2Service;
import stu.demo.service.PersonService;
@DirtiesContext
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"classpath:spring/applicationContext.xml"})
@TransactionConfiguration(transactionManager = "defaultTransactionManager",defaultRollback=false)//事务管理
public class HibernatePersonDaoTest {
	@Autowired
	private PersonService personService;
	
	@Autowired
	private Person2Service person2Service;
	
	/**
	 * <tx:advice+切面 new="" person="" pre="" public="" sdf="new" simpledateformat="" test="" tx:annotation-driven="" void="">

测试类运行结果:

看mysql数据库:

\

点击复制链接 与好友分享!回本站首页
上一篇:SpringMVC框架整理(二)
下一篇:MQ原理、使用场景、IBM WebSphere MQ介绍及spring集成配置
相关文章
图文推荐

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训

版权所有: 红黑联盟--致力于做实用的IT技术学习网站