对于spring的事务的配置,网上很多说是放在业务层,那我有个问题,在下面的代码(业务层)中如果这样写:
 
public void clientAdd(Client client) throws Exception{
     try {
this.clientDao.clientAdd(client);
         Log log = new Log();
log.setType("安全日志");
log.setTime(new Date());
logManager.addLog(log);
     } catch (Exception e) {
throw e;
     }
}
1、上面我是调用了Dao层,那么这两个方法有没有参与到事务中(事务的xml已经配置好了)?
2、是不是必须要用this.getHibernateTemplate().save(client);才能参与到事务中呢,但是如果直接调用this.getHibernateTemplate().save(client)的话,那不是没有用到Dao层吗?
3、如果不考虑有没有调用Dao层,而在方法里面用this.getHibernateTemplate().save(client),那么这个事务所包含的范围是什么?是不是只要在addUser方法里面所有的操作都参与事务(这些方法在xml文件里面有声明),只要里面任意一个发生异常,整个事务就不成功?
4、对于javaEE框架的整合还不是很熟悉,不知道spring事务的处理和调用Dao层这些应该怎样处理是最好的,还有异常的情况也不是很了解,希望大家指点一下,最好给一个简单一点的三个框架整合的例子。

解决方案 »

  1.   

    晕,你这个是怎么弄的。this.getHibernateTemplate().save(client)明显是在dao层调用。怎么跟service层扯上关系了?
    如果你的xml已经配好了,那么你应该在xml里配置出如下类似的属性:(我使用的是Annotation)<bean id="myTransactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
    <property name="sessionFactory" ref="mySessionFactory"/>
    </bean>
    <!-- DAO -->
    <bean id="customerDAO" class="dao.impl.CustomerDAOHibernateImpl">
    <property name="sessionFactory" ref="mySessionFactory" />
    </bean>
    <!-- service -->
    <bean id="customerService"
    class="service.impl.CustomerServiceSpringImpl">
    <property name="customerDAO" ref="customerDAO" />
    </bean>
    <tx:annotation-driven transaction-manager="myTransactionManager" />那么,你的service层(如果你上面那段代码属于service层的话)的方法上只要只上一句话就可以使用事务了:
    @Transactional(propagation=Propagation.SUPPORTS,readOnly=true)
      

  2.   

    我的xml为:<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
    <property name="configLocation">
    <value>classpath:hibernate.cfg.xml</value>
    </property>
    </bean>           

    <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
    <property name="sessionFactory">
    <ref bean="sessionFactory"/>
    </property>
    </bean> <tx:advice id="txAdvice" transaction-manager="transactionManager">
    <tx:attributes>
    <tx:method name="*Add" propagation="REQUIRED"/>
    <tx:method name="*Del" propagation="REQUIRED"/>
    <tx:method name="*Modify" propagation="REQUIRED"/>
    <tx:method name="*" read-only="true"/>
    </tx:attributes>
    </tx:advice> <aop:config>
    <aop:pointcut id="allServiceMethod" expression="execution(* com.qzu.tour.service.*.*(..))"/>
    <aop:advisor pointcut-ref="allServiceMethod" advice-ref="txAdvice"/>
    </aop:config>如果this.getHibernateTemplate().save(client)是在Dao层调用,那么在业务层应该怎么调用?是不是这样:public void clientAdd(Client client) throws Exception{
         try {
        this.clientDao.clientAdd(client);
             Log log = new Log();
        log.setType("安全日志");
        log.setTime(new Date());
        logManager.addLog(log);
         } catch (Exception e) {
        throw e;
         }
    }
    这样就把clientAdd和addLog都包含的事务中了吗?