说明:两个表:简历表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);
}
});
}
我的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);
}
});
}
return resumeBean.updateResume(object, infoType, person);
} catch(Exception e) {
status.setRollbackOnly();
}
}
personDao.update(person); 这两句放到 service 层来调用. LZ 有没有明白分层的原因啊