spring与hibernate的集成

本文详细介绍了如何在Spring框架中配置并使用Hibernate进行持久层开发,包括数据源配置、SessionFactory创建、事务管理及DAO层实现。通过配置示例展示了如何整合Spring与Hibernate,实现对数据库的操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 核心思想主要是spring来管理hibernate 在spring配置中配置hibernate就哦了。

applicationContext.xml

<?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:p="http://www.springframework.org/schema/p"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
	<!--
		数据源配置 
		jndi : org.springframework.jndi.JndiObjectFactoryBean 
		jdbc : org.springframework.jdbc.datasource.DriverManagerDataSource
		dbcp连接池:org.apache.commons.dbcp.BasicDataSource 
	-->
	<!--
		<bean id="dataSourceJndi" class="org.springframework.jndi.JndiObjectFactoryBean"> 
			<property name="jndiName" value="java:comp/env/jdbc/magus" /> 
		</bean>
	-->
	<bean id="dataSourceJdbc"
		class="org.springframework.jdbc.datasource.DriverManagerDataSource">
		<property name="driverClassName" value="com.mysql.jdbc.Driver" />
		<property name="url" value="jdbc:mysql://localhost:3306/ssh"></property>
		<property name="username" value="root"></property>
		<property name="password" value="root"></property>
	</bean>
	<bean id="dataSourceDbcp" class="org.apache.commons.dbcp.BasicDataSource">
		<property name="driverClassName" value="com.mysql.jdbc.Driver" />
		<property name="url" value="jdbc:mysql://localhost:3306/ssh"></property>
		<property name="username" value="root"></property>
		<property name="password" value="root"></property>
		<!-- 连接池启动时的初始值 -->
		<property name="initialSize" value="1" />
		<!-- 连接池的最大值 -->
		<property name="maxActive" value="500" />
		<!-- 最大空闲值   当经过一段高峰时间后,连接池可以慢慢将已经用不到的连接慢慢释放一部分,一直减少到maxIdle为止 -->
		<property name="maxIdle" value="10" />
		<!-- 最小空闲值  当空闲的连接数小于阀值时,连接池就会去预申请一些连接,以免洪峰时来不及申请 -->
		<property name="minIdle" value="5" />
	</bean>

	<!-- 定义一个hibernate的SessionFactory -->
	<bean id="sessionFactory"
		class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
		<!-- 注入DataSource -->
		<property name="dataSource" ref="dataSourceJdbc" />
		<!-- 配置hibernate的相关属性 -->
		<property name="hibernateProperties">
			<props>
				<prop key="hibernate.dialect">
					<!-- com.magus.sqlserver2008.SQLServer2008Dialect -->
					<!-- org.hibernate.dialect.Oracle9Dialect -->
					<!-- org.hibernate.dialect.OracleDialect -->
					<!-- org.hibernate.dialect.MySQLDialect -->
					org.hibernate.dialect.MySQLDialect
				</prop>
			</props>
		</property>
		<property name="configLocation" value="classpath:hibernate.cfg.xml">
		</property>
	</bean>

	<!-- 定义事务管理器,使用适用于Hibernte的事务管理器 -->
	<bean id="transactionManager"
		class="org.springframework.orm.hibernate3.HibernateTransactionManager">
		<!-- HibernateTransactionManager 需要依赖注入一个SessionFactory bean的引用 -->
		<property name="sessionFactory" ref="sessionFactory" />
	</bean>

	<!-- 定义DAO Bean , 作为事务代理的目标 -->
	<bean id="personServiceBean" class="com.ch.dao.impl.PersonServiceBean">
		<!-- 为DAO bean注入SessionFactory引用 -->
		<property name="sessionFactory" ref="sessionFactory" />
	</bean>

	<!-- 给具体操作数据库的service配置事务。定义DAO bean的事务代理  (xml声明式)-->
	<!--
		getHibernateTemplate().getSessionFactory().getCurrentSession()是得到当前线程绑定的session,
		而当前线程绑定的session是通过当前的事务产生的。 如果你没有配置事务的话,当前线程threadlocal中就不存在 session,
		这样就出现No Hibernate Session bound to thread, and configuration does not
		allow creation of non-transactional one here错误。
	-->
	<bean id="personService1"
		class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
		<!-- 为事务代理bean注入事务管理器 -->
		<property name="transactionManager" ref="transactionManager">
		</property>
		<!-- 设置事务属性 -->
		<property name="transactionAttributes">
			<props>
				<!-- 所有以find开头的方法,采用required的事务策略,并且只读-->
				<prop key="find*">PROPAGATION_REQUIRED,readOnly
				</prop>
				<prop key="get*">PROPAGATION_REQUIRED,readOnly
				</prop>
				<prop key="is*">PROPAGATION_REQUIRED,readOnly
				</prop>
				<prop key="save*">PROPAGATION_REQUIRED</prop>
				<prop key="update*">PROPAGATION_REQUIRED</prop>
				<prop key="delete*">PROPAGATION_REQUIRED</prop>
				<prop key="batchDelete*">PROPAGATION_REQUIRED</prop>
				<prop key="new*">PROPAGATION_REQUIRED</prop>
			</props>
		</property>
		<!-- 设置事务代理的目标bean -->
		<property name="target">
			<ref local="personServiceBean" />
			<!-- 采用嵌套bean配置目标bean (避免目标bean被误引用)-->
			<!--
				<bean class="com.ch.dao.impl.PersonServiceBean"> <property
				name="sessionFactory" ref="sessionFactory" /> </bean>
			-->
		</property>
	</bean>

	<!-- 大部分情况下,每个事务代理的事务属性大同小异,事务代理的实现类都是TransactionProxyFactoryBean,	事务代理bean都必须注入事务管理器。
		所以Spring提供了bean与bean之间的继承,将大部分的通用配置,配置成事务模板,而实际的事务代理bean,则继承事务模板。
		这种配置方式可以减少部分配置代码,下面是采用继承的配置文件: -->
	<bean id="tranProxyTemplate"
		class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"
		lazy-init="true" abstract="true">
		<!-- 为事务代理bean注入事务管理器 -->
		<property name="transactionManager" ref="transactionManager">
		</property>
		<!-- 设置事务属性 -->
		<property name="transactionAttributes">
			<props>
				<!-- 所有以find开头的方法,采用required的事务策略,并且只读-->
				<prop key="find*">PROPAGATION_REQUIRED,readOnly
				</prop>
				<prop key="get*">PROPAGATION_REQUIRED,readOnly
				</prop>
				<prop key="is*">PROPAGATION_REQUIRED,readOnly
				</prop>
				<prop key="save*">PROPAGATION_REQUIRED</prop>
				<prop key="update*">PROPAGATION_REQUIRED</prop>
				<prop key="delete*">PROPAGATION_REQUIRED</prop>
				<prop key="batchDelete*">PROPAGATION_REQUIRED</prop>
				<prop key="new*">PROPAGATION_REQUIRED</prop>
			</props>
		</property>
	</bean>

	<bean id="personService" parent="tranProxyTemplate" >
		<!-- 设置事务代理的目标bean -->
		<property name="target">
			<ref local="personServiceBean" />
			<!-- 采用嵌套bean配置目标bean (避免目标bean被误引用)-->
			<!--
				<bean class="com.ch.dao.impl.PersonServiceBean"> <property
				name="sessionFactory" ref="sessionFactory" /> </bean>
			-->
		</property>
	</bean>
</beans>

service层接口

package com.ch.dao;

import com.ch.entity.Person;

public interface IPersonService {
	public void save(Person person) ;
	
	public void update(Person person);
	
	public Person find(Integer personId);
	
	public void delete(Person person);
	
}

service层实现

package com.ch.dao.impl;

import java.util.List;

import org.hibernate.SessionFactory;

import com.ch.dao.IPersonService;
import com.ch.entity.Person;

public class PersonServiceBean implements IPersonService {

	private SessionFactory sessionFactory;

	public void delete(Person person) {
		sessionFactory.getCurrentSession().delete(person);
	}

	public Person find(Integer personId) {
		Person person = (Person) sessionFactory.getCurrentSession().get(
				Person.class, personId);
		return person;
	}

	public void save(Person person) {
		sessionFactory.getCurrentSession().save(person);
	}

	public void update(Person person) {
		sessionFactory.getCurrentSession().merge(person);
	}

	public List<?> findAllPersons() {
		return sessionFactory.getCurrentSession().createQuery("from Person").list();
	}
	
	public void setSessionFactory(SessionFactory sessionFactory) {
		this.sessionFactory = sessionFactory;
	}
}

hibernate配置文件

<?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">

<!-- Generated by MyEclipse Hibernate Tools.                   -->
<hibernate-configuration>

<session-factory>
	<!-- 数据库链接配置,在此处未使用 使用的是spring的数据库配置 -->
	<property name="myeclipse.connection.profile">mysqlssh</property>
	<property name="connection.url">
		jdbc:mysql://localhost:3306/ssh
	</property>
	<property name="connection.username">root</property>
	<property name="connection.password">root</property>
	<property name="connection.driver_class">
		com.mysql.jdbc.Driver
	</property>
	<property name="dialect">
		org.hibernate.dialect.MySQLDialect
	</property>
	
	<!-- 指定额外的Hibernate属性 -->
	<property name="show_sql">true</property>
	
	<!-- 指定Hibernate映射资源的位置 -->
	<mapping resource="com/ch/entity/Person.hbm.xml" />

</session-factory>

</hibernate-configuration>

测试类

package com.ch.test;

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

import com.ch.dao.IPersonService;
import com.ch.entity.Person;

public class PersonTest {
	
	private IPersonService personService;
	
	public PersonTest() {
		ApplicationContext ac = new ClassPathXmlApplicationContext("spring/applicationContext.xml");
		personService = (IPersonService) ac.getBean("personService");
	}

	public void testSave() {
		Person p = new Person("小王");
		personService.save(p);
		System.out.println("保存成功。。。。。");
	}
	public void testUpdate() {
		Person p = personService.find(2);
		p.setPersonName("小张");
		personService.update(p);
		System.out.println("更新成功。。。。。");
	}
	public String testFind() {
		Person p = personService.find(1);
		System.out.println("查找成功。。。。。");
		return p.getPersonName();
	}
	public  void testDelete() {
		Person p = personService.find(2);
		personService.delete(p);
		System.out.println("删除成功。。。。。");	
	}

	public static void main(String[] args) {
		PersonTest test = new PersonTest();
		test.testSave();
//		test.testUpdate();
//		test.testFind();
//		test.testDelete();
	}
}


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值