在spring没有配置事务管理的情况下,只配置了sessionFactory<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean" >
<property name="configLocation">
<value>WEB-INF/hibernate.cfg.xml</value>
</property>
</bean><bean id="studao" class="dao.StudentDao" singleton="false">
<property name="sessionFactory">
<ref local="sessionFactory"/>
</property>
</bean>我的这个学生dao这么写事务能提交吗public class StudentDao  extends HibernateDaoSupport implements IStudentDao { //添加学生
 public void inputStu(Student student){
 
 HibernateTemplate ht=this.getHibernateTemplate(); 
   try {
   
   
   
ht.save(student);


} catch (Exception e) {

e.printStackTrace();}


}还有 HibernateTemplate  和 HibernateDaoSupport
有什么好处和作用~~

解决方案 »

  1.   

    如果你的这个dao不涉及service的话,只在本身的dao.impl中做测试
    <bean id="studao" class="dao.StudentDao" singleton="false"> 
    <property name="sessionFactory"> 
    <ref local="sessionFactory"/> 
    </property> 
    </bean> 
    是没问题的,因为spring内在的HibernateTemplate就含有了自动提交和打开连接数据库的能力,比如session的打开关闭等等
    即这就不用自己进行提交和管理session了,应该说更方便了
      

  2.   


    什么叫不涉及service?我在struts的action里调用这个dao,可是事务没有提交
    HibernateTemplate不是含有了自动提交和打开连接数据库的能力吗?
      

  3.   

    你吧DateSource也封装成Bean。让SessionFactory依赖DateSource。不要有hibernate.cfg.xml 容易出错。
      

  4.   

    自己的dao有继承HibernateDaoSupport 的话
    事务会提交,但是也建议你在spring配置文件中配置事务管理器
      

  5.   


    不把DateSource封装成Bean会出错吗·~~按道理继承HibernateDaoSupport 
    hibernatetemplate 能管理事务, 可是我现在事务就是不能提交,可以在缓存里查到更新的数据库信息
    可是数据库里的数据没有更新。
      

  6.   

    你的sessionFactory要依赖于dataSource
      

  7.   

    这种情况下要么使用spring的声明事务,要么手动提交事务,否则的话是会出现问题。使用hibernateTemplate 和 daoSupport 能让你不必去关心想一些session的问题,还有就是将一些操作集成化。
      

  8.   

    那么如果我不想配置事务我这个代码应该怎么改?
    public class StudentDao  extends HibernateDaoSupport implements IStudentDao { //添加学生 
    public void inputStu(Student student){ HibernateTemplate ht=this.getHibernateTemplate(); 
      try { 
      
      
      
    ht.save(student); 
    } catch (Exception e) { e.printStackTrace();} 

      

  9.   

    必须先有datasSource 
    然后才有sessionFactory
      

  10.   

    既然继承了HibernateDaoSupport,要配置事务的应该,或者你手动提交事务,这样的话,你还继承这个类干嘛呢?继承这个类,就是使用spring的声明式事务,帮你管理session的 关注!
      

  11.   


    就是说继承了HibernateDaoSupport ,事务应该会自动提交了?
      

  12.   

    你继承了HibernateSupport并且实现了HibernateTemplate
    然后掉用里面的save方法就已经提交了事物的,并且这个方法应该抛出的是运行时异常
    另外说一点:实现这个接口有个缺点,就是它没有进行事物的回滚。
      

  13.   

    如果在hibernate配置文件中添加了
    <property name="connection.autocommit">true</property>
    是可以提交的
      

  14.   

    很明显是在hibernate配置文件中配置了属性
      

  15.   

    hibernate.cfg.xml 应该贴出来
      

  16.   

    楼主可以试着在  数据库 里插入语句看一下,(主键自动增长)看 插入语句的 主键id 是否为1,如果是2,则说明你运行save方法添加成功了   但是 回滚了  所以第1条save的数据又删掉了
      

  17.   

    哎呀 怎么就是没有满意的答案呢~我问的有问题?
    总之事务没有提交 按道理
    继承了HibernateSupport并且实现了HibernateTemplate 
    应该可以吧~~
      

  18.   


    <?xml version="1.0" encoding="UTF-8"?> 
    <!DOCTYPE beans PUBLIC "-//SPRING/DTD BEAN/EN" 
     "http://www.springframework.org/dtd/spring-beans.dtd"> 
    <beans> 
        <bean id="dataSource" 
              class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 
            <property name="driverClassName"> 
                <value>com.mysql.jdbc.Driver</value> 
            </property> 
            <property name="url"> 
                <value>jdbc:mysql://localhost:3306/springdb</value> 
            </property> 
            <property name="username"> 
                <value>root</value> 
            </property> 
            <property name="password"> 
                <value>root</value> 
            </property>  
        </bean> 
        
        <bean id="sessionFactory"  
              class="org.springframework.orm.hibernate3.LocalSessionFactoryBean" 
              destroy-method="close"> 
            <property name="dataSource"> 
                <ref bean="dataSource"/> 
            </property> 
            <property name="mappingResources"> 
                <list> 
                    <value>com/livechance/User.hbm.xml</value> 
                </list> 
            </property> 
            <property name="hibernateProperties"> 
                <props> 
                    <prop key="hibernate.dialect"> 
                        org.hibernate.dialect.MySQLDialect
                    </prop>
                    <prop key="hibernate.show_sql"> 
                        true
                    </prop>
                    <prop key="hibernate.format_sql"> 
                        true
                    </prop> 
                </props> 
            </property> 
        </bean>     <bean id="userDAO" class="com.livechance.UserDAO"> 
            <property name="sessionFactory"> 
                <ref bean="sessionFactory"/> 
            </property> 
        </bean>
       这个配置可以提交
    可能是你没有配置datasource的问题
    HibernateDAOSupport
    是对session的封装
    最好还是配上事物管理器
      

  19.   

    Session   session   =   getHibernateTemplate().getSessionFactory().openSession();   
                              Transaction   tx   =   session.beginTransaction();   
        
                              tx.commit();   
                              session.close();给你个解决办法
    这说明Hibernate确实没有管理事务的能力只有打开和关闭session的能力
    HibernateTemplate确实没有设置session的事务属性,因为在spring的模型中,事务本来就不是HibernateTemplate来管理的。HibernateTemplate的作用是保证session能够正确的打开和关闭,避免手工管理session带来的问题,同时让session自动的参与事务,转换检查异常。spring中的事务应该使用TransactionTemplate,或者是是更加好的,类似EJB的声明式事务。如果配置了声明式事务,HibernateTemplate就可以保证让session自动参与事务,这一点从HibernateTemplate的源代码中可以看出来。手工管理的session在多线程操作,声明式事务的各种场景下,会造成代码的混乱。不推荐手工管理session,也不推荐手工管理事务。最佳的实践,是HibernateTemplate + 声明式事务。楼主没有使用任何spring的事务机制,所以HibernateTemplate确实就是 无事务,这就是autoCommit==true的原因。楼主的例子在实践中极为危险。 
      

  20.   

    26楼的解决办法就基本没用到spring了~~~
      

  21.   

    HibernateDaoSupport虽然为hibernate提供了很好的支持,但是它并没有完全提供对事务的支持,要支持必须在配置文件里面加入transcationManager.另外HibernateDaoSupport还提供了异常(UNCkeckException)的捕获机制,所以try,catch也可以省略,
      

  22.   

    参考下我下面写的代码<?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
     
    <beans>
     <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource" destroy-method="close">
      <property name="driverClassName">
       <value>com.mysql.jdbc.Driver</value>
      </property>
      <property name="url">
       <value>jdbc:mysql://192.168.22.155:3306/e-learning</value>
      </property>
      <property name="username">
       <value>root</value>
      </property>
      <property name="password">
       <value>000</value>
      </property>
     </bean>
     
     
     <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
      <property name="dataSource">
       <ref local="dataSource" />
      </property>
      <property name="mappingResources">
       <list>
        <value>com/hibernate/TUserinfo.hbm.xml</value>
        <value>com/hibernate/TFiletype.hbm.xml</value>
        <value>com/hibernate/TFileinfo.hbm.xml</value>
        <value>com/hibernate/TUserGroup.hbm.xml</value>
        <value>com/hibernate/TRight.hbm.xml</value>
        <value>com/hibernate/TUserlog.hbm.xml</value>
        <value>com/hibernate/TGroup.hbm.xml</value>
       </list>
      </property>
      <property name="hibernateProperties">
       <props>
        <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
        <prop key="hibernate.show_sql">true</prop>
       </props>
      </property>
     </bean>
     
     <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
      <property name="sessionFactory">
       <ref local="sessionFactory" />
      </property>
     </bean>
     
     <bean id="userDAO" class="com.daoimp.TUserinfoDAOImp">
      <property name="sessionFactory">
       <ref local="sessionFactory" />
      </property>
     </bean>
     
     <bean id="userDAOProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
      <property name="transactionManager">
       <ref bean="transactionManager" />
      </property>
      <property name="target">
       <ref local="userDAO" />
      </property>
      <property name="transactionAttributes">
       <props>
        <prop key="insert*">PROPAGATION_REQUIRED</prop>
        <prop key="get*">PROPAGATION_REQUIRED</prop>
        <prop key="is*">PROPAGATION_REQUIRED</prop>
       </props>
      </property>
     </bean>
     
     <bean id="filetypeDAO" class="com.daoimp.TFiletypeDAOImp">
      <property name="sessionFactory">
       <ref local="sessionFactory" />
      </property>
     </bean>
     
     <bean id="filetypeDAOProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
      <property name="transactionManager">
       <ref bean="transactionManager" />
      </property>
      <property name="target">
       <ref local="filetypeDAO" />
      </property>
      <property name="transactionAttributes">
       <props>
        <prop key="insert*">PROPAGATION_REQUIRED</prop>
        <prop key="get*">PROPAGATION_REQUIRED,readOnly</prop>
        <prop key="is*">PROPAGATION_REQUIRED,readOnly</prop>
       </props>
      </property>
     </bean>
     
     <bean id="rightDAO" class="com.daoimp.TRightDAOImp">
      <property name="sessionFactory">
       <ref local="sessionFactory" />
      </property>
     </bean>
     
     <bean id="rightDAOProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
      <property name="transactionManager">
       <ref bean="transactionManager" />
      </property>
      <property name="target">
       <ref local="rightDAO" />
      </property>
      <property name="transactionAttributes">
       <props>
        <prop key="insert*">PROPAGATION_REQUIRED</prop>
        <prop key="get*">PROPAGATION_REQUIRED</prop>
        <prop key="is*">PROPAGATION_REQUIRED,readOnly</prop>
       </props>
      </property>
     </bean>
     
     <bean id="usergroupDAO" class="com.daoimp.TUserGroupDAOImp">
      <property name="sessionFactory">
       <ref local="sessionFactory" />
      </property>
     </bean>
     
     <bean id="usergroupDAOProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
      <property name="transactionManager">
       <ref bean="transactionManager" />
      </property>
      <property name="target">
       <ref local="usergroupDAO" />
      </property>
      <property name="transactionAttributes">
       <props>
        <prop key="insert*">PROPAGATION_REQUIRED</prop>
        <prop key="get*">PROPAGATION_REQUIRED</prop>
        <prop key="is*">PROPAGATION_REQUIRED</prop>
       </props>
      </property>
     </bean>
     
     <bean name="infoService" class="com.struts.service.InfoService" singleton="false">
      <property name="userDAO">
       <ref bean="userDAOProxy" />
      </property>
      <property name="usergroupDAO">
       <ref bean="usergroupDAOProxy" />
      </property>
      <property name="groupDAO">
       <ref bean="groupDAOProxy" />
      </property>
      <property name="rightDAO">
       <ref bean="rightDAOProxy" />
      </property>
      <property name="filetypeDAO">
       <ref bean="filetypeDAOProxy" />
      </property>
     </bean>
     
     <bean name="fileTypeService" class="com.struts.service.FileTypeService" singleton="false">
      <property name="filetypeDAO">
       <ref bean="filetypeDAOProxy" />
      </property>
     </bean>
     
     <bean name="rightService" class="com.struts.service.RightInfoService" singleton="false">
      <property name="rightDAO">
       <ref bean="rightDAOProxy" />
      </property>
     </bean>
     
     <bean name="/login" class="com.struts.action.LoginAction" singleton="false">
      <property name="infoService">
       <ref bean="infoService" />
      </property>
      <property name="fileTypeService">
       <ref bean="fileTypeService" />
      </property>
      <property name="rightService">
       <ref bean="rightService" />
      </property>
     </bean>
     
     <bean id="fileinfoDAO" class="com.daoimp.TFileinfoDAOImp">
      <property name="sessionFactory">
       <ref local="sessionFactory" />
      </property>
     </bean>
     
     <bean id="fileinfoDAOProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
      <property name="transactionManager">
       <ref bean="transactionManager" />
      </property>
      <property name="target">
       <ref local="fileinfoDAO" />
      </property>
      <property name="transactionAttributes">
       <props>
        <prop key="insert*">PROPAGATION_REQUIRED</prop>
        <prop key="get*">PROPAGATION_REQUIRED</prop>
        <prop key="is*">PROPAGATION_REQUIRED</prop>
       </props>
      </property>
     </bean>
     
     <bean name="fileInfoService" class="com.struts.service.FileInfoService" singleton="false">
      <property name="fileinfoDAO">
       <ref bean="fileinfoDAOProxy" />
      </property>
     </bean>
     
     <bean name="/show" class="com.struts.action.ShowFileNameAction" singleton="false">
      <property name="fileInfoService">
       <ref bean="fileInfoService" />
      </property>
     </bean>