hibernate4的dao層工具類

hibernate3.1起,之前與之後的版本,對hibernateDaoSupport方法的支持出現了變化,3.1之前的版本可以通過繼承hibernateDaoSupport,然後獲得其裏面封裝好的中的getHibernateTemplate進行數據庫的操作,但3.1之後,spring獲取session更方便,直接通過sessionFactory的getCurrentSession就可以取得session了,所以,爲了學習如何使用getCurrentSession進行數據庫的操作,我在網上查找了很多資料,下面來總結一下,個人的學習體驗。(本人使用的hibernate和spring版本均是4.1.6,數據庫爲oracle 11g)


項目結構圖

圖1
這裏寫圖片描述


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語句來更新,最後呼喚下,哪裏有大神可以給我解惑的,歡迎留言!

項目寫得不好,若有問題,或者有更好的實現方式,歡迎大家評論留言!

生活就像海洋,只有意志堅強的人才能到達彼岸!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章