hibernate3.1起,之前與之後的版本,對hibernateDaoSupport方法的支持出現了變化,3.1之前的版本可以通過繼承hibernateDaoSupport,然後獲得其裏面封裝好的中的getHibernateTemplate進行數據庫的操作,但3.1之後,spring獲取session更方便,直接通過sessionFactory的getCurrentSession就可以取得session了,所以,爲了學習如何使用getCurrentSession進行數據庫的操作,我在網上查找了很多資料,下面來總結一下,個人的學習體驗。(本人使用的hibernate和spring版本均是4.1.6,數據庫爲oracle 11g)
項目結構圖
Dao實現層的代碼
package com.chat.dao.impl;
import org.springframework.stereotype.Repository;
import com.chat.common.dao.impl.HibernateBaseUtil;
import com.chat.dao.IChatUserDao;
import com.chat.entity.ChatUser;
@Repository
public class ChatUserDao extends HibernateBaseUtil<ChatUser, ChatUser> implements IChatUserDao{
}
Dao層接口代碼
package com.chat.dao;
import com.chat.common.dao.IHibernateBaseUtil;
import com.chat.entity.ChatUser;
public interface IChatUserDao extends IHibernateBaseUtil<ChatUser, ChatUser> {
}
上面的代碼是不是很簡單?那是因爲對數據庫的基本操作都封裝在一個工具類中了,下面直接看看該工具類代碼
package com.chat.common.dao.impl;
import java.io.Serializable;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import org.hibernate.Query;
import org.hibernate.ScrollableResults;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import com.chat.common.dao.IHibernateBaseUtil;
import com.chat.common.dao.PageResults;
public class HibernateBaseUtil<T, ID extends Serializable> implements IHibernateBaseUtil<T, ID> {
protected Class<T> entityClass;
public HibernateBaseUtil() {
}
private SessionFactory sessionFactory;
@Autowired
private void sessionFactory(SessionFactory sessionFactory) {
// TODO set sessionFactory
this.sessionFactory = sessionFactory;
}
/**
*
* @return session
*/
public Session getSession() {
//需要開啓事物,才能得到CurrentSession,這裏我採用aop事務配置,你也可以採用@Transactional進行聲明式事務配置
return this.sessionFactory.getCurrentSession();
}
@SuppressWarnings({ "unchecked", "rawtypes" })
protected Class getEntityClass() {
if (entityClass == null) {
Type type = getClass().getGenericSuperclass(); //反射方式獲取父類全稱 即com.chat.common.dao.impl.HibernateBaseUtil<com.chat.dao.impl.ChatUserDao, com.chat.dao.impl.ChatUserDao>
Type[] t = ((ParameterizedType) type).getActualTypeArguments(); //獲取父類的泛型參數,並存爲數組
entityClass = (Class<T>) t[0]; //獲取第一個參數,即com.chat.dao.impl.ChatUserDao
//entityClass = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];
}
return entityClass;
}
/**
* <保存實體>
* <完整保存實體>
* @param t 實體參數
* @see com.chat.common.dao.IHibernateBaseUtil#saveEntity(java.lang.Object)
*/
@Override
public void saveEntity(T t) {
getSession().save(t);
getSession().flush(); //刷新事務,執行之後將會提交事務,可以防止事務堆積在緩存裏
}
/**
* <保存或者更新實體>
* @param t 實體
* @see com.chat.common.dao.IHibernateBaseUtil#saveOrUpdate(java.lang.Object)
*/
@Override
public void saveOrUpdate(T t) {
getSession().saveOrUpdate(t);
getSession().flush(); //刷新事務,執行之後將會提交事務,可以防止事務堆積在緩存裏
}
/**
* <get>
* <查找的get方法>
* @param id 實體的id
* @return 查詢出來的實體
* @see com.chat.common.dao.IHibernateBaseUtil#get(java.io.Serializable)
*/
@SuppressWarnings("unchecked")
@Override
public T get(ID id) {
T load = (T)getSession().get(getEntityClass(), id);
return load;
}
/**
* <contains>
* @param t 實體
* @return 是否包含
* @see com.chat.common.dao.IHibernateBaseUtil#contains(java.lang.Object)
*/
@Override
public boolean contains(T t) {
return getSession().contains(t);
}
/**
* <delete>
* <刪除表中的t數據>
* @param t 實體
* @see com.chat.common.dao.IHibernateBaseUtil#delete(java.lang.Object)
*/
@Override
public void delete(T t) {
getSession().delete(t);
}
/**
* <delete>
* <刪除表中的t數據>
* @param hqlString hql語句
* @param values 不定參數數組
* @see com.chat.common.dao.IHibernateBaseUtil#deleteSql(java.lang.Object)
*/
@Override
public void deleteSql(String sqlString, Object... values) {
Query query = getSession().createQuery(sqlString);
if (values != null)
{
for (int i = 0; i < values.length; i++)
{
query.setParameter(i, values[i]);
}
}
query.executeUpdate();
}
/**
* <根據ID刪除數據>
* @param Id 實體id
* @return 是否刪除成功
* @see com.chat.common.dao.IHibernateBaseUtil#deleteById(java.io.Serializable)
*/
@Override
public boolean deleteById(ID Id) {
T t = get(Id);
if(t == null){
return false;
}
delete(t);
return true;
}
/**
* <刪除所有>
* @param entities 實體的Collection集合
* @see com.chat.common.dao.IHibernateBaseUtil#deleteAll(java.util.Collection)
*/
@Override
public void deleteAll(Collection<T> entities) {
for(Object entity : entities) {
getSession().delete(entity);
}
}
/**
* <執行Hql語句>
* @param hqlString hql語句
* @param values 不定參數數組
* @see com.chat.common.dao.IHibernateBaseUtil#queryHql(java.lang.String, java.lang.Object[])
*/
@Override
public void queryHql(String hqlString, Object... values) {
Query query = getSession().createQuery(hqlString);
if (values != null)
{
for (int i = 0; i < values.length; i++)
{
query.setParameter(i, values[i]);
}
}
query.executeUpdate();
}
/**
* <執行Sql語句>
* @param sqlString sql語句
* @param values 不定參數數組
* @see com.chat.common.dao.IHibernateBaseUtil#querySql(java.lang.String, java.lang.Object[])
*/
@Override
public void querySql(String sqlString, Object... values) {
Query query = getSession().createSQLQuery(sqlString);
if (values != null)
{
for (int i = 0; i < values.length; i++)
{
query.setParameter(i, values[i]);
}
}
query.executeUpdate();
}
/**
* <根據HQL語句查找唯一實體>
* @param hqlString HQL語句
* @param values 不定參數的Object數組
* @return 查詢實體
* @see com.chat.common.dao.IHibernateBaseUtil#getByHQL(java.lang.String, java.lang.Object[])
*/
@SuppressWarnings("unchecked")
@Override
public T getByHQL(String hqlString, Object... values) {
Query query = getSession().createQuery(hqlString);
if (values != null)
{
for (int i = 0; i < values.length; i++)
{
query.setParameter(i, values[i]);
}
}
return (T) query.uniqueResult();
}
/**
* <根據SQL語句查找唯一實體>
* @param sqlString SQL語句
* @param values 不定參數的Object數組
* @return 查詢實體
* @see com.chat.common.dao.IHibernateBaseUtil#getBySQL(java.lang.String, java.lang.Object[])
*/
@SuppressWarnings("unchecked")
@Override
public T getBySQL(String sqlString, Object... values) {
Query query = getSession().createSQLQuery(sqlString);
if (values != null)
{
for (int i = 0; i < values.length; i++)
{
query.setParameter(i, values[i]);
}
}
return (T) query.uniqueResult();
}
@SuppressWarnings("unchecked")
@Override
public List<T> getAllByHQL(String hqlString){
Query query = getSession().createQuery(hqlString);
return query.list();
}
/**
* <根據HQL語句,得到對應的list>
* @param hqlString HQL語句
* @param values 不定參數的Object數組
* @return 查詢多個實體的List集合
* @see com.chat.common.dao.IHibernateBaseUtil#getListByHQL(java.lang.String, java.lang.Object[])
*/
@SuppressWarnings("unchecked")
@Override
public List<T> getListByHQL(String hqlString, Object... values) {
Query query = getSession().createQuery(hqlString);
if (values != null)
{
for (int i = 0; i < values.length; i++)
{
query.setParameter(i, values[i]);
}
}
return query.list();
}
/**
* <根據SQL語句,得到對應的list>
* @param sqlString HQL語句
* @param values 不定參數的Object數組
* @return 查詢多個實體的List集合
* @see com.chat.common.dao.IHibernateBaseUtil#getListBySQL(java.lang.String, java.lang.Object[])
*/
@SuppressWarnings("unchecked")
@Override
public List<T> getListBySQL(String sqlString, Object... values ) {
Query query = getSession().createSQLQuery(sqlString);
if (values != null)
{
for (int i = 0; i < values.length; i++)
{
query.setParameter(i, values[i]);
}
}
return query.list();
}
/**
* <update>
* @param t 實體
* @see com.chat.common.dao.IHibernateBaseUtil#update(java.lang.Object)
*/
@Override
public void updateEntity(T t) {
getSession().update(t);
this.getSession().flush(); //刷新事務,執行之後將會提交事務,可以防止事務堆積在緩存裏
}
/**
* 根據id更新實體類
* @param hql
* @param id
*/
@Override
public void updateByHql(String hql,Object... values){
Query query = this.getSession().createQuery(hql);
if(values != null){
for(int i=0;i<values.length;i++){
query.setParameter(i, values[i]);
}
}
query.executeUpdate();
}
/**
* <根據HQL和參數得到記錄數>
* @param hql HQL語句
* @param values 不定參數的Object數組
* @return 記錄總數
* @see com.chat.common.dao.IHibernateBaseUtil#countByHql(java.lang.String, java.lang.Object[])
*/
@Override
public Long countByHql(String hql, Object... values) {
Query query = getSession().createQuery(hql);
if(values != null){
for(int i = 0; i < values.length; i++) {
query.setParameter(i, values[i]);
}
}
return (Long) query.uniqueResult();
}
/**
* <指定HQL得到全部記錄數>
* @param hql HQL語句
* @return 記錄總數
* @see com.chat.common.dao.IHibernateBaseUtil#countAll(java.lang.String, java.lang.Object[])
*/
@Override
public Long countAll(String hql) {
Query query = getSession().createQuery(hql);
return (Long) query.uniqueResult();
}
/**
* <HQL分頁查詢>
* @param hql HQL語句
* @param countHql 查詢記錄條數的HQL語句
* @param pageNo 下一頁
* @param pageSize 一頁總條數
* @param values 不定Object數組參數
* @return PageResults的封裝類,裏面包含了頁碼的信息以及查詢的數據List集合
* @see com.chat.common.dao.IHibernateBaseUtil#findPageByFetchedHql(java.lang.String, java.lang.String, int, int, java.lang.Object[])
*/
@SuppressWarnings("unchecked")
@Override
public PageResults<T> findPageByFetchedHql(String hql, String countHql,
int pageNo, int pageSize, Object... values) {
PageResults<T> retValue = new PageResults<T>();
Query query = getSession().createQuery(hql);
if(values != null){
for(int i = 0; i < values.length; i++) {
query.setParameter(i, values[i]);
}
}
int currentPage = pageNo > 1 ? pageNo : 1;
retValue.setCurrentPage(currentPage);
retValue.setPageSize(pageSize);
if (countHql == null)
{
ScrollableResults results = query.scroll();
results.last();
retValue.setTotalCount(results.getRowNumber() + 1);// 設置總記錄數
}
else
{
Long count = countByHql(countHql, values);
retValue.setTotalCount(count.intValue());
}
retValue.resetPageNo();
List<T> itemList = query.setFirstResult((currentPage - 1) * pageSize).setMaxResults(pageSize).list();
if (itemList == null)
{
itemList = new ArrayList<T>();
}
retValue.setResults(itemList);
return retValue;
}
}
工具類的實現的接口代碼
package com.chat.common.dao;
import java.io.Serializable;
import java.util.Collection;
import java.util.List;
public interface IHibernateBaseUtil<T, ID extends Serializable> {
/**
* <保存實體>
* <完整保存實體>
* @param t 實體參數
*/
public void saveEntity(T t);
/**
* <保存或者更新實體>
* @param t 實體
*/
public void saveOrUpdate(T t);
/**
* <get>
* <查找的get方法>
* @param id 實體的id
* @return 查詢出來的實體
*/
public T get(ID id);
/**
* <contains>
* @param t 實體
* @return 是否包含
*/
public boolean contains(T t);
/**
* <delete>
* <刪除表中的t數據>
* @param t 實體
*/
public void delete(T t);
/**
* <根據ID刪除數據>
* @param Id 實體id
* @return 是否刪除成功
*/
public boolean deleteById(ID Id);
/**
* <根據用戶名刪除數據>
* @param Id
* @return boolean
*/
public void deleteSql(String sqlString, Object... values);
/**
* <刪除所有>
* @param entities 實體的Collection集合
*/
public void deleteAll(Collection<T> entities);
/**
* <執行Hql語句>
* @param hqlString hql
* @param values 不定參數數組
*/
public void queryHql(String hqlString, Object... values);
/**
* <執行Sql語句>
* @param sqlString sql
* @param values 不定參數數組
*/
public void querySql(String sqlString, Object... values);
/**
* <根據HQL語句查找唯一實體>
* @param hqlString HQL語句
* @param values 不定參數的Object數組
* @return 查詢實體
*/
public T getByHQL(String hqlString, Object... values);
/**
* <根據SQL語句查找唯一實體>
* @param sqlString SQL語句
* @param values 不定參數的Object數組
* @return 查詢實體
*/
public T getBySQL(String sqlString, Object... values);
/**
*
* @param hqlString
* @return 查詢集合
*/
public List<T> getAllByHQL(String hqlString);
/**
* <根據HQL語句,得到對應的list>
* @param hqlString HQL語句
* @param values 不定參數的Object數組
* @return 查詢多個實體的List集合
*/
public List<T> getListByHQL(String hqlString, Object... values);
/**
* <根據SQL語句,得到對應的list>
* @param sqlString HQL語句
* @param values 不定參數的Object數組
* @return 查詢多個實體的List集合
*/
public List<T> getListBySQL(String sqlString, Object... values);
/**
* <update>
* @param t 實體
*/
public void updateEntity(T t);
/**
* 根據id更新實體類
* @param hql
* @param id
*/
public void updateByHql(String hql,Object... values);
/**
* <根據HQL得到記錄數>
* @param hql HQL語句
* @param values 不定參數的Object數組
* @return 記錄總數
*/
public Long countByHql(String hql, Object... values);
/**
* <根據HQL得到全部記錄數>
* @param hql
* @return 記錄總數
*/
public Long countAll(String hql);
/**
* <HQL分頁查詢>
* @param hql HQL語句
* @param countHql 查詢記錄條數的HQL語句
* @param pageNo 下一頁
* @param pageSize 一頁總條數
* @param values 不定Object數組參數
* @return PageResults的封裝類,裏面包含了頁碼的信息以及查詢的數據List集合
*/
public PageResults<T> findPageByFetchedHql(String hql, String countHql, int pageNo, int pageSize, Object... values);
}
dao層的實現層直接繼承了工具類,dao 層的接口直接繼承了工具類的接口,一個咬住一個,所以service層的實現類和接口的代碼分別也貼出來。
package com.chat.service.impl;
import java.util.List;
import javax.annotation.Resource;
import org.springframework.stereotype.Service;
import com.chat.dao.IChatUserDao;
import com.chat.entity.ChatUser;
import com.chat.service.IChatUserDaoService;
@Service
public class ChatUserDaoService implements IChatUserDaoService{
@Resource
private IChatUserDao iChatUserDao;
@Override
public List<ChatUser> getUserByName(String username){
return iChatUserDao.getListByHQL("from ChatUser where userName=?", username);
}
@Override
public void saveChatUser(ChatUser chatUser){
iChatUserDao.saveEntity(chatUser);
}
@Override
public boolean checkLogin(String username,String password){
ChatUser chatUser = iChatUserDao.getByHQL("from ChatUser where userName=? and password=? ",username, password);
if(chatUser == null && "".equals(chatUser)){
return false;
}
return true;
}
}
package com.chat.service;
import java.util.List;
import com.chat.entity.ChatUser;
public interface IChatUserDaoService {
/**
* 獲取指定姓名的用戶
* @param username
* @return
*/
public List<ChatUser> getUserByName(String username);
/**
* 保存用戶
* @param chatUser
*/
public void saveChatUser(ChatUser chatUser);
/**
* 判斷登錄
* @param username
* @param password
* @return
*/
public boolean checkLogin(String username,String password);
}
下面分別是spring的配置文件、spring mvc配置文件和web配置文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p"
xmlns:mvc="http://www.springframework.org/schema/mvc" 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-3.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
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">
<!--加載屬性文件 -->
<context:property-placeholder location="WEB-INF/config/scottDB.properties"/>
<!-- 掃描註解 -->
<context:component-scan base-package="com.chat" >
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
<!-- 使用jdbc驅動數據源 -->
<bean id="dataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="${scott.jdbc.driverClassName}"></property>
<property name="url" value="${scott.jdbc.url}"></property>
<property name="username" value="${scott.jdbc.username}"></property>
<property name="password" value="${scott.jdbc.password}"></property>
</bean>
<!-- 配置hibernate SessionFactory -->
<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource"></property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">${hibernate.dialect}</prop>
<prop key="hibernate.hbm2ddl.auto">none</prop>
<prop key="hibernate.show_sql">${hibernate.show_sql}</prop>
<prop key="hibernate.format_sql">${hibernate.format_sql}</prop>
<prop key="hibernate.connection.autocommit">${hibernate.connection.autocommit}</prop>
<prop key="hibernate.current_session_context_class">org.springframework.orm.hibernate4.SpringSessionContext</prop>
</props>
</property>
<!-- 掃描所有實體類註解 @Entity -->
<property name="packagesToScan" value="com.chat.**.entity">
</property>
</bean>
<!-- 事務管理器 -->
<bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"></property>
</bean>
<!-- 配置切面-->
<tx:advice id="chatAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="find*" propagation="SUPPORTS" read-only="true" />
<tx:method name="get*" propagation="SUPPORTS" read-only="true" />
<tx:method name="select*" propagation="SUPPORTS" read-only="true"/>
<tx:method name="check*" propagation="SUPPORTS" read-only="true"/>
<tx:method name="*" propagation="REQUIRED" read-only="false" />
</tx:attributes>
</tx:advice>
<!-- 切點、通知配置 -->
<aop:config>
<aop:pointcut id="allManagerMethod" expression="execution(* com.firstest.*.service.*.*(..))"/>
<aop:advisor pointcut-ref="allManagerMethod" advice-ref="chatAdvice"/>
</aop:config>
<aop:aspectj-autoproxy proxy-target-class="true"/>
</beans>
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">
<!-- 開啓註解 -->
<mvc:annotation-driven/>
<!--掃描controller註解 @Controller -->
<context:component-scan base-package="com.chat">
<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
<!--攔截以Service結尾的類,實現事務代理 -->
<!-- <bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
<property name="beanNames">
<list>
<value>*Service</value>
</list>
</property>
<property name="interceptorNames">
<list>
<value>transactionBase</value>
</list>
</property>
</bean> -->
<!-- 靜態資源訪問 -->
<mvc:default-servlet-handler />
<!-- <mvc:resources location="/chat/" mapping="/chat/**"/>
<mvc:resources location="/chat/CSS/" mapping="/chat/CSS/**"/>
<mvc:resources location="/chat/js/" mapping="/chat/js/**"/>
<mvc:resources location="/chat/pages/" mapping="/chat/pages/**"/> -->
<!-- 視圖解析器 -->
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
<property name="prefix" value="/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
<!-- 支持上傳文件 ,defaultEncoding:默認編碼格式,maxUploadSize:上傳文件最大值,uploadTempDir:臨時文件存放路徑-->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="defaultEncoding" value="UTF-8" />
<property name="maxUploadSize" value="1048576" />
</bean>
</beans>
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0">
<display-name>ChatRoom</display-name>
<welcome-file-list>
<welcome-file>chat/pages/index.jsp</welcome-file>
<welcome-file>index.html</welcome-file>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<!-- 加載所有的spring配置文件 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>WEB-INF/config/applicationContext.xml</param-value>
</context-param>
<!-- 配置spring監聽 -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- 配置spring mvc -->
<servlet>
<servlet-name>springMVC</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>WEB-INF/config/spring-mvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springMVC</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>springMVC</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<!-- 設置字符集 -->
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!--配置session控制器開關 -->
<filter>
<filter-name>openSessionInViewFilter</filter-name>
<filter-class>org.springframework.orm.hibernate4.support.OpenSessionInViewFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>openSessionInViewFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
在搭建的過程中自己遇到了許多問題,比如像getCurrentSession的事務配置問題,save()方法執行後沒有保存到數據庫,還有直接update()一個實體類,會報錯(a different object with the same identifier value was already associated)等等問題,有些問題是解決了,但有些仍會是帶着困惑。。
但通過這次配置,最起碼讓我知道了,getCurrentSession的事務配置是很重要的,因爲它要在事務中才能拿到getCurrentSession,這裏我採用aop事務配置,但你也可以採用@Transactional進行聲明式事務配置。
save()方法調用後並沒有保存數據到數據庫,那是因爲hibernate的緩存機制的原因,save()提交了之後並沒有立即寫入,而是要等到緩存存滿了之後才一併提交,這樣的機制雖然會降低數據庫的I/O,但有時候對一個程序來說卻是一個大麻煩,所以在這裏我的處理方式是調用flush(),進行事務的刷新,使得Hibernate即時將數據寫入,當然,這還有其他的解決辦法,大家也可以上網查找一下。
最後,update()方法是最讓我困惑的,因爲不管我怎麼去使用,都會像上說的那樣報錯,最後無奈了,只好自己寫一個方法,用手動寫hql語句來更新,最後呼喚下,哪裏有大神可以給我解惑的,歡迎留言!
項目寫得不好,若有問題,或者有更好的實現方式,歡迎大家評論留言!
生活就像海洋,只有意志堅強的人才能到達彼岸!