java - two transaction within one transaction hibernate -
i'm making maintenance of app struts 1, spring 3 , hibernate 3. want join 2 services, each service have 1 transaction. solution thinking make 1 service 1 transaction include 2 services. it's possible this?
-the transaction located in dao's.
*service expediente:
public void saveexpedientecoactivo(coatexpc coatexpc, auditoria auditoria, string numeracionautomaticaexpediente) throws exception, businessexception{ iexpedientecoactivodao dao = (iexpedientecoactivodao)getdao(); try{ //business rules dao.saveexpedientecoactivo(coatexpc, numeracionautomaticaexpediente); catch{...} } *dao expediente:
public synchronized void saveexpedientecoactivo(coatexpc coatexpc, string numeracionautomaticaexpediente) throws exception { session sessionhibernate = this.getsessionfactory().getcurrentsession(); savepoint savepoint = sessionhibernate.connection().setsavepoint(); try{ sessionhibernate.saveorupdate(coatexpc); sessionhibernate.connection().commit(); }catch(exception e) { sessionhibernate.connection().rollback(savepoint); sessionhibernate.gettransaction().rollback(); system.out.println(this.getclass().getname()+", error="+e); throw new exception(e); } } *service resolucion:
public void saveresolucion(coatrcoa coatrcoa, auditoria auditoria) throws exception, businessexception{ iresoluciondao dao = (iresoluciondao)getdao(); try{ //business rules dao.saveresolucion(coatrcoa); }catch{...} } *dao resolucion:
public synchronized void saveresolucion(coatrcoa coatrcoa) throws exception { session sessionhibernate = this.getsessionfactory().getcurrentsession(); savepoint savepoint = sessionhibernate.connection().setsavepoint(); try{ //more code , sql here sessionhibernate.saveorupdate(coatrcoa); //more code sql sessionhibernate.connection().commit(); }catch(exception e) { sessionhibernate.connection().rollback(savepoint); sessionhibernate.gettransaction().rollback(); system.out.println(this.getclass().getname()+", error="+e); throw new exception(e); } } *applicationcontext.xml:
<bean id="sessionfactory" class="org.springframework.orm.hibernate3.localsessionfactorybean"> <property name="datasource"> <ref local="datasource"/> </property> <property name="mappingdirectorylocations"> <list> <value>classpath:gob/osinerg/spjc/configuracion/domain/mapping</value> <value>classpath:gob/osinerg/spjc/notificaciones/domain/mapping</value> <value>classpath:gob/osinerg/spjc/judicial/domain/mapping</value> <value>classpath:gob/osinerg/spjc/coactiva/domain/mapping</value> <value>classpath:gob/osinerg/spjc/common/domain/mapping</value> <value>classpath:gob/osinerg/alfresco/domain/mapping</value> </list> </property> <property name="hibernateproperties"> <props> <prop key="hibernate.dialect">${hibernate.dialect}</prop> <prop key="hibernate.show_sql">${hibernate.show_sql}</prop> </props> </property> </bean> <bean id="transactionmanager" class="org.springframework.orm.hibernate3.hibernatetransactionmanager"> <property name="sessionfactory"> <ref local="sessionfactory"/> </property> </bean> <bean id="txproxytemplate" abstract="true" class="org.springframework.transaction.interceptor.transactionproxyfactorybean"> <property name="transactionmanager"> <ref local="transactionmanager"/> </property> <property name="transactionattributes"> <props> <prop key="get*">propagation_required,readonly</prop> <prop key="find*">propagation_required,readonly</prop> <prop key="load*">propagation_required,readonly</prop> <prop key="save*">propagation_required</prop> <prop key="delete*">propagation_required</prop> </props> </property> </bean> now, it's possible this?
public class servicetransactionimp implements servicetransaction{ public void dotwosavetransaction(){ session sessionhibernate = this.getsessionfactory().getcurrentsession(); savepoint savepoint = sessionhibernate.connection().setsavepoint(); try{ serviceexpediente.saveexpedientecoactivo(coatexpc,auditoria,numeracionautomaticaexpediente); serviceresolucion.saveresolucion(coatrcoa,auditoria); sessionhibernate.connection().commit(); }catch(exception e) { sessionhibernate.connection().rollback(savepoint); sessionhibernate.gettransaction().rollback(); system.out.println(this.getclass().getname()+", error="+e); throw new exception(e); } } i'm not sure if works, because session distinct between proceses , if possible rollback of saveresolucion affect service of saveexpedientecoactivo have commit(); idea execute rollback proceses.
or other solution?
Comments
Post a Comment