Spring与Hibernate整合的关键点:
1) Hibernate的SessionFactory对象交给Spring创建;
2) Hibernate事务交给Spring的声明式事务管理。
Spring和Hibernate整合的步骤:
1)引入jar包
2)配置:hibernate.cfg.xml、*.hbm.xml、applicationContext.xml
3)搭建环境、单独测试
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
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); } }
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); }
其中,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); } }
其中,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); } }
这里只涉及到修改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>
换句话说,就是删除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>
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); } }
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。