(十七)Hibnernate 和 Spring 整合
Posted 专注改变人生。
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了(十七)Hibnernate 和 Spring 整合相关的知识,希望对你有一定的参考价值。
一、Hibnernate 和 Spring结合方案:
-
- 方案一: 框架各自使用自己的配置文件,Spring中加载Hibernate的配置文件。
- 方案二: 统一由Spring的配置来管理。(推荐使用)
二、结合步骤
2.1 加载框架的jar包
2.2 框架的配置文件
hibernate.cfg.xml
<session-factory> <property name="myeclipse.connection.profile"> com.jdbc.mysql.Driver </property> <property name="connection.url"> jdbc:mysql://127.0.0.1:3306/test </property> <property name="connection.username">root</property> <property name="connection.password"></property> <property name="connection.driver_class"> com.p6spy.engine.spy.P6SpyDriver </property> <property name="dialect"> org.hibernate.dialect.MySQLDialect </property> <property name="show_sql">true</property> <property name="format_sql">true</property> <property name="current_session_context_class">thread</property> <mapping class="bean.StudentBean" /> <mapping class="bean.ClassBean" /> <mapping class="bean.BlobBEAN" /> </session-factory>
spring.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:util="http://www.springframework.org/schema/util" xmlns:p="http://www.springframework.org/schema/p" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd "> <context:component-scan base-package="service"></context:component-scan> <!-- 自动扫描,把 service包里带有@Component注解的类注册为spring上下问的bean--> <bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"> <property name="configLocation" value="classpath:hibernate.cfg.xml"></property> <!-- 在spring中加载hiberntae的配置 --> </bean> </beans>
-
StudentService .java 测试在spring中通过DI方式注入SessionFactory
package service; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.Transaction; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import org.springframework.stereotype.Component; import org.springframework.stereotype.Service; import bean.StudentBean; @Component("studentService") public class StudentService { @Autowired private SessionFactory sessionFactory; public void save(){ Session session=null; Transaction tran=null; try { session=sessionFactory.getCurrentSession(); tran=session.beginTransaction(); StudentBean stu=new StudentBean(); stu.setStuId(3); stu.setClassId("3"); stu.setStuName("admin3"); session.save(stu); tran.commit(); } catch (Exception e) { e.printStackTrace(); tran.rollback(); }finally{ //getCurrentSession无须手动关闭 } } /** * 测试在spring中通过DI方式注入SessionFactory
* 本类的save方法的事务是由Hibernate管理的,所以要在hibernate配置文件的设置
* <property name="current_session_context_class">thread</property> * @param args */ public static void main(String[] args) { ApplicationContext context=new ClassPathXmlApplicationContext("spring.xml"); StudentService stuService=(StudentService)context.getBean("studentService"); stuService.save(); } }
- Test_Transaction.java测试在spring管理事务。(Hibernate不再参与事务的提交与回滚)
package test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import org.springframework.stereotype.Controller; import service.TransactionService; /** * 测试在spring管理事务。(Hibernate不再参与事务的提交与回滚) * @author 半颗柠檬、 * */ @Controller(value="tranTest") public class Test_Transaction { @Autowired private TransactionService tranService; public static void main(String[] args) throws Exception { ApplicationContext context=new ClassPathXmlApplicationContext("spring.xml"); Test_Transaction stuTest=(Test_Transaction)context.getBean("tranTest"); stuTest.tranService.save_a(); } }
- TransactionService .java
package service; import javax.transaction.Transactional; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import dao.StudentDao; @Service @Transactional public class TransactionService { @Autowired private StudentDao stuDao; public void save_a() throws Exception{ stuDao.save_1(); stuDao.save_2(); } }
-
StudentDao .java
package dao; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Repository; import bean.StudentBean; @Repository(value = "stuDao") public class StudentDao { @Autowired private SessionFactory sessionFactory; public void save_1() throws Exception { Session session = null; try { session = sessionFactory.getCurrentSession(); StudentBean stu = new StudentBean(); stu.setStuId(15); stu.setClassId("3"); stu.setStuName("admin3"); session.save(stu); } catch (Exception e) { e.printStackTrace(); throw new RuntimeException(e); } } public void save_2() throws Exception { Session session = null; try { session = sessionFactory.getCurrentSession(); StudentBean stu = new StudentBean(); stu.setStuId(1); stu.setClassId("3"); stu.setStuName("admin3"); session.save(stu); } catch (Exception e) { e.printStackTrace(); throw new RuntimeException(e); } } }
- spring.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:util="http://www.springframework.org/schema/util" xmlns:p="http://www.springframework.org/schema/p" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd "> <context:component-scan base-package="service"></context:component-scan> <!-- 自动扫描,把 service包里带有@Component注解的类注册为spring上下问的bean --> <context:component-scan base-package="dao"></context:component-scan> <context:component-scan base-package="test"></context:component-scan> <bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"> <property name="configLocation" value="classpath:hibernate.cfg.xml"></property> <!-- 在spring中加载hiberntae的配置 --> </bean> <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <constructor-arg index="0" name="url" value="jdbc:mysql://127.0.0.1:3306/user?useUnicode=true&characterEncoding=UTF-8"></constructor-arg> <constructor-arg index="1" name="username" value="root"></constructor-arg> <constructor-arg index="2" name="password" value=""></constructor-arg> <property name="driverClassName" value="com.mysql.jdbc.Driver"></property> </bean> <!-- 第一种方式:使用xml配置来配置声明式事务 --> <bean name="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager"> <property name="dataSource" ref="dataSource"></property> <property name="sessionFactory" ref="sessionFactory"></property> </bean> <tx:advice id="advice_1" transaction-manager="transactionManager"> <tx:attributes> <tx:method name="save*" propagation="REQUIRED" /> <tx:method name="*" propagation="SUPPORTS" /> </tx:attributes> </tx:advice> <aop:config> <!-- Pointcut 是指那些方法需要被执行"AOP",是由"Pointcut Expression"来描述的. --> <aop:pointcut expression="execution(* service.*.*(..))" id="point_1" /> <aop:advisor advice-ref="advice_1" pointcut-ref="point_1" /> </aop:config> <!-- 第一种方式结束 --> <!-- 第二种方式:使用事务注解来配置声明式事务 --> <bean name="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager"> <property name="dataSource" ref="dataSource"></property> <property name="sessionFactory" ref="sessionFactory"></property> </bean> <tx:annotation-driven transaction-manager="transactionManager" /> <!-- 第二种方式结束 --> </beans>
- hibernate.cfg.xml修改如下:
<?xml version=‘1.0‘ encoding=‘UTF-8‘?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> <!-- Generated by MyEclipse Hibernate Tools. --> <hibernate-configuration> <session-factory> <property name="myeclipse.connection.profile"> com.jdbc.mysql.Driver </property> <property name="connection.url"> jdbc:mysql://127.0.0.1:3306/test </property> <property name="connection.username">root</property> <property name="connection.password"></property> <property name="connection.driver_class"> com.p6spy.engine.spy.P6SpyDriver </property> <property name="dialect"> org.hibernate.dialect.MySQLDialect </property> <property name="show_sql">true</property> <property name="format_sql">true</property> <property name="current_session_context_class">org.springframework.orm.hibernate4.SpringSessionContext</property> <mapping class="bean.StudentBean" /> <mapping class="bean.ClassBean" /> <mapping class="bean.BlobBEAN" /> </session-factory> </hibernate-configuration>
- 注意: 如果把hibernate的事务交给spring管理,那么配置必须修改为<property name="current_session_context_class">org.springframework.orm.hibernate4.SpringSessionContext</property> ,如果事务还是在hibernate里管理,则<property name="current_session_context_class">thread</property>
全部代码在: 链接
以上是关于(十七)Hibnernate 和 Spring 整合的主要内容,如果未能解决你的问题,请参考以下文章
Spring(十七):Spring AOP:通知(前置后置返回异常环绕)
Spring认证中国教育管理中心-Apache Geode 的 Spring 数据教程十七