用到的Jar包
antlr-2.7.7.jar
c3p0-0.9.1.2.jar
com.springsource.net.sf.cglib-2.2.0.jar
com.springsource.org.aopalliance-1.0.0.jar
com.springsource.org.aspectj.weaver-1.6.8.RELEASE.jar
commons-logging-1.1.3.jar
dom4j-1.6.1.jar
hibernate-commons-annotations-4.0.2.Final.jar
hibernate-core-4.2.4.Final.jar
hibernate-jpa-2.0-api-1.0.1.Final.jar
javassist-3.15.0-GA.jar
jboss-logging-3.1.0.GA.jar
jboss-transaction-api_1.1_spec-1.0.1.Final.jar
mysql-connector-java-5.1.7-bin.jar
spring-aop-4.0.0.RELEASE.jar
spring-aspects-4.0.0.RELEASE.jar
spring-beans-4.0.0.RELEASE.jar
spring-context-4.0.0.RELEASE.jar
spring-core-4.0.0.RELEASE.jar
spring-expression-4.0.0.RELEASE.jar
spring-jdbc-4.0.0.RELEASE.jar
spring-orm-4.0.0.RELEASE.jar
spring-tx-4.0.0.RELEASE.jar
spring-web-4.0.0.RELEASE.jar
spring-webmvc-4.0.0.RELEASE.jar
Spring整合hibernate思路
先配置hibernate文件,之后配置Spring文件
hibernate配置文件
1 <?xml version="1.0" encoding="UTF-8"?> 2 <!DOCTYPE hibernate-configuration PUBLIC 3 "-//Hibernate/Hibernate Configuration DTD 3.0//EN" 4 "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> 5 <hibernate-configuration> 6 <session-factory> 7 8 <!-- 配置 hibernate 的基本属性 --> 9 <!-- 1. 数据源需配置到 IOC 容器中, 所以在此处不再需要配置数据源 --> 10 <!-- 2. 关联的 .hbm.xml 也在 IOC 容器配置 SessionFactory 实例时在进行配置 --> 11 <!-- 3. 配置 hibernate 的基本属性: 方言, SQL 显示及格式化, 生成数据表的策略以及二级缓存等. --> 12 <property name="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property> 13 14 <property name="hibernate.show_sql">true</property> 15 <property name="hibernate.format_sql">true</property> 16 <!-- 自动生成数据表 --> 17 <property name="hibernate.hbm2ddl.auto">update</property> 18 19 <!-- 配置 hibernate 二级缓存相关的属性. --> 20 21 </session-factory> 22 </hibernate-configuration>
spring配置文件
1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans xmlns="http://www.springframework.org/schema/beans" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xmlns:context="http://www.springframework.org/schema/context" 5 xmlns:tx="http://www.springframework.org/schema/tx" 6 xmlns:aop="http://www.springframework.org/schema/aop" 7 xsi:schemaLocation="http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd 8 http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd 9 http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd 10 http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd"> 11 12 <!-- 配置自动扫描的包 --> 13 <context:component-scan base-package="com.spring.hibernate"></context:component-scan> 14 <!-- 导入资源文件 --> 15 <context:property-placeholder location="classpath:db.properties" /> 16 17 <!-- 配置C3P0数据源 --> 18 <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"> 19 <property name="user" value="${jdbc.user}"></property> 20 <property name="password" value="${jdbc.password}"></property> 21 <property name="jdbcUrl" value="${jdbc.jdbcUrl}"></property> 22 <property name="driverClass" value="${jdbc.driverClass}"></property> 23 24 <property name="initialPoolSize" value="${jdbc.initPoorSize}"></property> 25 <property name="maxPoolSize" value="${jdbc.maxPoorSize}"></property> 26 </bean> 27 28 <!-- 配置hibernate的SessionFactory 实例:通过LocalSessionFactoryBean进行配置 --> 29 <bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"> 30 <!-- 配置数据源属性 --> 31 <property name="dataSource" ref="dataSource"></property> 32 <!-- 配置hibernate的配置文件的位置以及名称 --> 33 <property name="configLocations" value="classpath:hibernate.cfg.xml"></property> 34 <!-- 配置hibernate映射文件的位置及名称,可以使用通配符 --> 35 <property name="mappingLocations" value="classpath:com/spring/hibernate/entities/*.hbm.xml"></property> 36 </bean> 37 38 <!-- 配饰Spring的声明式事务 --> 39 <!-- 1.配置事务管理器 --> 40 <bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager"> 41 <property name="sessionFactory" ref="sessionFactory"></property> 42 </bean> 43 44 <!-- 2.配置事务属性 需要事务管理器--> 45 <tx:advice id="txAdvice" transaction-manager="transactionManager"> 46 <tx:attributes> 47 <tx:method name="get*" read-only="true"></tx:method> 48 <tx:method name="purchase" propagation="REQUIRED"></tx:method> 49 <tx:method name="*"></tx:method> 50 </tx:attributes> 51 </tx:advice> 52 53 <!-- 3.配置事务切点,并把切点和事务关联起来 --> 54 <aop:config> 55 <aop:pointcut expression="execution(* com.spring.hibernate.service.*.*(..))" 56 id="txPointcut"/> 57 <aop:advisor advice-ref="txAdvice" pointcut-ref="txPointcut"/> 58 </aop:config> 59 60 </beans>
dao层实现类
1 package com.spring.hibernate.daoImpl; 2 3 import org.hibernate.Query; 4 import org.hibernate.Session; 5 import org.hibernate.SessionFactory; 6 import org.springframework.beans.factory.annotation.Autowired; 7 import org.springframework.stereotype.Repository; 8 9 import com.spring.hibernate.dao.BookShopDao; 10 import com.spring.hibernate.exception.BookStockException; 11 import com.spring.hibernate.exception.UserAccountException; 12 13 @Repository 14 public class BookShopDaoImpl implements BookShopDao { 15 16 @Autowired 17 private SessionFactory sessionFactory; 18 19 // 获取和当前线程绑定的线程 20 private Session getSession(){ 21 return sessionFactory.getCurrentSession(); 22 } 23 24 @Override 25 public int findBookPriceByIsbn(String isbn) { 26 String hql = "select b.price from Book b where b.isbn = ?"; 27 Query query = getSession().createQuery(hql).setString(0, isbn); 28 return (Integer) query.uniqueResult(); 29 } 30 31 @Override 32 public void updateBookStock(String isbn) { 33 String hql2 = "select b.stock from Book b where b.isbn =?"; 34 Integer stock = (Integer) getSession().createQuery(hql2).setString(0, isbn).uniqueResult(); 35 if(stock ==0){ 36 throw new BookStockException("库存不足"); 37 } 38 String hql = "update Book b set b.stock=b.stock -1 where b.isbn =?"; 39 getSession().createQuery(hql).setString(0, isbn).executeUpdate(); 40 } 41 42 @Override 43 public void updateUserAccount(String username, int price) { 44 // 验证余额是否足够 45 String hql2 = "select a.balance from Account a where a.username = ?"; 46 Integer balance = (Integer) getSession().createQuery(hql2).setString(0, username).uniqueResult(); 47 if(balance < price){ 48 throw new UserAccountException("余额不足"); 49 } 50 String hql = "UPDATE Account a SET a.balance = a.balance - ? where a.username = ? "; 51 getSession().createQuery(hql).setInteger(0, price).setString(1, username).executeUpdate(); 52 } 53 54 }
service实现类
1 package com.spring.hibernate.service.Impl; 2 3 import java.util.List; 4 5 import org.springframework.beans.factory.annotation.Autowired; 6 import org.springframework.stereotype.Service; 7 8 import com.spring.hibernate.service.BookShopService; 9 import com.spring.hibernate.service.CashierService; 10 11 @Service("cashierService") 12 public class CashierServiceImpl implements CashierService { 13 14 @Autowired 15 private BookShopService bookShopService; 16 17 /** 18 * Spring hibernate 事务的流程 19 * 1.方法开始之前 20 * a.获取session 21 * b.把session和当前线程绑定,这样就可以在Dao中使用SessionFactory的getSession()方法来获取session了 22 * c.开启事务 23 * 24 * 2.若方法正常提交结束,没有出现异常 25 * a.提交事务 26 * b.使和当前绑定的session解除绑定 27 * c.关闭session 28 * 29 * 3.若方法出现异常 30 * a.回滚事务 31 * b.使和当前绑定的session解除绑定 32 * c.关闭session 33 */ 34 35 @Override 36 public void checkout(String username, List<String> ibsns) { 37 for(String isbn:ibsns){ 38 bookShopService.purchase(username, isbn); 39 } 40 } 41 42 }
实体类对应生成hbm.xml文件
1 <?xml version="1.0"?> 2 <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 3 "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> 4 5 <hibernate-mapping> 6 <class name="com.spring.hibernate.entities.Account" table="SH_ACCOUNT"> 7 8 <id name="id" type="java.lang.Integer"> 9 <column name="ID" /> 10 <generator class="native" /> 11 </id> 12 13 <property name="username" type="java.lang.String"> 14 <column name="USERNAME" /> 15 </property> 16 17 <property name="balance" type="int"> 18 <column name="BALANCE" /> 19 </property> 20 21 </class> 22 </hibernate-mapping>
1 <?xml version="1.0"?> 2 <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 3 "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> 4 5 <hibernate-mapping> 6 <class name="com.spring.hibernate.entities.Book" table="SH_BOOK"> 7 8 <id name="id" type="java.lang.Integer"> 9 <column name="ID" /> 10 <generator class="native" /> 11 </id> 12 13 <property name="bookName" type="java.lang.String"> 14 <column name="BOOK_NAME" /> 15 </property> 16 17 <property name="isbn" type="java.lang.String"> 18 <column name="ISBN" /> 19 </property> 20 21 <property name="price" type="int"> 22 <column name="PRICE" /> 23 </property> 24 25 <property name="stock" type="int"> 26 <column name="STOCK" /> 27 </property> 28 29 </class> 30 </hibernate-mapping>