1 先定义配置文件hibernate-context.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:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd"> <bean id="placeholderConfig" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="location"> <value>classpath:db.properties </value> </property> </bean> <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> <property name="driverClassName" value="${db.driverClassName}" /> <property name="url" value="${db.url}NIHAO" /> <property name="username" value="${db.username}" /> <property name="password" value="${db.password}" /> <property name="initialSize" value="2" /> <property name="maxActive" value="20" /> <property name="maxWait" value="-1" /> <property name="maxIdle" value="10" /> <property name="removeAbandoned" value="true" /> <property name="removeAbandonedTimeout" value="30000" /> <property name="logAbandoned" value="true" /> </bean> <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> <property name="dataSource"> <ref bean="dataSource" /> </property> <property name="mappingResources"> <list> <value>springapp/domain/Product.hbm.xml </value> </list> </property> <property name="hibernateProperties"> <props> <prop key="hibernate.dialect">org.hibernate.dialect.SQLServerDialect </prop> <prop key="hibernate.show_sql">true</prop> </props> </property> </bean> <!--transactionManager--> <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> <property name="sessionFactory"> <ref local="sessionFactory" /> </property> </bean> <bean id="transactionInterceptor" class="org.springframework.transaction.interceptor.TransactionInterceptor"> <property name="transactionManager" ref="transactionManager" /> <property name="transactionAttributeSource" ref="txAttributeSource" /> </bean> <bean id="txAttributeSource" class="org.springframework.transaction.interceptor.NameMatchTransactionAttributeSource"> <property name="properties"> <props> <prop key="save*">PROPAGATION_REQUIRED</prop> </props> </property> </bean> <bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator"> <property name="beanNames"> <list> <value>*Dao</value> </list> </property> <property name="interceptorNames"> <list> <value>transactionInterceptor</value> </list> </property> </bean> <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"> <property name="dataSource" ref="dataSource"></property> </bean> <bean id="productDao" class="springapp.repository.HibernateProductDao"> <property name="sessionFactory" ref="sessionFactory"></property> </bean> </beans>
2 HibernateProductDao.java源代码
public class HibernateProductDao implements ProductDao { private SessionFactory sessionFactory; public void setSessionFactory(SessionFactory sessionFactory) { this.sessionFactory = sessionFactory; } @Override public List<Product> getProductList() { return null; } @Override public void saveProduct(Product prod) { sessionFactory.getCurrentSession().saveOrUpdate(prod); } }
3 Product.hbm.xml
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="springapp.domain"> <class name="Product" table="PRODUCTS" select-before-update="false" dynamic-update="false" dynamic-insert="false" optimistic-lock="version"> <id name="id" column="Id" type="java.lang.Integer" length="19"> <generator class="assigned"></generator> </id> <property name="price" type="java.lang.Double" update="true" insert="true" access="property" column="PRICE" length="10" not-null="false" /> <property name="description" type="java.lang.String" update="true" insert="true" access="property" column="DESCRIPTION" length="50" not-null="false" /> </class> </hibernate-mapping>
4 测试代码实验了保存实体的例子
public class HibernateProductDaoTest { static ApplicationContext ctx = new ClassPathXmlApplicationContext( new String[] { "file:src/hibernate-context.xml" }); public static void main(String[] args) { ProductDao dao = (ProductDao) ctx.getBean("productDao"); Product product = new Product(); product.setId(2); product.setPrice(12.2); product.setDescription("description1"); dao.saveProduct(product); } }
5 如果不配置事务,则会抛出异常:
Exception in thread "main" org.hibernate.HibernateException: No Hibernate Session bound to thread, and configuration does not allow creation of non-transactional one here at org.springframework.orm.hibernate3.SpringSessionContext.currentSession(SpringSessionContext.java:63) at org.hibernate.impl.SessionFactoryImpl.getCurrentSession(SessionFactoryImpl.java:574) at springapp.repository.HibernateProductDao.saveProduct(HibernateProductDao.java:24) at springapp.repository.HibernateProductDaoTest.main(HibernateProductDaoTest.java:19)
6 使用HibrenateTemplate
HibrenateTemplateDao.java
public class HibernateTemplateProductDao implements ProductDao { private HibernateTemplate hibernateTemplate; public void setHibernateTemplate(HibernateTemplate hibernateTemplate) { this.hibernateTemplate = hibernateTemplate; } @Override public List<Product> getProductList() { List result = hibernateTemplate.find("from Product " + "where id = ? ", new Object[] { 1 }); return result; } @Override public void saveProduct(Product prod) { } }
7 配置文件
<?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:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd"> <bean id="placeholderConfig" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="location"> <value>classpath:db.properties </value> </property> </bean> <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> <property name="driverClassName" value="${db.driverClassName}" /> <property name="url" value="${db.url}NIHAO" /> <property name="username" value="${db.username}" /> <property name="password" value="${db.password}" /> <property name="initialSize" value="2" /> <property name="maxActive" value="20" /> <property name="maxWait" value="-1" /> <property name="maxIdle" value="10" /> <property name="removeAbandoned" value="true" /> <property name="removeAbandonedTimeout" value="30000" /> <property name="logAbandoned" value="true" /> </bean> <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> <property name="dataSource"> <ref bean="dataSource" /> </property> <property name="mappingResources"> <list> <value>springapp/domain/Product.hbm.xml </value> </list> </property> <property name="hibernateProperties"> <props> <prop key="hibernate.dialect">org.hibernate.dialect.SQLServerDialect </prop> <prop key="hibernate.show_sql">true</prop> </props> </property> </bean> <!--transactionManager--> <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> <property name="sessionFactory"> <ref local="sessionFactory" /> </property> </bean> <bean id="transactionInterceptor" class="org.springframework.transaction.interceptor.TransactionInterceptor"> <property name="transactionManager" ref="transactionManager" /> <property name="transactionAttributeSource" ref="txAttributeSource" /> </bean> <bean id="txAttributeSource" class="org.springframework.transaction.interceptor.NameMatchTransactionAttributeSource"> <property name="properties"> <props> <prop key="save*">PROPAGATION_REQUIRED</prop> <prop key="get*">PROPAGATION_REQUIRED</prop> </props> </property> </bean> <bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator"> <property name="beanNames"> <list> <value>*Dao</value> </list> </property> <property name="interceptorNames"> <list> <value>transactionInterceptor</value> </list> </property> </bean> <bean id="productDao" class="springapp.repository.HibernateProductDao"> <property name="sessionFactory" ref="sessionFactory"></property> </bean> <bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate"> <property name="sessionFactory" ref="sessionFactory"></property> </bean> <bean id="hibernateTemplateProductDao" class="springapp.repository.HibernateTemplateProductDao"> <property name="hibernateTemplate" ref="hibernateTemplate"></property> </bean> </beans>
8 测试代码
public class HibernateTemplateProductDaoTest { static ApplicationContext ctx = new ClassPathXmlApplicationContext( new String[] { "file:src/hibernate-context.xml" }); public static void main(String[] args) { ProductDao dao = (ProductDao) ctx .getBean("hibernateTemplateProductDao"); Product product = new Product(); product.setId(2); product.setPrice(12.2); product.setDescription("description1"); dao.saveProduct(product); List<Product> list = dao.getProductList(); for (Product p : list) { System.out.println(p.getDescription()); } } }