rt:
public class Test{
   Configuration con = new Configuration().configure("hibernate.cfg.xml");
   SessionFactory sf = con.buildSessionFactory();
   Transaction tx = null;    public void test(){
           String sql = "";
           String sql1 = "";
           String sql2 = "";
           String sql3 = "";           Session session = sf.openSession();
   tx = session.beginTransaction(); 
           tx.begin();
           try { 
                 session.createQuery(sql).executeUpdate();
         session.createQuery(sql1).executeUpdate();
                 session.createQuery(sql3).executeUpdate();
                 session.createQuery(sql4).executeUpdate();
                 tx.commit();
           }
           catch (Exception e){
                 tx.rollback();
           }
           finally {
                 if (session != null) {
     session.close();
}
           } 
    }
  
}
      请问如何正确关闭这里的session.应该关几次。是我执行完第一个修改后就需要关闭一次吗,这样关闭有问题吗?如果有,请问出在哪。正确的应该怎么操作。谢谢。

解决方案 »

  1.   

    licip  是实际项目。这是业务层里的啊。
    这个类 extends HibernateDaoSupport implements
    testDao我也想用hibernate 的事务。我不会配。事务不起效果。晕。只有用hibernate的session了。
      

  2.   

    <!--定义哪些方法需要加事务    配置事务传播特性 -->
    <tx:advice id="txAdvice" transaction-manager="transactionManager">
    <tx:attributes>
    <tx:method name="is*" propagation="REQUIRED" />
    <tx:method name="find*" propagation="REQUIRED"/>
    <tx:method name="update*" propagation="REQUIRED"/>
    <tx:method name="delete*" propagation="REQUIRED"/>
    <tx:method name="*" read-only="false" />
    </tx:attributes>
    </tx:advice> <!--定义使用事务的方法的路径   那些类使用事务   -->
    <aop:config>
    <aop:pointcut id="cimSms"
    expression="execution(* com.test.dao.*.*(..))" />
                   //请问这里的路径应该指向。dao还是daoImpl啊
    <aop:advisor advice-ref="txAdvice" pointcut-ref="cimSms" />
    </aop:config>
    我这样配置的。但事务不想效果。
      

  3.   

    我有一个问题啊。我是修改三次记录。我想通过修改后的返回值来决定事务提交还是回滚。应该怎么做。我看session.createQuery(sql3).executeUpdate();这样我应该怎么做呢。。
      

  4.   

    个人建议使用spring来管理事务和session
      

  5.   

    我方法的名字是以is开头的。
    <tx:method name="is*" propagation="REQUIRED" />这里已经提定事务。就是不起用
      

  6.   

    extends HibernateDaoSupport
    用Spring来管理数据源和事务吧...<!-- TransactionManager事务管理器 -->
    <bean id="myTransactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
    <property name="sessionFactory" ref="sessionFactory"/>
    </bean>
    <tx:annotation-driven transaction-manager="myTransactionManager"/>
      

  7.   

    因为你用的hibernate方式来使用session,所以session 必须得自己手动关闭。如果用spring托管的话,那么获取session就是用hibernateTemplete()。getsession()这样来回去Session。
    然后 dao最好是进行数据库操作好,避免和业务有关联。然后用一个service层来专门处理业务逻辑,这样的话 把事务配置对应到service的接口上就行。对于session, spring里面的session是自己创建,关闭不需要关心,除非使用hibernate的sessionfactory来opSession方式获取的,那么必须自己手动关闭。
      

  8.   

    关闭时分情况:
    如果不使用spring托管时:
    1、如果没有表关联,直接在你的方法中关闭就行了
    2、有表关联,存在延迟加载的话,将关闭代码封在一个方法里如果使用spring托管1、如果没有表关联,不用管
    2、有关联,在web.xml中加入监听器,其余不用管了