spring 中配置sessionFactory及用法

spring 中配置sessionFactory及用法spring中配置sessionFactory及用法方法一:1、在Spring的applicationContext.xml中配置bean<!–启用注解注入–><c

大家好,又见面了,我是你们的朋友全栈君。

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>

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/155203.html原文链接:https://javaforall.net

(0)
上一篇 2022年7月2日 下午4:46
下一篇 2022年7月2日 下午4:46


相关推荐

  • 抽象思维能力

    抽象思维能力世界上的物质纷繁复杂,眼花缭乱。人最大的特点是容易被眼睛看到的物像所吸引,而止步不前,不去深入思考内部深层次的原理。毕竟,进化了几百万年的人类过程,只要看到果实或者猎物就足够喂饱肚子了,谁去管果实

    2022年8月5日
    7
  • Centos 7配置LAMP「建议收藏」

    Centos 7配置LAMP「建议收藏」LAMP指的Linux(操作系统)、ApacheHTTP服务器,MySQL(有时也指MariaDB,数据库软件)和PHP(有时也是指Perl或Python)的第一个字母,一般用来建立web应用平台。所有组成产品均是开源软件,是国际上成熟的架构框架,很多流行的商业应用都是采取这个架构,和Java/J2EE架构相比,LAMP具有Web资源丰富、轻量、快速开发等特点,微软的.NET架构相比,LAMP…

    2022年5月3日
    91
  • java 大学考试_java考试 (全部)「建议收藏」

    java 大学考试_java考试 (全部)「建议收藏」该楼层疑似违规已被系统折叠隐藏此楼查看此楼importjava.awt*;importjava.awtevent*;classABCimplementsActionListener,WindowListener{Buttonb1;Buttonb2;TextPieldshowing;publicvoidactionperformed(ActionEvente){if(e…

    2022年7月7日
    21
  • Java网络爬虫(七)–实现定时爬取与IP代理池

    Java网络爬虫(七)–实现定时爬取与IP代理池注:对代码及思路进行了改进—Java网络爬虫(十一)–重构定时爬取以及IP代理池(多线程+Redis+代码优化)定点爬取当我们需要对金融行业的股票信息进行爬取的时候,由于股票的价格是一直在变化的,我们不可能手动的去每天定时定点的运行程序,这个时候我们就需要实现定点爬取了,我们引入第三方库quartz的使用:packagetimeutils;importorg.quart

    2022年5月5日
    161
  • Android MVP+RxJava+Retrofit (1) MVP设计模式

    Android MVP+RxJava+Retrofit (1) MVP设计模式

    2021年3月12日
    235
  • 学习NodeJS第一天:node.js介绍

    学习NodeJS第一天:node.js介绍

    2021年12月17日
    47

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号