Spring&Hibernate

这里不关注怎么使用Hibernate的,比如如何通过xml配置对象-数据库的映射关系, 如何使用hibernate 进行增删改查的细节。这里只关注如果配置Spring 使得在基于Spring的项目中使用Hibernate。可是Spring支持的Hibernate 和 纯Hibernate没看出有什么优势……

1.Hibernate的Session和SessionFactory

      Hibernate是和流行的开源 持久化框架,它不仅提供了基本的对象关系映射,还提供了ORM工具所应具有的所有复杂功能,比如缓存延迟加载预先抓取分布式缓存

       使用一个框架,要知道:是要这个框架要做什么准备工作,也就是配置; 怎么使用这个框架。使用Hibernate所需的接口是org.hibernate.Session接口。通过Session接口,能够满足所有的持久化需求:增删改查等。 获取Hibernate Session对象的标准方式借助于Hibernate SessionFactory接口的实现类。Hibernate SessionFactory主要负责Hibernate Session的打开,关闭和管理

       以上这段话再理解,在Spring中使用Hibernate需要 1.配置Hibernate SessionFactory 2.通过Hibernate SessionFactory 获取Hibernate Session 3.通过Hibernate Session来实现对数据的持久化需求:增删改查。 这样更好理解一点吧……

  2.在Spring应用上下文中配置Hibernate---获取Hibernate SessionFactory

     Spring提供了3个SessrionFactory bean可以 来获取Hibernate SessionFactory。这些bean都会产一个SessionFactory实例。

     2.1Hibernate3 &XML映射  org.springframework.orm.hibernate3.LocalSessionFactoryBean。

     属性dataSource装配了一个DataSource bean的引用。属性mappingResources列出了一个或多个的Hibernate映射文件,在这些文件中定义了应用程序的持久化策略。最后,hibernateProperties属性配置了Hibernate如何进行操作的细节。

import java.util.Properties;
import javax.sql.DataSource;
import org.springframework.orm.hibernate3.LocalSessionFactoryBean;

@Bean
public LocalSessionFactoryBean sessionFactory(DataSource dataSource){
	LocalSessionFactoryBean factoryBean  = new LocalSessionFactoryBean();
	factoryBean.setDataSource(dataSource);
	factoryBean.setMappingResources(new String[]{"student.hbm.xml"});
	Properties properties = new Properties();
	properties.setProperty("", "");
	factoryBean.setHibernateProperties(properties);
	return factoryBean;
}

       2.2Hibernate3 &注解映射  org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean

import java.util.Properties;
import javax.sql.DataSource;
import org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean;

@Bean
public AnnotationSessionFactoryBean sessionFactory(DataSource dataSource){
	AnnotationSessionFactoryBean factoryBean  = new AnnotationSessionFactoryBean();
	factoryBean.setDataSource(dataSource);
	factoryBean.setPackagesToScan(new String[]{"com.xxx.domaim"});
	Properties properties = new Properties();
	properties.setProperty("", "");
	factoryBean.setHibernateProperties(properties);
	return factoryBean;
}

        2.3Hibernate 4,xml映射or注解映射   org.springframework.orm.hibernate4.LocalSessionFactoryBean

import java.util.Properties;
import javax.sql.DataSource;
import org.springframework.orm.hibernate4.LocalSessionFactoryBean;

@Bean
public LocalSessionFactoryBean sessionFactory(DataSource dataSource){
	LocalSessionFactoryBean factoryBean  = new LocalSessionFactoryBean();
	factoryBean.setDataSource(dataSource);
	factoryBean.setPackagesToScan(new String[]{"com.xxx.domaim"});
	Properties properties = new Properties();
	properties.setProperty("", "");
	factoryBean.setHibernateProperties(properties);
	return factoryBean;
}

3.使用Hibernate进行增删改查 

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

@Repository
public class StudentRepositoryImpl implements StudentRepository {

	@Autowired
	private SessionFactory sessionFactory; // 1.注入sessionFactory

	// 2.使用这SessionFactory来获取当前事务的Session
	public Session currentSession() {
		return sessionFactory.getCurrentSession();
	}

	public void add(Spitter spitter) {
		currentSession().save(spitter); // 3.使用Session进行数据库访问操作
	}
}

PS: @Repository注解 另一个功能:

       如果在Spring应用上下文中配置了如下bean,PersistenceExceptionTranslationPostProcessor是一个bean 后置处理器(bean post-processor),它会在所有拥有@Repository注解的类上添加一个通知器(advisor),这样就会捕获任何平台相关的异常并以Spring非检查型数据访问异常的形式重新抛出。那么@Repository注解 的类除了会被Spring自动扫描并注册为一个Springbean之外,还被添加advisor,这样PersistenceExceptionTranslationPostProcessor就会知道要将这个bean产生的异常转换成Spring的统一数据访问异常。

@Bean
public BeanPostProcessor persistenceTranslation(){
	return new PersistenceExceptionTranslationPostProcessor();
}

 

posted on 2019-04-28 16:42  dreamstar  阅读(62)  评论(0编辑  收藏  举报