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年10月21日
  • 深入理解java中的自动装箱与拆箱[通俗易懂]

    本文由java语言入门栏目为大家推荐,文中通过详细实例为大家深入讲解了java中的自动装箱与拆箱的相关知识,希望可以帮助到大家。装箱是把基本数据类型转换为包装类,拆箱是把包装类转换为基本数据类型。

    2022年1月17日
  • node版本如何升级

    node版本如何升级YouareusingNodev8.4.0,butthisversionofvue-clirequiresNode&amp;amp;amp;amp;gt;=8.9.PleaseupgradeyourNodeversion.然后再用node-v,发现在本地的node版本是v8.4.0,有点老了,要升级了。可是,node怎么升级呢?有点慌…

    2022年7月16日
  • 看了这篇文章觉得MySQL读写分离这么简单「建议收藏」

    点赞多大胆,就有多大产!有支持才有动力!微信搜索公众号【达摩克利斯之笔】获取更多资源,文末有二维码!前言​  Mysql优化那篇文章有朋友留言说就这么点?,深深刺痛了晓添的心,感觉知识深度被小看了,痛定思痛决定发布读写分离,分表分库优化文章,其实这系列文章也在Mysql优化的计划之内,最近较忙断断续续写的有点难受,到今天才跟大家见面,篇幅有限这篇我们来说说基于Mycat实现读写分离,话不多…

    2022年4月13日
  • android之cannot convert from Fragment1 to Fragment

    在写一个音乐播放器的时候,用到了fragment,结果在需要返回Fragment的方法里面,无法将Fragment1(Fragment的子类)强制转换成Fragment,很是纳闷,我是参照一个开源代码来做的,源码里面很正常,我这里却报错,后来才发现,是对包的导入出现了差错,在Fragment1中导入的是android.app.Fragment而在出错的那个类里面是用android.su

    2022年3月9日

发表回复

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

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