i trying update record hibernate hql query result in continue loading page.
there no problem update record @ first attempt.
for mapping using annotation configuration, @transactional bind in service layer,
hibernate configuration in spring configuration file :
<mvc:annotation-driven/> <tx:annotation-driven /> <context:component-scan base-package="com.spring.datasolr"/> <bean class="org.springframework.beans.factory.config.propertyplaceholderconfigurer"> <property name="locations"> <list> <value>classpath:application.properties</value> <value>classpath:db.properties</value> </list> </property> </bean> <mvc:resources mapping="/resources/**" location="/web-inf/resources/"/> <!-- configures spring view resolver --> <bean id="viewresolver" class="org.springframework.web.servlet.view.internalresourceviewresolver"> <property name="prefix" value="/web-inf/views/"/> <property name="suffix" value=".jsp"/> </bean> <!-- configures validation message property file --> <bean id="messagesource" class="org.springframework.context.support.reloadableresourcebundlemessagesource"> <property name="basename" value="/web-inf/messages"></property> </bean> <!-- configures database property --> <bean id="datasource" class="org.apache.commons.dbcp.basicdatasource"> <property name="driverclassname" value="${jdbc.driverclassname}"/> <property name="url" value="${jdbc.url}"/> <property name="username" value="${jdbc.username}"/> <property name="password" value="${jdbc.password}"/> </bean> <!-- configures hibernate sessionfactory --> <bean id="sessionfactory" class="org.springframework.orm.hibernate3.annotation.annotationsessionfactorybean"> <property name="datasource" ref="datasource"/> <property name="packagestoscan"> <list> <value>com.spring.datasolr.model</value> </list> </property> <property name="hibernateproperties"> <props> <prop key="hibernate.dialect">${hibernate.dialect}</prop> <prop key="hibernate.show_sql">true</prop> <!-- <prop key="hibernate.hbm2ddl.auto">create</prop> --> </props> </property> </bean> <!-- configures hibernate transaction management --> <bean id="transactionmanager" class="org.springframework.orm.hibernate3.hibernatetransactionmanager"> <property name="sessionfactory" ref="sessionfactory"/> </bean>
dao class :
@autowired sessionfactory sessionfactory; private session getsession(){ return sessionfactory.opensession(); } @override public void update(user user) { system.out.println("user id :: "+user.getid()); query query = getsession().createquery("update user set name=:name, email=:email, message=:message id=:id"); query.setparameter("name", user.getname()); query.setparameter("email", user.getemail()); query.setparameter("message", user.getmessage()); query.setparameter("id", user.getid()); query.executeupdate(); //sessionfactory.opensession().saveorupdate(user); }
service layer :
@transactional @service(value = "userservice") public class userserviceimpl implements userservice { @autowired userdao userdao; // database @autowired solrtemplate solrtemplate; @resource private userrepository userrepository; // solr @override public void updatedocument(object obj) { user user =(user) obj; userdao.update(user); //solr repository, save user in solr indexing userrepository.save(userdao.userlist()); } }
your transactional environment not work. use this:
@override public void update(user user) { system.out.println("user id :: "+user.getid()); session s = getsession(); transaction t = s.begintransaction(); query query = s.createquery("update user set name=:name, email=:email, message=:message id=:id"); query.setparameter("name", user.getname()); query.setparameter("email", user.getemail()); query.setparameter("message", user.getmessage()); query.setparameter("id", user.getid()); query.executeupdate(); t.commit(); }
because: if call twice, first attempt successfull transaction never closed. changes in transaction not yet in database. if read session looks first changes current transaction has, think stored in transaction only.
Comments
Post a Comment