java - Duplicate entry happens in hibernate while I am trying to call saveorupdate() method -
my application contains several threads running concurrently , threads either inserts or updates several rows in tables, using saveorupdate() avoid duplicate entry issue. happens several times.
my table structure
create table `question` (`id` varchar(100) character set latin1 not null comment 'it post_id in )
my hbm
<class name="com.xminds.bestfriend.frontend.model.question" table="question" > <id name="id" type="string"> <column name="id" length="100" /> <generator class="assigned" /> </id> <many-to-one name="users" class="com.xminds.bestfriend.frontend.model.users" fetch="select"> <column name="answer_uid" /> </many-to-one> <many-to-one name="questiontype" class="com.xminds.bestfriend.frontend.model.questiontype" fetch="select"> <column name="question_type_id" /> </many-to-one> <property name="data1" type="string"> <column name="data1" length="65535" /> </property> <property name="data2" type="string"> <column name="data2" length="65535" /> </property> <property name="fbcreateddate" type="timestamp"> <column name="fb_created_date" length="19" /> </property> <property name="permalink" type="string"> <column name="perma_link" length="1000" /> </property> <property name="fbupdateddate" type="timestamp"> <column name="fb_updated_date" length="19" /> </property> <property name="contentactivity" type="java.lang.integer"> <column name="content_activity" /> </property> <property name="nbconsumptions" type="int"> <column name="nb_consumptions" not-null="true" /> </property> <property name="createddate" type="date"> <column name="created_date" length="10" /> </property> <property name="updateddate" type="date"> <column name="updated_date" length="10" /> </property> <property name="cover_url" type="string"> <column name="cover_url" length="1000"/> </property> <property name="category" type="string"> <column name="category" length="1000"/> </property> <property name="width" type="int"> <column name="width" not-null="true" /> </property> <property name="height" type="int"> <column name="height" not-null="true" /> </property> <property name="coveroffsetx" type="java.lang.integer"> <column name="cover_offset_x" /> </property> <property name="coveroffsety" type="java.lang.integer"> <column name="cover_offset_y" /> </property> <property name="latitude" type="java.lang.double"> <column name="latitude" precision="12" scale="0" /> </property> <property name="longitude" type="java.lang.double"> <column name="longitude" precision="12" scale="0" /> </property> <property name="is_active" type="boolean"> <column name="is_active" not-null="true" /> </property> <set name="questionconsumptions" inverse="true"> <key> <column name="question_id" length="100" not-null="true"> <comment>questionid</comment> </column> </key> <one-to-many class="com.xminds.bestfriend.frontend.model.questionconsumption" /> </set> </class>
getting exception
warn jdbcexceptionreporter - sql error: 1062, sqlstate: 23000
error jdbcexceptionreporter - duplicate entry '1019306207_10200395396740374' key 'primary' error abstractflushingeventlistener - not synchronize database state session org.hibernate.exception.constraintviolationexception: not insert: [com.xminds.bestfriend.frontend.model.question] @ org.hibernate.exception.sqlstateconverter.convert(sqlstateconverter.java:96) @ org.hibernate.exception.jdbcexceptionhelper.convert(jdbcexceptionhelper.java:66) @ org.hibernate.persister.entity.abstractentitypersister.insert(abstractentitypersister.java:2436) @ org.hibernate.persister.entity.abstractentitypersister.insert(abstractentitypersister.java:2856) @ org.hibernate.action.entityinsertaction.execute(entityinsertaction.java:79) @ org.hibernate.engine.actionqueue.execute(actionqueue.java:273) @ org.hibernate.engine.actionqueue.executeactions(actionqueue.java:265) @ org.hibernate.engine.actionqueue.executeactions(actionqueue.java:184) @ org.hibernate.event.def.abstractflushingeventlistener.performexecutions(abstractflushingeventlistener.java:321) @ org.hibernate.event.def.defaultflusheventlistener.onflush(defaultflusheventlistener.java:51) @ org.hibernate.impl.sessionimpl.flush(sessionimpl.java:1216) @ org.hibernate.impl.sessionimpl.managedflush(sessionimpl.java:383) @ org.hibernate.transaction.jdbctransaction.commit(jdbctransaction.java:133) @ org.springframework.orm.hibernate3.hibernatetransactionmanager.docommit(hibernatetransactionmanager.java:656) @ org.springframework.transaction.support.abstractplatformtransactionmanager.processcommit(abstractplatformtransactionmanager.java:754) @ org.springframework.transaction.support.abstractplatformtransactionmanager.commit(abstractplatformtransactionmanager.java:723) @ org.springframework.transaction.support.transactiontemplate.execute(transactiontemplate.java:147) @ com.xminds.bestfriend.consumers.base.onmessage(base.java:89) @ org.springframework.jms.listener.adapter.messagelisteneradapter.onmessage(messagelisteneradapter.java:339) @ org.springframework.jms.listener.abstractmessagelistenercontainer.doinvokelistener(abstractmessagelistenercontainer.java:535) @ org.springframework.jms.listener.abstractmessagelistenercontainer.invokelistener(abstractmessagelistenercontainer.java:495) @ org.springframework.jms.listener.abstractmessagelistenercontainer.doexecutelistener(abstractmessagelistenercontainer.java:467) @ org.springframework.jms.listener.abstractpollingmessagelistenercontainer.doreceiveandexecute(abstractpollingmessagelistenercontainer.java:325) @ org.springframework.jms.listener.abstractpollingmessagelistenercontainer.receiveandexecute(abstractpollingmessagelistenercontainer.java:263) @ org.springframework.jms.listener.defaultmessagelistenercontainer$asyncmessagelistenerinvoker.invokelistener(defaultmessagelistenercontainer.java:1058) @ org.springframework.jms.listener.defaultmessagelistenercontainer$asyncmessagelistenerinvoker.executeongoingloop(defaultmessagelistenercontainer.java:1050) @ org.springframework.jms.listener.defaultmessagelistenercontainer$asyncmessagelistenerinvoker.run(defaultmessagelistenercontainer.java:947) @ java.lang.thread.run(thread.java:679) caused by: com.mysql.jdbc.exceptions.jdbc4.mysqlintegrityconstraintviolationexception: duplicate entry '1019306207_10200395396740374' key 'primary' @ sun.reflect.nativeconstructoraccessorimpl.newinstance0(native method) @ sun.reflect.nativeconstructoraccessorimpl.newinstance(nativeconstructoraccessorimpl.java:57) @ sun.reflect.delegatingconstructoraccessorimpl.newinstance(delegatingconstructoraccessorimpl.java:45) @ java.lang.reflect.constructor.newinstance(constructor.java:532) @ com.mysql.jdbc.util.handlenewinstance(util.java:411) @ com.mysql.jdbc.util.getinstance(util.java:386) @ com.mysql.jdbc.sqlerror.createsqlexception(sqlerror.java:1039) @ com.mysql.jdbc.mysqlio.checkerrorpacket(mysqlio.java:3597) @ com.mysql.jdbc.mysqlio.checkerrorpacket(mysqlio.java:3529) @ com.mysql.jdbc.mysqlio.sendcommand(mysqlio.java:1990) @ com.mysql.jdbc.mysqlio.sqlquerydirect(mysqlio.java:2151) @ com.mysql.jdbc.connectionimpl.execsql(connectionimpl.java:2625) @ com.mysql.jdbc.preparedstatement.executeinternal(preparedstatement.java:2119) @ com.mysql.jdbc.preparedstatement.executeupdate(preparedstatement.java:2415) @ com.mysql.jdbc.preparedstatement.executeupdate(preparedstatement.java:2333) @ com.mysql.jdbc.preparedstatement.executeupdate(preparedstatement.java:2318) @ com.mchange.v2.c3p0.impl.newproxypreparedstatement.executeupdate(newproxypreparedstatement.java:105) @ org.hibernate.jdbc.nonbatchingbatcher.addtobatch(nonbatchingbatcher.java:46) @ org.hibernate.persister.entity.abstractentitypersister.insert(abstractentitypersister.java:2416) ... 25 more error questiongeneration - unable process task id : 208 org.springframework.dao.dataintegrityviolationexception: not insert: [com.xminds.bestfriend.frontend.model.question]; sql [insert question (answer_uid, question_type_id, data1, data2, fb_created_date, perma_link, fb_updated_date, content_activity, nb_consumptions, created_date, updated_date, cover_url, category, width, height, cover_offset_x, cover_offset_y, latitude, longitude, is_active, id) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)]; constraint [null]; nested exception org.hibernate.exception.constraintviolationexception: not insert: [com.xminds.bestfriend.frontend.model.question] @ org.springframework.orm.hibernate3.sessionfactoryutils.converthibernateaccessexception(sessionfactoryutils.java:637) @ org.springframework.orm.hibernate3.hibernatetransactionmanager.converthibernateaccessexception(hibernatetransactionmanager.java:793) @ org.springframework.orm.hibernate3.hibernatetransactionmanager.docommit(hibernatetransactionmanager.java:664) @ org.springframework.transaction.support.abstractplatformtransactionmanager.processcommit(abstractplatformtransactionmanager.java:754) @ org.springframework.transaction.support.abstractplatformtransactionmanager.commit(abstractplatformtransactionmanager.java:723) @ org.springframework.transaction.support.transactiontemplate.execute(transactiontemplate.java:147) @ com.xminds.bestfriend.consumers.base.onmessage(base.java:89) @ org.springframework.jms.listener.adapter.messagelisteneradapter.onmessage(messagelisteneradapter.java:339) @ org.springframework.jms.listener.abstractmessagelistenercontainer.doinvokelistener(abstractmessagelistenercontainer.java:535) @ org.springframework.jms.listener.abstractmessagelistenercontainer.invokelistener(abstractmessagelistenercontainer.java:495) @ org.springframework.jms.listener.abstractmessagelistenercontainer.doexecutelistener(abstractmessagelistenercontainer.java:467) @ org.springframework.jms.listener.abstractpollingmessagelistenercontainer.doreceiveandexecute(abstractpollingmessagelistenercontainer.java:325) @ org.springframework.jms.listener.abstractpollingmessagelistenercontainer.receiveandexecute(abstractpollingmessagelistenercontainer.java:263) @ org.springframework.jms.listener.defaultmessagelistenercontainer$asyncmessagelistenerinvoker.invokelistener(defaultmessagelistenercontainer.java:1058) @ org.springframework.jms.listener.defaultmessagelistenercontainer$asyncmessagelistenerinvoker.executeongoingloop(defaultmessagelistenercontainer.java:1050) @ org.springframework.jms.listener.defaultmessagelistenercontainer$asyncmessagelistenerinvoker.run(defaultmessagelistenercontainer.java:947) @ java.lang.thread.run(thread.java:679) caused by: org.hibernate.exception.constraintviolationexception: not insert: [com.xminds.bestfriend.frontend.model.question] @ org.hibernate.exception.sqlstateconverter.convert(sqlstateconverter.java:96) @ org.hibernate.exception.jdbcexceptionhelper.convert(jdbcexceptionhelper.java:66) @ org.hibernate.persister.entity.abstractentitypersister.insert(abstractentitypersister.java:2436) @ org.hibernate.persister.entity.abstractentitypersister.insert(abstractentitypersister.java:2856) @ org.hibernate.action.entityinsertaction.execute(entityinsertaction.java:79) @ org.hibernate.engine.actionqueue.execute(actionqueue.java:273) @ org.hibernate.engine.actionqueue.executeactions(actionqueue.java:265) @ org.hibernate.engine.actionqueue.executeactions(actionqueue.java:184) @ org.hibernate.event.def.abstractflushingeventlistener.performexecutions(abstractflushingeventlistener.java:321) @ org.hibernate.event.def.defaultflusheventlistener.onflush(defaultflusheventlistener.java:51) @ org.hibernate.impl.sessionimpl.flush(sessionimpl.java:1216) @ org.hibernate.impl.sessionimpl.managedflush(sessionimpl.java:383) @ org.hibernate.transaction.jdbctransaction.commit(jdbctransaction.java:133) @ org.springframework.orm.hibernate3.hibernatetransactionmanager.docommit(hibernatetransactionmanager.java:656) ... 14 more caused by: com.mysql.jdbc.exceptions.jdbc4.mysqlintegrityconstraintviolationexception: duplicate entry '1019306207_10200395396740374' key 'primary' @ sun.reflect.nativeconstructoraccessorimpl.newinstance0(native method) @ sun.reflect.nativeconstructoraccessorimpl.newinstance(nativeconstructoraccessorimpl.java:57) @ sun.reflect.delegatingconstructoraccessorimpl.newinstance(delegatingconstructoraccessorimpl.java:45) @ java.lang.reflect.constructor.newinstance(constructor.java:532) @ com.mysql.jdbc.util.handlenewinstance(util.java:411) @ com.mysql.jdbc.util.getinstance(util.java:386) @ com.mysql.jdbc.sqlerror.createsqlexception(sqlerror.java:1039) @ com.mysql.jdbc.mysqlio.checkerrorpacket(mysqlio.java:3597) @ com.mysql.jdbc.mysqlio.checkerrorpacket(mysqlio.java:3529) @ com.mysql.jdbc.mysqlio.sendcommand(mysqlio.java:1990) @ com.mysql.jdbc.mysqlio.sqlquerydirect(mysqlio.java:2151) @ com.mysql.jdbc.connectionimpl.execsql(connectionimpl.java:2625) @ com.mysql.jdbc.preparedstatement.executeinternal(preparedstatement.java:2119) @ com.mysql.jdbc.preparedstatement.executeupdate(preparedstatement.java:2415) @ com.mysql.jdbc.preparedstatement.executeupdate(preparedstatement.java:2333) @ com.mysql.jdbc.preparedstatement.executeupdate(preparedstatement.java:2318) @ com.mchange.v2.c3p0.impl.newproxypreparedstatement.executeupdate(newproxypreparedstatement.java:105) @ org.hibernate.jdbc.nonbatchingbatcher.addtobatch(nonbatchingbatcher.java:46) @ org.hibernate.persister.entity.abstractentitypersister.insert(abstractentitypersister.java:2416) ... 25 more
@override public void saveorupdate(object instance) { //log.debug("attaching dirty instance"); try { gethibernatetemplate().saveorupdate(instance); //log.debug("attach successful"); } catch (runtimeexception re) { // log.error("attach failed", re); throw re; } }
you said,"my application contains several threads running concurrently , threads either inserts or updates several rows in tables". , setting id manually. want know, id setting threads, how getting them ?
Comments
Post a Comment