为何spring声明式事务无作用?
为何spring声明式事务无作用?
//为何log中没有spring 动态代理的信息,有事务回滚信息?数据库中还是更新了test表中的字段
- Java code
@Repositorypublic class BaseHibernateDao extends HibernateDaoSupport {}SERVICE
- Java code
@Servicepublic class TestService extends BaseService { @Autowired TestDao testDao; public void testTT(){ testDao.testTT(); }}DAO
- Java code
@Servicepublic class TestDAO extends BaseHibernateDao{ public void testTT(){ String hql = " update Test set age= ? where id = 1000 "; Query q = this.getSession(true).createQuery(hql); q.setInteger(0, 3333333); q.executeUpdate(); Test n = new Test(); n.setAddtime( new Date() ); n.age( new Long(101) ); n.setDatastr("22222222222"); n.setPid( Long.parseLong("sssssssssssss") ); //此处故意throw RuntimeException子类 session.save(n); //为何log中没有spring 动态代理的信息,有事务回滚信息?数据库中还是更新了test表中的字段 }}[解决办法]
spring-hibernate.xml
没有看到你把SessionFactory
注入
因为HibernateDaoSupport需要他才可以把事物注入上
[解决办法]
<!-- ========================= TABLE T_BZ_JS_Criterion_Demand_Info: CONFIGURE ========================= -->
<bean id="bzJsCriterionDemandInfoDAO" class="com.excellence.gzby.standard.dao.BzJsCriterionDemandInfoDAO" singleton="true" init-method="initialize">
<property name="dataSource">
<ref local="dataSource"/>
</property>
<property name="sqlMapClient">
<ref local="sqlMapClient"/>
</property>
</bean>
<bean id="bzJsCriterionDemandInfoBll" class="com.excellence.gzby.standard.bll.BzJsCriterionDemandInfoBll">
<property name="_dao">
<ref local="bzJsCriterionDemandInfoDAO"/>
</property>
</bean>
<bean id="bzJsCriterionDemandInfoBllProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<property name="transactionManager">
<ref local="transactionManager"/>
</property>
<property name="target">
<ref local="bzJsCriterionDemandInfoBll"/>
</property>
<property name="transactionAttributes">
<props>
<prop key="save*">PROPAGATION_REQUIRED,-Throwable</prop>
<prop key="deleteAll*">PROPAGATION_REQUIRED</prop>
<prop key="*">PROPAGATION_REQUIRED,readOnly</prop>
</props>
</property>
</bean>
[解决办法]
1 在spring-hibernate.xml 中最上面加上<context:component-scan base-package="*" />
2 规范一下注释吧,把BaseHibernateDao上的注释去掉
建议用junit测试,试试吧
[解决办法]
sping配置文件:<context:component-scan base-package="com.nes.platform.service.managerimp"/>
表示事配置在managerimp下
mgr的示
@Component
public class ContractTypeManagerImp implements ContractTypeManager {
private ContractTypeDao contractTypeDao;
@Autowired
public void setContractTypeDao(ContractTypeDao contractTypeDao) {
this.contractTypeDao = contractTypeDao;
}
@Transactional
public void delete(LoginUserBO loginUser, ContractTypeBO contractTypeBO)
throws ApplicationException {
ContractTypeBO bo = contractTypeDao.get(loginUser, contractTypeBO.getUid());
contractTypeDao.delete(loginUser, bo);
}
、。。。。。。。。
[解决办法]
用这个配置文件吧
<!-- 事务管理器 -->
<bean id="transactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
<!-- 事务拦截器 -->
<bean id="transactionInterceptor"
class="org.springframework.transaction.interceptor.TransactionInterceptor">
<!-- 事务管理器 -->
<property name="transactionManager" ref="transactionManager" />
<property name="transactionAttributes">
<props>
<prop key="find*">PROPAGATION_REQUIRED</prop>
<prop key="get*">PROPAGATION_REQUIRED,readOnly</prop>
<prop key="load*">PROPAGATION_REQUIRED,readOnly</prop>
<prop key="create*">
PROPAGATION_REQUIRED</prop>
<prop key="delete*">
PROPAGATION_REQUIRED</prop>
<prop key="del*">
PROPAGATION_REQUIRED</prop>
<prop key="update*">
PROPAGATION_REQUIRED</prop>
<prop key="start*">
PROPAGATION_REQUIRED</prop>
<prop key="cancel*">
PROPAGATION_REQUIRED</prop>
<prop key="stop*">
PROPAGATION_REQUIRED</prop>
<prop key="save*">
PROPAGATION_REQUIRED</prop>
<prop key="add*">
PROPAGATION_REQUIRED</prop>
<prop key="update*">
PROPAGATION_REQUIRED</prop>
<prop key="remove*">
PROPAGATION_REQUIRED</prop>
<prop key="pay*">
PROPAGATION_REQUIRED</prop>
<prop key="*">PROPAGATION_REQUIRED</prop>
</props>
</property>
</bean>
希望能帮助到你.
[解决办法]
可以回滚?看不到回滚信息?是不是log4j配置有问题,这是我的配置
# Configure logging for testing: optionally with log file
log4j.rootLogger=DEBUG, stdout
# log4j.rootLogger=WARN, stdout, logfile
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n
log4j.appender.logfile=org.apache.log4j.FileAppender
log4j.appender.logfile.File=target/spring.log
log4j.appender.logfile.append=false
log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
log4j.appender.logfile.layout.ConversionPattern=%d %p [%c] - %m%n
[解决办法]
up