说明:两个表:简历表resume, 个人用户表person。添加或更新简历(resume)的同时要更新person表中简历填写状态(记录填写信息的完整度)。我在dao实现数据访问,在其上封装了一个bean,在updateResume方法中同时update(resume)、update(person),在service层的事务中调用bean的updateResume方法。问题:当update(resume)不成功的时候<不产生sql语句,不更新数据库>,update(person)仍然执行了<产生了sql语句,更新了数据库>。是配置的问题?事务使用不当?请大家帮忙看看,谢谢
我的Hibernate配置文件如下:<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"><hibernate-configuration>
<session-factory>
<property name="hibernate.connection.url">jdbc:Microsoft:sqlserver://localhost:1433;databaseName=dazhong</property>
<property name="hibernate.connection.driver_class">com.microsoft.jdbc.sqlserver.SQLServerDriver</property>
<property name="hibernate.connection.username">sa</property>
<property name="hibernate.connection.password"></property>
<property name="hibernate.dialect">org.hibernate.dialect.SQLServerDialect</property>
<property name="hibernate.show_sql">true</property>
<property name="hibernate.current_session_context_class">thread</property> <!-- (本地事务)一个数据库使用currentSession -->

<!-- --><property name="hibernate.hbm2ddl.auto">update</property> 

<!-- 配置ORmapping文件 -->省略………… </session-factory>
</hibernate-configuration>我的spring公共配置文件applicationContext-common.xml如下:<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"
>
<!--  配置sessionFactory -->
<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="sessionFactory" />
</bean>  <bean id="transactionTemplate" class="org.springframework.transaction.support.TransactionTemplate">
        <property name="transactionManager" ref="transactionManager"/>
        <property name="propagationBehaviorName" value="PROPAGATION_REQUIRED"/>
    </bean>

</beans>
我的spring beans配置文件
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"><!-- daos______________________________________________________ -->
<bean id="daoTemplate" abstract="true">
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
<bean id="personDao" class="org.dazhong.dao.imp.person.PersonDaoImpl"
parent="daoTemplate"/>
<bean id="personLogDao" class="org.dazhong.dao.imp.person.PersonLogDaoImpl"
parent="daoTemplate"/>
<bean id="resumeDao" class="org.dazhong.dao.imp.person.ResumeDaoImpl"
parent="daoTemplate">

</bean><!-- beans______________________________________________________ -->
<bean id="personMessageBean" class="org.dazhong.bean.person.PersonMessageBean"/>
<bean id="resumeBean" class="org.dazhong.bean.person.ResumeBean">
<property name="resumeDao" ref="resumeDao"/>
<property name="personDao" ref="personDao"/>
</bean>

<!-- services______________________________________________________-->
<bean id="personService" class="org.dazhong.service.imp.person.PersonServiceImpl">
<property name="transactionTemplate" ref="transactionTemplate"/> 
<property name="personLogDao" ref="personLogDao"/>
<property name="personMessageBean" ref="personMessageBean"/>
<property name="resumeBean" ref="resumeBean"/>
<property name="personDao" ref="personDao"/>
</bean> 
</beans>我的ResumeBean的更新简历方法public Person updateResume(Object object,int infoType,Person person){
                        baseInfo=(ResumeBasicInfo)object;

if(baseInfo.getCertificateNum()==null||baseInfo.getBirth()   ==null||baseInfo.getHeight()==0||baseInfo.getCurrcityId()==0||baseInfo.getRegisteredcityId()==0||baseInfo.getNativePlace()==null||baseInfo.getPhoto()==null){
person.setBasic(1);
}else{
person.setBasic(2);
}
resumeDao.update(baseInfo);
personDao.update(person);
}
在service中应用事务的方法
public Person updateResume(final Object object,final int infoType,final Person person){
return (Person)transactionTemplate.execute(new TransactionCallback(){
public Object doInTransaction(TransactionStatus status){
return resumeBean.updateResume(object, infoType, person);
}
});
}

解决方案 »

  1.   

    public Object doInTransaction(TransactionStatus status){ try {
    return resumeBean.updateResume(object, infoType, person); 
    } catch(Exception e) {
    status.setRollbackOnly();
    }

      

  2.   

    LZ 代码不清晰, 层次 不明确. 不知道你是怎么设计的你既然把事务配在了 service 层,就应该把 resumeDao.update(baseInfo);
    personDao.update(person); 这两句放到 service 层来调用. LZ 有没有明白分层的原因啊