Spring与Hibernate整合的关键点:
1) Hibernate的SessionFactory对象交给Spring创建;
2) Hibernate事务交给Spring的声明式事务管理。
Spring和Hibernate整合的步骤:
1)引入jar包
2)配置:hibernate.cfg.xml、*.hbm.xml、applicationContext.xml
3)搭建环境、单独测试
1、引入jar包
hibernate3相关jar包
hibernate3.jar
antlr-2.7.6.jar (required)
commons-collections-3.1.jar (required)
dom4j-1.6.1.jar (required)
javassist-3.12.0.GA.jar (required)
jta-1.1.jar (required)
slf4j-api-1.6.1.jar (required)
hibernate-jpa-2.0-api-1.0.0.Final.jar (jpa)
spring-core相关jar包
commons-logging-1.2.jar
spring-beans-3.2.5.RELEASE.jar
spring-context-3.2.5.RELEASE.jar
spring-core-3.2.5.RELEASE.jar
spring-expression-3.2.5.RELEASE.jar
spring-aop相关jar包
aopalliance-.jar
aspectjrt.jar
aspectjweaver.jar
spring-aop-3.2.5.RELEASE.jar
spring-jdbc相关jar包
spring-jdbc-3.2.5.RELEASE.jar
spring-tx-3.2.5.RELEASE.jar 【事务相关】
spring-orm相关jar包
spring-orm-3.2.5.RELEASE.jar 【spring对hibernate的支持】
c3p0相关jar包
c3p0-0.9.1.2.jar
mysql相关jar包
mysql-connector-java-5.1.38-bin.jar
2、测试Hibernate
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">
<hibernate-configuration>
<!-- 通常,一个session-factory节点代表一个数据库 -->
<session-factory>
<!-- 1. 数据库连接配置 -->
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql:///test</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">root</property>
<!--
数据库方言配置, hibernate在运行的时候,会根据不同的方言生成符合当前数据库语法的sql
-->
<property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property>
<!-- 2. 其他相关配置 -->
<!-- 2.1 显示hibernate在运行时候执行的sql语句 -->
<property name="hibernate.show_sql">true</property>
<!-- 2.2 格式化sql -->
<property name="hibernate.format_sql">false</property>
<!-- 2.3 自动建表 -->
<property name="hibernate.hbm2ddl.auto">update</property>
<!-- 配置session的创建方式:线程方式创建session对象 -->
<property name="hibernate.current_session_context_class">thread</property>
<!-- 3. 加载所有映射-->
<mapping resource="com/rk/entity/Dept.hbm.xml"/>
</session-factory>
</hibernate-configuration>
Dept.hbm.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.rk.entity" auto-import="true">
<class name="Dept" table="T_Department">
<id name="deptId" column="id">
<generator class="native"></generator>
</id>
<version name="deptVersion" column="dept_version"></version>
<property name="deptName" column="name"></property>
</class>
</hibernate-mapping>
Dept.java
package com.rk.entity;
public class Dept
{
private int deptId;
private String deptName;
private int deptVersion;
public int getDeptId()
{
return deptId;
}
public void setDeptId(int deptId)
{
this.deptId = deptId;
}
public String getDeptName()
{
return deptName;
}
public void setDeptName(String deptName)
{
this.deptName = deptName;
}
public int getDeptVersion()
{
return deptVersion;
}
public void setDeptVersion(int deptVersion)
{
this.deptVersion = deptVersion;
}
@Override
public String toString()
{
return "Dept [deptId=" + deptId + ", deptName=" + deptName + ", deptVersion=" + deptVersion + "]";
}
}
DeptDao.java
package com.rk.dao;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import com.rk.entity.Dept;
public class DeptDao
{
private static SessionFactory sf;
static
{
sf = new Configuration().configure().buildSessionFactory();
}
public Dept findById(int id)
{
Session session = sf.getCurrentSession();
session.beginTransaction();
Dept dept = (Dept) session.get(Dept.class, id);
session.getTransaction().commit();
return dept;
}
public void save(Dept dept)
{
Session session = sf.getCurrentSession();
session.beginTransaction();
session.save(dept);
session.getTransaction().commit();
}
}
DeptService.java
package com.rk.service;
import com.rk.dao.DeptDao;
import com.rk.entity.Dept;
public class DeptService
{
private DeptDao deptDao = new DeptDao();
public Dept findById(int id)
{
return deptDao.findById(id);
}
public void save(Dept dept)
{
deptDao.save(dept);
}
}
App.java
package com.rk.test;
import org.junit.Test;
import com.rk.entity.Dept;
import com.rk.service.DeptService;
public class App
{
@Test
public void test()
{
DeptService deptService = new DeptService();
// Dept dept = deptService.findById(3);
// System.out.println(dept);
Dept dept = new Dept();
dept.setDeptName("HelloWorld");
deptService.save(dept);
}
}
3、测试Spring环境
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"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd">
<bean id="dept" class="com.rk.entity.Dept"></bean>
</beans>
App.java (修改)
@Test
public void test()
{
ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
Dept dept = (Dept) ac.getBean("dept");
System.out.println(dept);
}
4、Spring和Hibernate整合
4.1、Hibernate的SessionFactory交给Spring创建
其中,hibernate.cfg.xml、Dept.hbm.xml、Dept.java三个文件没有发生变化。
DeptDao.java (修改)
package com.rk.dao;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import com.rk.entity.Dept;
public class DeptDao
{
private SessionFactory sf;
public void setSf(SessionFactory sf)
{
this.sf = sf;
}
public Dept findById(int id)
{
Session session = sf.getCurrentSession();
session.beginTransaction();
Dept dept = (Dept) session.get(Dept.class, id);
session.getTransaction().commit();
return dept;
}
public void save(Dept dept)
{
Session session = sf.getCurrentSession();
session.beginTransaction();
session.save(dept);
session.getTransaction().commit();
}
}
DeptService.java (修改)
package com.rk.service;
import com.rk.dao.DeptDao;
import com.rk.entity.Dept;
public class DeptService
{
private DeptDao deptDao;
public void setDeptDao(DeptDao deptDao)
{
this.deptDao = deptDao;
}
public Dept findById(int id)
{
return deptDao.findById(id);
}
public void save(Dept dept)
{
deptDao.save(dept);
}
}
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"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd">
<!-- entity 实例 -->
<bean id="dept" class="com.rk.entity.Dept" scope="prototype"></bean>
<!-- dao 实例 -->
<bean id="deptDao" class="com.rk.dao.DeptDao">
<property name="sf" ref="sessionFactory"></property>
</bean>
<!-- service 实例 -->
<bean id="deptService" class="com.rk.service.DeptService">
<property name="deptDao" ref="deptDao"></property>
</bean>
<!-- SessionFactory 的实例 -->
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="configLocation" value="classpath:hibernate.cfg.xml"></property>
</bean>
</beans>
App.java (修改)
package com.rk.test;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.rk.entity.Dept;
import com.rk.service.DeptService;
public class App
{
@Test
public void test()
{
ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
DeptService deptService = (DeptService) ac.getBean("deptService");
Dept dept = deptService.findById(3);
System.out.println(dept);
Dept newDept = (Dept) ac.getBean("dept");
newDept.setDeptName("HelloWorld");
deptService.save(newDept);
}
}
4.2、Hibernate的事务交给Spring的事务控制
其中,Dept.hbm.xml和Dept.java没有发生改变。
DeptDao.java (修改)
package com.rk.dao;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import com.rk.entity.Dept;
public class DeptDao
{
private SessionFactory sf;
public void setSf(SessionFactory sf)
{
this.sf = sf;
}
public Dept findById(int id)
{
Session session = sf.getCurrentSession();
Dept dept = (Dept) session.get(Dept.class, id);
return dept;
}
public void save(Dept dept)
{
Session session = sf.getCurrentSession();
session.save(dept);
}
}
DeptService.java (修改)
在save方法中,加入了int i = 1/0;所以会出错,而save方法处于事务当中,因此两条数据不会保存成功。如果去掉错误,两条数据就可以保存成功了。
package com.rk.service;
import com.rk.dao.DeptDao;
import com.rk.entity.Dept;
public class DeptService
{
private DeptDao deptDao;
public void setDeptDao(DeptDao deptDao)
{
this.deptDao = deptDao;
}
public Dept findById(int id)
{
return deptDao.findById(id);
}
public void save(Dept dept)
{
deptDao.save(dept);
int i = 1/0;
Dept newDept = new Dept();
newDept.setDeptName("HAHA_LLO");
deptDao.save(newDept);
}
}
hibernate.cfg.xml (修改)
修改的只有一行:删除或注释下面的配置
<!-- 配置session的创建方式:线程方式创建session对象 -->
<property name="hibernate.current_session_context_class">thread</property>
否则,会报错误:org.hibernate.HibernateException: 方法 is not valid without active transaction。
<?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">
<hibernate-configuration>
<!-- 通常,一个session-factory节点代表一个数据库 -->
<session-factory>
<!-- 1. 数据库连接配置 -->
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql:///test</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">root</property>
<!--
数据库方言配置, hibernate在运行的时候,会根据不同的方言生成符合当前数据库语法的sql
-->
<property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property>
<!-- 2. 其他相关配置 -->
<!-- 2.1 显示hibernate在运行时候执行的sql语句 -->
<property name="hibernate.show_sql">true</property>
<!-- 2.2 格式化sql -->
<property name="hibernate.format_sql">false</property>
<!-- 2.3 自动建表 -->
<property name="hibernate.hbm2ddl.auto">update</property>
<!-- 配置session的创建方式:线程方式创建session对象 -->
<!-- <property name="hibernate.current_session_context_class">thread</property> -->
<!-- 3. 加载所有映射-->
<mapping resource="com/rk/entity/Dept.hbm.xml"/>
</session-factory>
</hibernate-configuration>
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"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd">
<!-- entity 实例 -->
<bean id="dept" class="com.rk.entity.Dept" scope="prototype"></bean>
<!-- dao 实例 -->
<bean id="deptDao" class="com.rk.dao.DeptDao">
<property name="sf" ref="sessionFactory"></property>
</bean>
<!-- service 实例 -->
<bean id="deptService" class="com.rk.service.DeptService">
<property name="deptDao" ref="deptDao"></property>
</bean>
<!-- SessionFactory 的实例 -->
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="configLocation" value="classpath:hibernate.cfg.xml"></property>
</bean>
<!-- 1.事务管理器类 -->
<bean id="txManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<constructor-arg name="sessionFactory" ref="sessionFactory"></constructor-arg>
</bean>
<!-- 2.事务策略配置 -->
<tx:advice id="txAdvice" transaction-manager="txManager">
<tx:attributes>
<tx:method name="find*" read-only="true"/>
<tx:method name="*" read-only="false"/>
</tx:attributes>
</tx:advice>
<!-- 3.事务策略应用 -->
<aop:config>
<aop:pointcut expression="execution(* com.rk.service.*.*(..))" id="pt"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="pt"/>
</aop:config>
</beans>
App.java (没有变化,进行测试)
package com.rk.test;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.rk.entity.Dept;
import com.rk.service.DeptService;
public class App
{
@Test
public void test()
{
ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
DeptService deptService = (DeptService) ac.getBean("deptService");
Dept dept = deptService.findById(3);
System.out.println(dept);
Dept newDept = (Dept) ac.getBean("dept");
newDept.setDeptName("HelloWorld");
deptService.save(newDept);
}
}
4.3、Hibernate的数据源交给Spring创建
这里只涉及到修改hibernate.cfg.xml和applicationContext.xml
hibernate.cfg.xml 中删除以下内容:
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql:///test</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">root</property>
applicationContext.xml中添加dataSource和修改sessionFactory
<!-- 数据源:c3p0连接池 -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="com.mysql.jdbc.Driver"></property><!-- 数据库驱动 -->
<property name="jdbcUrl" value="jdbc:mysql:///test"></property><!-- 数据库连接URL -->
<property name="user" value="root"></property><!-- 用户名 -->
<property name="password" value="root"></property><!-- 密码 -->
<property name="minPoolSize" value="2"></property><!-- Pool最小连接数 -->
<property name="maxPoolSize" value="10"></property><!-- Pool最大连接数 -->
<property name="acquireIncrement" value="2"></property><!-- Pool每次增长连接数 -->
<property name="maxStatements" value="100"></property><!-- -->
</bean>
<!-- SessionFactory 的实例 -->
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource"></property>
<property name="configLocation" value="classpath:hibernate.cfg.xml"></property>
</bean>
完整的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">
<hibernate-configuration>
<!-- 通常,一个session-factory节点代表一个数据库 -->
<session-factory>
<!-- 1. 数据库连接配置 -->
<!--
数据库方言配置, hibernate在运行的时候,会根据不同的方言生成符合当前数据库语法的sql
-->
<property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property>
<!-- 2. 其他相关配置 -->
<!-- 2.1 显示hibernate在运行时候执行的sql语句 -->
<property name="hibernate.show_sql">true</property>
<!-- 2.2 格式化sql -->
<property name="hibernate.format_sql">false</property>
<!-- 2.3 自动建表 -->
<property name="hibernate.hbm2ddl.auto">update</property>
<!-- 配置session的创建方式:线程方式创建session对象 -->
<!-- <property name="hibernate.current_session_context_class">thread</property> -->
<!-- 3. 加载所有映射-->
<mapping resource="com/rk/entity/Dept.hbm.xml"/>
</session-factory>
</hibernate-configuration>
完整的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"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd">
<!-- entity 实例 -->
<bean id="dept" class="com.rk.entity.Dept" scope="prototype"></bean>
<!-- dao 实例 -->
<bean id="deptDao" class="com.rk.dao.DeptDao">
<property name="sf" ref="sessionFactory"></property>
</bean>
<!-- service 实例 -->
<bean id="deptService" class="com.rk.service.DeptService">
<property name="deptDao" ref="deptDao"></property>
</bean>
<!-- 数据源:c3p0连接池 -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="com.mysql.jdbc.Driver"></property><!-- 数据库驱动 -->
<property name="jdbcUrl" value="jdbc:mysql:///test"></property><!-- 数据库连接URL -->
<property name="user" value="root"></property><!-- 用户名 -->
<property name="password" value="root"></property><!-- 密码 -->
<property name="minPoolSize" value="2"></property><!-- Pool最小连接数 -->
<property name="maxPoolSize" value="10"></property><!-- Pool最大连接数 -->
<property name="acquireIncrement" value="2"></property><!-- Pool每次增长连接数 -->
<property name="maxStatements" value="100"></property><!-- -->
</bean>
<!-- SessionFactory 的实例 -->
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource"></property>
<property name="configLocation" value="classpath:hibernate.cfg.xml"></property>
</bean>
<!-- 1.事务管理器类 -->
<bean id="txManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<constructor-arg name="sessionFactory" ref="sessionFactory"></constructor-arg>
</bean>
<!-- 2.事务策略配置 -->
<tx:advice id="txAdvice" transaction-manager="txManager">
<tx:attributes>
<tx:method name="find*" read-only="true"/>
<tx:method name="*" read-only="false"/>
</tx:attributes>
</tx:advice>
<!-- 3.事务策略应用 -->
<aop:config>
<aop:pointcut expression="execution(* com.rk.service.*.*(..))" id="pt"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="pt"/>
</aop:config>
</beans>
4.4、Hibernate的配置全部写到Spring的配置当中
换句话说,就是删除hibernate.cfg.xml,只保留applicationContext.xml文件
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"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd">
<!-- entity 实例 -->
<bean id="dept" class="com.rk.entity.Dept" scope="prototype"></bean>
<!-- dao 实例 -->
<bean id="deptDao" class="com.rk.dao.DeptDao">
<property name="sf" ref="sessionFactory"></property>
</bean>
<!-- service 实例 -->
<bean id="deptService" class="com.rk.service.DeptService">
<property name="deptDao" ref="deptDao"></property>
</bean>
<!-- 数据源:c3p0连接池 -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="com.mysql.jdbc.Driver"></property><!-- 数据库驱动 -->
<property name="jdbcUrl" value="jdbc:mysql:///test"></property><!-- 数据库连接URL -->
<property name="user" value="root"></property><!-- 用户名 -->
<property name="password" value="root"></property><!-- 密码 -->
<property name="minPoolSize" value="2"></property><!-- Pool最小连接数 -->
<property name="maxPoolSize" value="10"></property><!-- Pool最大连接数 -->
<property name="acquireIncrement" value="2"></property><!-- Pool每次增长连接数 -->
<property name="maxStatements" value="100"></property><!-- -->
</bean>
<!-- 【推荐】方式: 所有的配置全部都在Spring配置文件中完成 -->
<!-- SessionFactory 的实例 -->
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<!-- 注入连接池对象 -->
<property name="dataSource" ref="dataSource"></property>
<!-- hibernate常用配置 -->
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.format_sql">false</prop>
<prop key="hibernate.hbm2ddl.auto">update</prop>
</props>
</property>
<!-- hibernate映射配置 :两种写法 -->
<!--
<property name="mappingLocations">
<list>
<value>classpath:com/rk/entity/*.hbm.xml</value>
</list>
</property>
-->
<property name="mappingDirectoryLocations">
<list>
<value>classpath:com/rk/entity/</value>
</list>
</property>
</bean>
<!-- 1.事务管理器类 -->
<bean id="txManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<constructor-arg name="sessionFactory" ref="sessionFactory"></constructor-arg>
</bean>
<!-- 2.事务策略配置 -->
<tx:advice id="txAdvice" transaction-manager="txManager">
<tx:attributes>
<tx:method name="find*" read-only="true"/>
<tx:method name="*" read-only="false"/>
</tx:attributes>
</tx:advice>
<!-- 3.事务策略应用 -->
<aop:config>
<aop:pointcut expression="execution(* com.rk.service.*.*(..))" id="pt"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="pt"/>
</aop:config>
</beans>
4.5、总结:最终的文件状态
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"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd">
<!-- entity 实例 -->
<bean id="dept" class="com.rk.entity.Dept" scope="prototype"></bean>
<!-- dao 实例 -->
<bean id="deptDao" class="com.rk.dao.DeptDao">
<property name="sf" ref="sessionFactory"></property>
</bean>
<!-- service 实例 -->
<bean id="deptService" class="com.rk.service.DeptService">
<property name="deptDao" ref="deptDao"></property>
</bean>
<!-- 数据源配置:c3p0连接池 -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="com.mysql.jdbc.Driver"></property><!-- 数据库驱动 -->
<property name="jdbcUrl" value="jdbc:mysql:///test"></property><!-- 数据库连接URL -->
<property name="user" value="root"></property><!-- 用户名 -->
<property name="password" value="root"></property><!-- 密码 -->
<property name="minPoolSize" value="2"></property><!-- Pool最小连接数 -->
<property name="maxPoolSize" value="10"></property><!-- Pool最大连接数 -->
<property name="acquireIncrement" value="2"></property><!-- Pool每次增长连接数 -->
<property name="maxStatements" value="100"></property><!-- -->
</bean>
<!-- ###########Spring与Hibernate整合:SessionFactory start########### -->
<!-- 【推荐】方式: 所有的配置全部都在Spring配置文件中完成 -->
<!-- SessionFactory 的实例 -->
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<!-- 注入连接池对象 -->
<property name="dataSource" ref="dataSource"></property>
<!-- hibernate常用配置 -->
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.format_sql">false</prop>
<prop key="hibernate.hbm2ddl.auto">update</prop>
</props>
</property>
<!-- hibernate映射配置 :两种写法 -->
<!--
<property name="mappingLocations">
<list>
<value>classpath:com/rk/entity/*.hbm.xml</value>
</list>
</property>
-->
<property name="mappingDirectoryLocations">
<list>
<value>classpath:com/rk/entity/</value>
</list>
</property>
</bean>
<!-- ###########Spring与Hibernate整合:SessionFactory end########### -->
<!-- ###########Spring与Hibernate整合:事务 start########### -->
<!-- a. 配置事务管理器类 -->
<bean id="txManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<constructor-arg name="sessionFactory" ref="sessionFactory"></constructor-arg>
</bean>
<!-- b. 配置事务增强(拦截到方法后如果管理事务?) -->
<tx:advice id="txAdvice" transaction-manager="txManager">
<tx:attributes>
<tx:method name="find*" read-only="true"/>
<tx:method name="*" read-only="false"/>
</tx:attributes>
</tx:advice>
<!-- c. Aop配置(应用事务) -->
<aop:config>
<aop:pointcut expression="execution(* com.rk.service.*.*(..))" id="pt"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="pt"/>
</aop:config>
<!-- ###########Spring与Hibernate整合:事务 end########### -->
</beans>
Dept.hbm.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.rk.entity" auto-import="true">
<class name="Dept" table="T_Department">
<id name="deptId" column="id">
<generator class="native"></generator>
</id>
<version name="deptVersion" column="dept_version"></version>
<property name="deptName" column="name"></property>
</class>
</hibernate-mapping>
Dept.java
package com.rk.entity;
public class Dept
{
private int deptId;
private String deptName;
private int deptVersion;
public int getDeptId()
{
return deptId;
}
public void setDeptId(int deptId)
{
this.deptId = deptId;
}
public String getDeptName()
{
return deptName;
}
public void setDeptName(String deptName)
{
this.deptName = deptName;
}
public int getDeptVersion()
{
return deptVersion;
}
public void setDeptVersion(int deptVersion)
{
this.deptVersion = deptVersion;
}
@Override
public String toString()
{
return "Dept [deptId=" + deptId + ", deptName=" + deptName + ", deptVersion=" + deptVersion + "]";
}
}
DeptDao.java
package com.rk.dao;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import com.rk.entity.Dept;
public class DeptDao
{
private SessionFactory sf;
public void setSf(SessionFactory sf)
{
this.sf = sf;
}
public Dept findById(int id)
{
Session session = sf.getCurrentSession();
Dept dept = (Dept) session.get(Dept.class, id);
return dept;
}
public void save(Dept dept)
{
Session session = sf.getCurrentSession();
session.save(dept);
}
}
DeptService.java
package com.rk.service;
import com.rk.dao.DeptDao;
import com.rk.entity.Dept;
public class DeptService
{
private DeptDao deptDao;
public void setDeptDao(DeptDao deptDao)
{
this.deptDao = deptDao;
}
public Dept findById(int id)
{
return deptDao.findById(id);
}
public void save(Dept dept)
{
deptDao.save(dept);
// int i = 1/0;
Dept newDept = new Dept();
newDept.setDeptName("HAHA_LLO");
deptDao.save(newDept);
}
}
App.java
package com.rk.test;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.rk.entity.Dept;
import com.rk.service.DeptService;
public class App
{
@Test
public void test()
{
ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
DeptService deptService = (DeptService) ac.getBean("deptService");
Dept dept = deptService.findById(3);
System.out.println(dept);
Dept newDept = (Dept) ac.getBean("dept");
newDept.setDeptName("HelloWorld");
deptService.save(newDept);
}
}