java - Hibernate Update Query is not working in second time -


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