Spring, Hibernate - many-to-many - update error -


i'm trying use many-to-many relation in hibernate framework, have troubles.

i have 2 models.

user:

@entity public class user implements serializable { long id; string name; list<car> cars; public user() {  } public long getid() {     return id; } public void setid(long id) {     this.id = id; } public string getname() {     return name; } public void setname(string name) {     this.name = name; } public list<car> getcars() {     return cars; } public void setcars(list<car> cars) {     this.cars = cars; } } 

car:

@entity public class car implements serializable { long id; string mark; public car() {  } public long getid() {     return id; } public void setid(long id) {     this.id = id; } public string getmark() {     return mark; } public void setmark(string mark) {     this.mark = mark; } } 

i followed clues on page, configuration files looks this:

user:

<hibernate-mapping> <class name="com.bontade.phone_book.mvc.spring.models.user" table="users">     <id name="id" type="java.lang.long">         <column name="id" />         <generator class="identity" />     </id>             <property name="name" not-null="true" length="100" type="java.lang.string">         <column name="name" />     </property>            <list name="cars" table="user_car" cascade="all">         <key>             <column name="user_id" />         </key>         <list-index></list-index>         <many-to-many column="car_id" class="com.bontade.phone_book.mvc.spring.models.car" />     </list>         </class> </hibernate-mapping> 

car:

<hibernate-mapping> <class name="com.bontade.phone_book.mvc.spring.models.car" table="cars">     <id name="id" type="java.lang.long">         <column name="id" />         <generator class="identity" />     </id>     <property name="mark"  not-null="true" length="20" type="java.lang.string">         <column name="mark" />     </property>      </class> </hibernate-mapping> 

i'm getting errors:

    hibernate: update cars set mark=? id=? 2011-02-23 16:32:34 org.apache.catalina.core.standardwrappervalve invoke severe: servlet.service() servlet [dispatcher] in context path [/phonebook] threw exception [request processing failed; nested exception org.springframework.orm.hibernate3.hibernateoptimisticlockingfailureexception: batch update returned unexpected row count update [0]; actual row count: 0; expected: 1; nested exception org.hibernate.stalestateexception: batch update returned unexpected row count update [0]; actual row count: 0; expected: 1] root cause org.hibernate.stalestateexception: batch update returned unexpected row count update [0]; actual row count: 0; expected: 1     @ org.hibernate.jdbc.expectations$basicexpectation.checkbatched(expectations.java:85)     @ org.hibernate.jdbc.expectations$basicexpectation.verifyoutcome(expectations.java:70)     @ org.hibernate.jdbc.batchingbatcher.checkrowcounts(batchingbatcher.java:90)     @ org.hibernate.jdbc.batchingbatcher.doexecutebatch(batchingbatcher.java:70)     @ org.hibernate.jdbc.abstractbatcher.executebatch(abstractbatcher.java:268)     @ org.hibernate.engine.actionqueue.executeactions(actionqueue.java:266)     @ org.hibernate.engine.actionqueue.executeactions(actionqueue.java:168)     @ org.hibernate.event.def.abstractflushingeventlistener.performexecutions(abstractflushingeventlistener.java:321)     @ org.hibernate.event.def.defaultflusheventlistener.onflush(defaultflusheventlistener.java:50)     @ org.hibernate.impl.sessionimpl.flush(sessionimpl.java:1028)     @ org.hibernate.impl.sessionimpl.managedflush(sessionimpl.java:366)     @ org.hibernate.transaction.jdbctransaction.commit(jdbctransaction.java:137)     @ org.springframework.orm.hibernate3.hibernatetransactionmanager.docommit(hibernatetransactionmanager.java:655)     @ org.springframework.transaction.support.abstractplatformtransactionmanager.processcommit(abstractplatformtransactionmanager.java:732)     @ org.springframework.transaction.support.abstractplatformtransactionmanager.commit(abstractplatformtransactionmanager.java:701)     @ org.springframework.transaction.support.transactiontemplate.execute(transactiontemplate.java:140)     @ com.bontade.phone_book.mvc.spring.models.dao.implementations.cardaoimplementation.savecar(cardaoimplementation.java:30)     @ com.bontade.phone_book.mvc.spring.controllers.homepagecontroller.handlerequestinternal(homepagecontroller.java:43)     @ org.springframework.web.servlet.mvc.abstractcontroller.handlerequest(abstractcontroller.java:153)     @ org.springframework.web.servlet.mvc.simplecontrollerhandleradapter.handle(simplecontrollerhandleradapter.java:48)     @ org.springframework.web.servlet.dispatcherservlet.dodispatch(dispatcherservlet.java:875)     @ org.springframework.web.servlet.dispatcherservlet.doservice(dispatcherservlet.java:807)     @ org.springframework.web.servlet.frameworkservlet.processrequest(frameworkservlet.java:571)     @ org.springframework.web.servlet.frameworkservlet.doget(frameworkservlet.java:501)     @ javax.servlet.http.httpservlet.service(httpservlet.java:621)     @ javax.servlet.http.httpservlet.service(httpservlet.java:722)     @ org.apache.catalina.core.applicationfilterchain.internaldofilter(applicationfilterchain.java:306)     @ org.apache.catalina.core.applicationfilterchain.dofilter(applicationfilterchain.java:210)     @ org.springframework.web.filter.characterencodingfilter.dofilterinternal(characterencodingfilter.java:96)     @ org.springframework.web.filter.onceperrequestfilter.dofilter(onceperrequestfilter.java:76)     @ org.apache.catalina.core.applicationfilterchain.internaldofilter(applicationfilterchain.java:244)     @ org.apache.catalina.core.applicationfilterchain.dofilter(applicationfilterchain.java:210)     @ org.apache.catalina.core.standardwrappervalve.invoke(standardwrappervalve.java:240)     @ org.apache.catalina.core.standardcontextvalve.invoke(standardcontextvalve.java:161)     @ org.apache.catalina.core.standardhostvalve.invoke(standardhostvalve.java:164)     @ org.apache.catalina.valves.errorreportvalve.invoke(errorreportvalve.java:108)     @ org.apache.catalina.valves.accesslogvalve.invoke(accesslogvalve.java:558)     @ org.apache.catalina.core.standardenginevalve.invoke(standardenginevalve.java:118)     @ org.apache.catalina.connector.coyoteadapter.service(coyoteadapter.java:379)     @ org.apache.coyote.http11.http11processor.process(http11processor.java:243)     @ org.apache.coyote.http11.http11protocol$http11connectionhandler.process(http11protocol.java:259)     @ org.apache.tomcat.util.net.jioendpoint$socketprocessor.run(jioendpoint.java:281)     @ java.util.concurrent.threadpoolexecutor$worker.runtask(threadpoolexecutor.java:886)     @ java.util.concurrent.threadpoolexecutor$worker.run(threadpoolexecutor.java:908)     @ java.lang.thread.run(thread.java:662) 

update

public class caraoimplementation implements cardao {  private hibernatetemplate hibernatetemplate; private transactiontemplate transactiontemplate; public void setsessionfactory(sessionfactory sessionfactory) {     this.hibernatetemplate = new hibernatetemplate(sessionfactory); } public void settransactiontemplate(transactiontemplate transactiontemplate) {     this.transactiontemplate = transactiontemplate; }  @override public void savecar(final car car) {     // todo auto-generated method stub     this.transactiontemplate.execute(new transactioncallback() {          public object dointransaction(transactionstatus transactionstatus) {             try {                 hibernatetemplate.saveorupdate(car);             } catch (exception e) {                 transactionstatus.setrollbackonly();             }             return null;         }     }); } ... } 

update 2

car markcar = new car(); markcar.setid(null); markcar.setmark("111"); cardao.savecar(markcar);  user mark = new user(); mark.setid(null); mark.setname("mark"); list = new arraylist<car>(); a.add(markcar); mark.setcars(a); userdao.saveuser(mark); list<user> users = userdao.getall(); system.out.println("==" + users.size() + "==="); system.out.println(users.get(0).getcars().get(0).getmark()); 

stack trace:

    hibernate: select user0_.id id0_, user0_.name name0_ users user0_ ==1== 2011-02-23 17:35:10 org.apache.catalina.core.standardwrappervalve invoke severe: servlet.service() servlet [dispatcher] in context path [/phonebook] threw exception [request processing failed; nested exception org.hibernate.lazyinitializationexception: failed lazily initialize collection of role: com.bontade.phone_book.mvc.spring.models.user.cars, no session or session closed] root cause org.hibernate.lazyinitializationexception: failed lazily initialize collection of role: com.bontade.phone_book.mvc.spring.models.user.cars, no session or session closed     @ org.hibernate.collection.abstractpersistentcollection.throwlazyinitializationexception(abstractpersistentcollection.java:380)     @ org.hibernate.collection.abstractpersistentcollection.throwlazyinitializationexceptionifnotconnected(abstractpersistentcollection.java:372)     @ org.hibernate.collection.abstractpersistentcollection.readelementbyindex(abstractpersistentcollection.java:173)     @ org.hibernate.collection.persistentlist.get(persistentlist.java:293)     @ com.bontade.phone_book.mvc.spring.controllers.homepagecontroller.handlerequestinternal(homepagecontroller.java:59)     @ org.springframework.web.servlet.mvc.abstractcontroller.handlerequest(abstractcontroller.java:153)     @ org.springframework.web.servlet.mvc.simplecontrollerhandleradapter.handle(simplecontrollerhandleradapter.java:48)     @ org.springframework.web.servlet.dispatcherservlet.dodispatch(dispatcherservlet.java:875)     @ org.springframework.web.servlet.dispatcherservlet.doservice(dispatcherservlet.java:807)     @ org.springframework.web.servlet.frameworkservlet.processrequest(frameworkservlet.java:571)     @ org.springframework.web.servlet.frameworkservlet.doget(frameworkservlet.java:501)     @ javax.servlet.http.httpservlet.service(httpservlet.java:621)     @ javax.servlet.http.httpservlet.service(httpservlet.java:722)     @ org.apache.catalina.core.applicationfilterchain.internaldofilter(applicationfilterchain.java:306)     @ org.apache.catalina.core.applicationfilterchain.dofilter(applicationfilterchain.java:210)     @ org.springframework.web.filter.characterencodingfilter.dofilterinternal(characterencodingfilter.java:96)     @ org.springframework.web.filter.onceperrequestfilter.dofilter(onceperrequestfilter.java:76)     @ org.apache.catalina.core.applicationfilterchain.internaldofilter(applicationfilterchain.java:244)     @ org.apache.catalina.core.applicationfilterchain.dofilter(applicationfilterchain.java:210)     @ org.apache.catalina.core.standardwrappervalve.invoke(standardwrappervalve.java:240)     @ org.apache.catalina.core.standardcontextvalve.invoke(standardcontextvalve.java:161)     @ org.apache.catalina.core.standardhostvalve.invoke(standardhostvalve.java:164)     @ org.apache.catalina.valves.errorreportvalve.invoke(errorreportvalve.java:108)     @ org.apache.catalina.valves.accesslogvalve.invoke(accesslogvalve.java:558)     @ org.apache.catalina.core.standardenginevalve.invoke(standardenginevalve.java:118)     @ org.apache.catalina.connector.coyoteadapter.service(coyoteadapter.java:379)     @ org.apache.coyote.http11.http11processor.process(http11processor.java:243)     @ org.apache.coyote.http11.http11protocol$http11connectionhandler.process(http11protocol.java:259)     @ org.apache.tomcat.util.net.jioendpoint$socketprocessor.run(jioendpoint.java:281)     @ java.util.concurrent.threadpoolexecutor$worker.runtask(threadpoolexecutor.java:886)     @ java.util.concurrent.threadpoolexecutor$worker.run(threadpoolexecutor.java:908)     @ java.lang.thread.run(thread.java:662) 

do not set carid hand!

car markcar = new car(); markcar.setid(1l);  //<-- remove line markcar.setmark("111"); cardao.savecar(markcar); 

remove line, , try again.

the reason hibernate use primary key value determine if unsaved instance (in normal case null mean unsaved). guess setting car id value (different null) bemused hibernate.

added

an other thing bemused me use annotations and xml.


Comments

Popular posts from this blog

linux - Mailx and Gmail nss config dir -

c# - Is it possible to remove an existing registration from Autofac container builder? -

php - Mysql PK and FK char(36) vs int(10) -