Spring中的HibernateTemplate
就類似JdbcTemplate一樣,HibernateTemplate封裝了Hibernate儲存時的一些細節,例如try...catch的例外處理等等,HibernateTemplate的使用在觀念上與JdbcTemplate是類似的,這邊簡單的介紹一下HibernateTemplate的使用。
首先我們看一下Bean定義檔,這與前一個主題沒什麼太大的差別:
程式碼:
xml 程式碼
xml 程式碼
- <?xml version="1.0" encoding="UTF-8"?>
- <!DOCTYPE beans PUBLIC "-//SPRING/DTD BEAN/EN" "http://www.springframework.org/dtd/spring-beans.dtd">
- <beans>
- <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
- <property name="driverClassName">
- <value>com.mysql.jdbc.Driver</value>
- </property>
- <property name="url">
- <value>jdbc:mysql://localhost:3306/TestDB</value>
- </property>
- <property name="username">
- <value>caterpillar</value>
- </property>
- <property name="password">
- <value>123456</value>
- </property>
- </bean>
- <bean id="sessionFactory" class="org.springframework.orm.hibernate.LocalSessionFactoryBean" destroy-method="close">
- <property name="dataSource">
- <ref bean="dataSource"/>
- </property>
- <property name="mappingResources">
- <list>
- <value>User.hbm.xml</value>
- </list>
- </property>
- <property name="hibernateProperties">
- <props>
- <prop key="hibernate.dialect">
- net.sf.hibernate.dialect.MySQLDialect
- </prop>
- <prop key="hibernate.show_sql">
- true
- </prop>
- </props>
- </property>
- </bean>
- <bean id="userDAO" class="onlyfun.caterpillar.UserDAO">
- <property name="sessionFactory">
- <ref bean="sessionFactory"/>
- </property>
- </bean>
- </beans>
在這邊UserDAO將繼承自HibernateDaoSupport類別,這可以幫我們省去一些管理sessionFactory、hibernateTemplate資源的工作,我們只要注入sessionFactory就好了,我們的DAO設計如下:
程式碼:
UserDAO.java
package onlyfun.caterpillar;
import net.sf.hibernate.*;
import org.springframework.orm.hibernate.*;
import org.springframework.orm.hibernate.support.*;
public class UserDAO extends HibernateDaoSupport {
public void insertUser(final User user) {
getHibernateTemplate().execute(new HibernateCallback() {
public Object doInHibernate(Session session) throws HibernateException {
session.saveOrUpdate(user);
return null;
}
});
}
}
只要注入sessionFactory,之後呼叫getHibernateTemplate()就可以取得HibernateTemplate的例項,我們利用callback方法,實作HibernateCallback介面,在doInHibernate()中進行儲存操作。
對於簡單的儲存操作,我們甚至可以直接使用HibernateTemplate所提供的find()、load()、saveOrUpdate()、delete()等方法,而不用使用callback,例如:
程式碼:
UserDAO.java
package onlyfun.caterpillar;
import org.springframework.orm.hibernate.support.*;
public class UserDAO extends HibernateDaoSupport {
public void insertUser(User user) {
getHibernateTemplate().saveOrUpdate(user);
}
}
不用懷疑,程式就是如此簡單,所有的細節都被封裝起來了。
HibernateTemplate中只能丟出unckecked例外,如果需要處理checked例外,則您可以使用AOP Interceptor來取代HibernateTemplate,從而取代callback方法,在參考手冊中有介紹如何配置,這邊複製過來以便參考:
程式碼:
xml 程式碼
- ....
- <bean id="myHibernateInterceptor"
- class="org.springframework.orm.hibernate.HibernateInterceptor">
- <property name="sessionFactory">
- <ref bean="mySessionFactory"/>
- </property>
- </bean>
- <bean id="myProductDaoTarget" class="product.ProductDaoImpl">
- <property name="sessionFactory">
- <ref bean="mySessionFactory"/>
- </property>
- </bean>
- <bean id="myProductDao" class="org.springframework.aop.framework.ProxyFactoryBean">
- <property name="proxyInterfaces">
- <value>product.ProductDao</value>
- </property>
- <property name="interceptorNames">
- <list>
- <value>myHibernateInterceptor</value>
- <value>myProductDaoTarget</value>
- </list>
- </property>
- </bean>
- ....
程式碼:
ProductDaoImpl.java
public class ProductDaoImpl extends HibernateDaoSupport implements ProductDao {
public List loadProductsByCategory(final String category) throws MyException {
Session session = SessionFactoryUtils.getSession(getSessionFactory(), false);
try {
List result = session.find(
"from test.Product product where product.category=?",
category, Hibernate.STRING);
if (result == null) {
throw new MyException("invalid search result");
}
return result;
}
catch (HibernateException ex) {
throw SessionFactoryUtils.convertHibernateAccessException(ex);
}
}
}
相關文章
- hibernateTemplate session關閉Session
- 關於jdon的HibernateTemplate類的事務處理
- 對hibernateTemplate 類的 方法中使用 new HibernateCallback()介面形象doInHibernate()方法的理解
- Spring中的ResourceHandlerSpring
- Spring中的BeanSpringBean
- Spring 中的AOPSpring
- spring中autowire的用法Spring
- Spring原始碼分析(三) -- Spring中的BeanFactoryPostProcessorSpring原始碼Bean
- Spring Boot(十一):Spring Boot 中 MongoDB 的使用Spring BootMongoDB
- Spring Boot(三):Spring Boot 中 Redis 的使用Spring BootRedis
- Spring 中的 BeanFactory 與 FactoryBeanSpringBean
- Spring中Enable*功能的使用Spring
- Spring中的觀察者模式Spring模式
- Spring中重要的註解Spring
- Spring中的REST分頁SpringREST
- 關於Spring中的useSuffixPatternMatchSpring
- Spring中Bean的作用域SpringBean
- Spring中bean的含義SpringBean
- Spring中的預設beanNameSpringBean
- AspectJ 在 Spring 中的使用Spring
- Spring中的事務控制Spring
- Spring 中的事務管理Spring
- Spring中的@scope註解Spring
- Spring在ssh中的作用Spring
- [收藏]Spring Security中的ACLSpring
- Spring中的模板技術Spring
- Spring的BeanFactoryPostProcessor中屬性SpringBean
- Spring Security 中的 BCryptPasswordEncoderSpring
- spring中的IOC說明Spring
- spring — Spring中的事件驅動機制解析Spring事件
- Spring核心系列之Spring中的事務Spring
- 【Spring】Spring中的迴圈依賴及解決Spring
- Spring中眼花繚亂的BeanDefinitionSpringBean
- 談談Spring中的BeanPostProcessor介面SpringBean
- Spring Cloud 中的元件介紹SpringCloud元件
- 何為Spring中的配置類?Spring
- Spring中@Import註解的使用SpringImport
- Spring中bean的生命週期SpringBean