对于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层这些应该怎样处理是最好的,还有异常的情况也不是很了解,希望大家指点一下,最好给一个简单一点的三个框架整合的例子。
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层这些应该怎样处理是最好的,还有异常的情况也不是很了解,希望大家指点一下,最好给一个简单一点的三个框架整合的例子。
如果你的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)
<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都包含的事务中了吗?