zoukankan      html  css  js  c++  java
  • spring 中配置sessionFactory及用法

    spring 中配置sessionFactory及用法

     

    方法一:

    1、在Spring的applicationContext.xml中配置bean

     <!-- 启用注解注入  -->
          <context:annotation-config />
          <!-- spring扫描的包 -->
          <context:component-scan base-package="com.iven"/> 
         
          <!-- 配置数据源 -->
          <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" >
           <property name="driverClassName" value="com.MySQL.jdbc.Driver" />     
           <property name="url" value="jdbc:mysql://172.25.9.99:3306/fzghc" />
           <property name="username" value="root"></property>
           <property name="password" value="123456"></property>       
          </bean>     
          
           <!-- 配置Spring的SessionFactory -->
          <bean id="sessionFactory"        class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
            <property name="dataSource" ref="dataSource"></property>
            <property name="annotatedClasses">
                <list>
                    <value>com.iven.entity.User</value>
                    <value>com.iven.entity.Repairs</value>
                </list>
            </property>       
            <property name="hibernateProperties">
                <value>
                 hibernate.dialect=org.hibernate.dialect.MySQLDialect
        <!-- hibernate.dialect=org.hibernate.dialect.SQLServerDialect -->
        hibernate.show_sql=true    
                </value>
            </property>       
          </bean>
         
          <!-- 添加事务管理 -->
          <bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
             <property name="sessionFactory" ref="sessionFactory"></property>
          </bean>
         
          <tx:annotation-driven transaction-manager="transactionManager"/>

      <!-- 添加事务管理 -->
          
          <bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
             <property name="sessionFactory" ref="sessionFactory"></property>
          </bean>      
          <tx:annotation-driven transaction-manager="transactionManager"/>    
          
          <bean id="txManager"       class="org.springframework.orm.hibernate4.HibernateTransactionManager">
             <property name="sessionFactory" ref="sessionFactory"></property>
          </bean>
          
          <tx:advice  id="txAdvice" transaction-manager="txManager">
             <tx:attributes>
                <!-- all methods starting with 'get' are read-only -->
                <tx:method name="queryByUsername" read-only="true"/>   
                <!-- other methods use the default transaction settings (see below) -->
                <tx:method name="*" />              
              </tx:attributes>
          </tx:advice>
          
          <aop:config>
            <aop:pointcut expression="execution(* com.iven.dao.*.*(..))"           id="fooServiceOperation"/>
            <aop:advisor advice-ref="txAdvice" pointcut-ref="fooServiceOperation"/>
          </aop:config>

    2、添加类BaseSessionFactoryImpl用于获取Session,类BaseSessionFactoryImpl的内容如下:

    public class BaseSessionFactoryImpl {

     @Resource(name="sessionFactory")
     private SessionFactory sessionFactory=null;
     public Session getSession(){
      return sessionFactory.getCurrentSession();
     }
    }

     

    3、在Dao层获取Session,

    public class UserDaoImplextends BaseSessionFactoryImpl
    {

     public User queryByUsername(String userName) {    
         User user=null;
         String sql="select user from User user where user.userName="+userName;
         try {
           user=(User) getSession().get(User.class, 1);   
         } catch (Exception e) {
          e.printStackTrace();
         }     
        return user;
     }

    }

    4.重点注意事项

       SessionFactory的getCurrentSession并不能保证在没有当前Session的情况下会自动创建一个新的,这取决于CurrentSessionContext的实现,SessionFactory将调用CurrentSessionContext的currentSession()方法来获得Session。

       在Spring中,如果我们在没有配置TransactionManager并且没有事先调用SessionFactory.openSession()的情况直接调用getCurrentSession(),那么程序将抛出“No Session found for current thread”异常。

       如果配置了TranactionManager并且通过@Transactional或者声明的方式配置的事务边界,那么Spring会在开始事务之前通过AOP的方式为当前线程创建Session,此时调用getCurrentSession()将得到正确结果。

    然而,产生以上异常的原因在于Spring提供了自己的CurrentSessionContext实现,如果我们不打算使用Spring,而是自己直接从hibernate.cfg.xml创建SessionFactory,并且为在hibernate.cfg.xml
    中设置current_session_context_class为thread,也即使用了ThreadLocalSessionContext,那么我们在调用getCurrentSession()时,如果当前线程没有Session存在,则会创建一个绑定到当前线程。

    Hibernate在默认情况下会使用JTASessionContext,Spring提供了自己SpringSessionContext,因此我们不用配置current_session_context_class,当Hibernate与Spring集成时,将使用该SessionContext,故此时调用getCurrentSession()的效果完全依赖于SpringSessionContext的实现。

    在没有Spring的情况下使用Hibernate,如果没有在hibernate.cfg.xml中配置current_session_context_class,有没有JTA的话,那么程序将抛出"No CurrentSessionContext configured!"异常。此时的解决办法是在hibernate.cfg.xml中将current_session_context_class配置成thread。

    在Spring中使用Hibernate,如果我们配置了TransactionManager,那么我们就不应该调用SessionFactory的openSession()来获得Sessioin,因为这样获得的Session并没有被事务管理。

    至于解决的办法,可以采用如下方式:
    1. 在spring 配置文件中加入

    <tx:annotation-driven transaction-manager="transactionManager"/>

    并且在处理业务逻辑的类上采用注解


    @Service
    public class CustomerServiceImpl implements CustomerService {
    @Transactional
    public void saveCustomer(Customer customer) {
    customerDaoImpl.saveCustomer(customer);
    }
    ...
    }
    另外在 hibernate 的配置文件中,也可以增加这样的配置来避免这个错误:

    <property name="current_session_context_class">thread</property>

  • 相关阅读:
    Photoshop做32位带Alpha通道的bmp图片
    PNG怎么转换成32位的BMP保持透明
    解决WIN32窗口不响应WM_LBUTTONDBLCLK消息
    Windows键盘消息处理
    对象与控件如何建立关联
    DrawItem
    在C语言中除法运算为什么没有小数部分?
    使用GDI+进行图片处理时要注意的问题
    MFC中无标题栏窗口的移动
    MFC带标题栏的窗口和不带标题栏的窗口最大化
  • 原文地址:https://www.cnblogs.com/keyi/p/6410643.html
Copyright © 2011-2022 走看看