读书人

为何spring声明式事务无作用?解决办法

发布时间: 2012-01-24 23:11:54 作者: rapoo

为何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

读书人网 >Java Web开发

热点推荐