spring - Not-null property references a transient value - transient instance must be saved before current operation -
this log exception:
grave: servlet.service() servlet [dispatcher] in context path [/libreria] threw exception [request processing failed; nested exception org.hibernate.transientpropertyvalueexception: not-null property references transient value - transient instance must saved before current operation : com.angelo.springmvc.model.prestitolibro.prestito -> com.angelo.springmvc.model.prestito] root cause org.hibernate.transientpropertyvalueexception: not-null property references transient value - transient instance must saved before current operation : com.angelo.springmvc.model.prestitolibro.prestito -> com.angelo.springmvc.model.prestito @ org.hibernate.action.internal.unresolvedentityinsertactions.checknounresolvedactionsafteroperation(unresolvedentityinsertactions.java:137) @ org.hibernate.engine.spi.actionqueue.checknounresolvedactionsafteroperation(actionqueue.java:318) @ org.hibernate.internal.sessionimpl.checknounresolvedactionsafteroperation(sessionimpl.java:658) @ org.hibernate.internal.sessionimpl.firepersist(sessionimpl.java:813) @ org.hibernate.internal.sessionimpl.persist(sessionimpl.java:784) @ org.hibernate.internal.sessionimpl.persist(sessionimpl.java:789) @ com.angelo.springmvc.dao.abstractdao.persist(abstractdao.java:34) @ com.angelo.springmvc.dao.prestitolibrodaoimpl.saveprestitolibro(prestitolibrodaoimpl.java:27) @ com.angelo.springmvc.service.prestitoserviceimpl.salvaprestito(prestitoserviceimpl.java:85) @ sun.reflect.nativemethodaccessorimpl.invoke0(native method) @ sun.reflect.nativemethodaccessorimpl.invoke(unknown source) @ sun.reflect.delegatingmethodaccessorimpl.invoke(unknown source) @ java.lang.reflect.method.invoke(unknown source) @ org.springframework.aop.support.aoputils.invokejoinpointusingreflection(aoputils.java:317) @ org.springframework.aop.framework.reflectivemethodinvocation.invokejoinpoint(reflectivemethodinvocation.java:190) @ org.springframework.aop.framework.reflectivemethodinvocation.proceed(reflectivemethodinvocation.java:157) @ org.springframework.transaction.interceptor.transactioninterceptor$1.proceedwithinvocation(transactioninterceptor.java:98) @ org.springframework.transaction.interceptor.transactionaspectsupport.invokewithintransaction(transactionaspectsupport.java:262) @ org.springframework.transaction.interceptor.transactioninterceptor.invoke(transactioninterceptor.java:95) @ org.springframework.aop.framework.reflectivemethodinvocation.proceed(reflectivemethodinvocation.java:179) @ org.springframework.aop.framework.jdkdynamicaopproxy.invoke(jdkdynamicaopproxy.java:207) @ com.sun.proxy.$proxy45.salvaprestito(unknown source) @ com.angelo.springmvc.controller.shoppingcartcontroller.ordinashoppingcart(shoppingcartcontroller.java:62) @ sun.reflect.nativemethodaccessorimpl.invoke0(native method) @ sun.reflect.nativemethodaccessorimpl.invoke(unknown source) @ sun.reflect.delegatingmethodaccessorimpl.invoke(unknown source) @ java.lang.reflect.method.invoke(unknown source) @ org.springframework.web.method.support.invocablehandlermethod.invoke(invocablehandlermethod.java:215) @ org.springframework.web.method.support.invocablehandlermethod.invokeforrequest(invocablehandlermethod.java:132) @ org.springframework.web.servlet.mvc.method.annotation.servletinvocablehandlermethod.invokeandhandle(servletinvocablehandlermethod.java:104) @ org.springframework.web.servlet.mvc.method.annotation.requestmappinghandleradapter.invokehandlemethod(requestmappinghandleradapter.java:749) @ org.springframework.web.servlet.mvc.method.annotation.requestmappinghandleradapter.handleinternal(requestmappinghandleradapter.java:689) @ org.springframework.web.servlet.mvc.method.abstracthandlermethodadapter.handle(abstracthandlermethodadapter.java:83) @ org.springframework.web.servlet.dispatcherservlet.dodispatch(dispatcherservlet.java:938) @ org.springframework.web.servlet.dispatcherservlet.doservice(dispatcherservlet.java:870) @ org.springframework.web.servlet.frameworkservlet.processrequest(frameworkservlet.java:961) @ org.springframework.web.servlet.frameworkservlet.dopost(frameworkservlet.java:863) @ javax.servlet.http.httpservlet.service(httpservlet.java:648) @ org.springframework.web.servlet.frameworkservlet.service(frameworkservlet.java:837) @ javax.servlet.http.httpservlet.service(httpservlet.java:729) @ org.apache.catalina.core.applicationfilterchain.internaldofilter(applicationfilterchain.java:291) @ org.apache.catalina.core.applicationfilterchain.dofilter(applicationfilterchain.java:206) @ org.apache.tomcat.websocket.server.wsfilter.dofilter(wsfilter.java:52) @ org.apache.catalina.core.applicationfilterchain.internaldofilter(applicationfilterchain.java:239) @ org.apache.catalina.core.applicationfilterchain.dofilter(applicationfilterchain.java:206) @ org.apache.catalina.core.standardwrappervalve.invoke(standardwrappervalve.java:212) @ org.apache.catalina.core.standardcontextvalve.invoke(standardcontextvalve.java:106) @ org.apache.catalina.authenticator.authenticatorbase.invoke(authenticatorbase.java:502) @ org.apache.catalina.core.standardhostvalve.invoke(standardhostvalve.java:141) @ org.apache.catalina.valves.errorreportvalve.invoke(errorreportvalve.java:79) @ org.apache.catalina.valves.abstractaccesslogvalve.invoke(abstractaccesslogvalve.java:616) @ org.apache.catalina.core.standardenginevalve.invoke(standardenginevalve.java:88) @ org.apache.catalina.connector.coyoteadapter.service(coyoteadapter.java:521) @ org.apache.coyote.http11.abstracthttp11processor.process(abstracthttp11processor.java:1096) @ org.apache.coyote.abstractprotocol$abstractconnectionhandler.process(abstractprotocol.java:674) @ org.apache.tomcat.util.net.nioendpoint$socketprocessor.dorun(nioendpoint.java:1500) @ org.apache.tomcat.util.net.nioendpoint$socketprocessor.run(nioendpoint.java:1456) @ java.util.concurrent.threadpoolexecutor.runworker(unknown source) @ java.util.concurrent.threadpoolexecutor$worker.run(unknown source) @ org.apache.tomcat.util.threads.taskthread$wrappingrunnable.run(taskthread.java:61) @ java.lang.thread.run(unknown source)
the scenario following: have 2 entity beans prestito , prestitolibro, serviceprestito , session bean shoppingcard controller:
@entity @table(name="prestito") @xmlrootelement public class prestito { private integer id; private cliente cliente; private date dataprestito; private set<prestitolibro> prestitolibros = new hashset<prestitolibro>(0); public prestito() { } public prestito(cliente cliente, date dataprestito) { this.cliente = cliente; this.dataprestito = dataprestito; } public prestito(cliente cliente, date dataprestito, set<prestitolibro> prestitolibros) { this.cliente = cliente; this.dataprestito = dataprestito; this.prestitolibros = prestitolibros; } @id @generatedvalue(strategy = identity) @column(name = "id", unique = true, nullable = false) public integer getid() { return this.id; } public void setid(integer id) { this.id = id; } @manytoone(fetch = fetchtype.lazy) @joincolumn(name = "id_cliente", nullable = false) public cliente getcliente() { return this.cliente; } public void setcliente(cliente cliente) { this.cliente = cliente; } @temporal(temporaltype.date) @column(name = "dataprestito", nullable = false, length = 10) public date getdataprestito() { return this.dataprestito; } public void setdataprestito(date dataprestito) { this.dataprestito = dataprestito; } @onetomany(fetch = fetchtype.lazy, mappedby = "prestito") public set<prestitolibro> getprestitolibros() { return this.prestitolibros; } public void setprestitolibros(set<prestitolibro> prestitolibros) { this.prestitolibros = prestitolibros; } @override public int hashcode() { final int prime = 31; int result = 1; result = prime * result + ((id == null) ? 0 : id.hashcode()); return result; } @override public boolean equals(object obj) { if (this == obj) return true; if (obj == null) return false; if (getclass() != obj.getclass()) return false; prestito other = (prestito) obj; if (id == null) { if (other.id != null) return false; } else if (!id.equals(other.id)) return false; return true; } @override public string tostring() { return "prestito [id=" + id + ", cliente=" + cliente + ", dataprestito=" + dataprestito + ", prestitolibros=" + prestitolibros + "]"; } } @entity @table(name="prestitolibro") @xmlrootelement public class prestitolibro { private integer id; private libro libro; private prestito prestito; private integer qta; private double subtotal; public prestitolibro() { } public prestitolibro(libro libro, prestito prestito) { this.libro = libro; this.prestito = prestito; } public prestitolibro(libro libro, prestito prestito, integer qta, double subtotal) { this.libro = libro; this.prestito = prestito; this.qta = qta; this.subtotal = subtotal; } @id @generatedvalue(strategy = identity) @column(name = "id", unique = true, nullable = false) public integer getid() { return this.id; } public void setid(integer id) { this.id = id; } @manytoone(fetch = fetchtype.lazy)//, cascade=cascadetype.all @joincolumn(name = "id_libro", nullable = false) public libro getlibro() { return this.libro; } public void setlibro(libro libro) { this.libro = libro; } @manytoone(fetch = fetchtype.lazy) @joincolumn(name = "id_prestito", nullable = false) public prestito getprestito() { return this.prestito; } public void setprestito(prestito prestito) { this.prestito = prestito; } @column(name = "qta") public integer getqta() { return this.qta; } public void setqta(integer qta) { this.qta = qta; } @column(name = "subtotal", precision = 22, scale = 0) public double getsubtotal() { return this.subtotal; } public void setsubtotal(double subtotal) { this.subtotal = subtotal; } @override public int hashcode() { final int prime = 31; int result = 1; result = prime * result + id; return result; } @override public boolean equals(object obj) { if (this == obj) return true; if (obj == null) return false; if (getclass() != obj.getclass()) return false; prestitolibro other = (prestitolibro) obj; if (id != other.id) return false; return true; } @override public string tostring() { return "prestitolibro [id=" + id + ", libro=" + libro + ", prestito=" + prestito + ", qta=" + qta + ", subtotal=" + subtotal + "]"; } } @component @scope(value=webapplicationcontext.scope_session, proxymode=scopedproxymode.target_class) public class shoppingcart { private map<libro, integer> contents = new hashmap<>(); public map<libro, integer> getcontents() { return contents; } public void setcontents(map<libro, integer> contents) { this.contents = contents; } public void addlibro(libro libro, int count){ if(contents.containskey(libro)){ contents.put(libro, contents.get(libro)+count); }else{ contents.put(libro,count); } } public void removelibro(libro libro){ contents.remove(libro); } public void clearcart(){ contents.clear(); } @override public string tostring() { return "shoppingcart [contents=" + contents + "]"; } public double gettotalcost(){ double totalcost = 0; int = 0; for(libro libro: contents.keyset()){ = contents.get(libro); totalcost += * libro.getprezzo(); } return totalcost; } }
the problem occurs when call salvaprestito()
here:
@service("prestitoservice") @transactional public class prestitoserviceimpl implements prestitoservice { @autowired private prestitodao dao; @autowired private prestitolibrodao daoprestitolibro; public prestito findbyid(int id) { return dao.findbyid(id); } public void saveprestito(prestito prestito) { dao.saveprestito(prestito); } public void updateprestito(prestito prestito) { prestito entity = dao.findbyid(prestito.getid()); if(entity!=null){ entity.setcliente(prestito.getcliente()); entity.setdataprestito(prestito.getdataprestito()); entity.setprestitolibros(prestito.getprestitolibros()); } } public void deleteprestitobysss(string sss) { dao.deleteprestitobysss(sss); } public list<prestito> findallprestiti() { return dao.findallprestiti(); } public prestito findprestitobysss(string sss) { return dao.findprestitobysss(sss); } public boolean isprestitosssunique(integer id, string sss) { prestito prestito = findprestitobysss(sss); return ( prestito == null || ((id != null) && (prestito.getid() == id))); } public void salvaprestito(map<libro, integer> shoppingcartcontents, cliente cliente){ prestito prestito = new prestito(); prestito = dao.findbyid(prestito.getid()); prestito.setcliente(cliente); dao.saveprestito(prestito); for(entry<libro, integer> entry: shoppingcartcontents.entryset()){ prestitolibro prestlibro = new prestitolibro(entry.getkey(),prestito); prestlibro.setqta(entry.getvalue()); prestlibro.setprestito(prestito); prestlibro.setsubtotal(entry.getkey().getprezzo()*entry.getvalue()); daoprestitolibro.saveprestitolibro(prestlibro); prestito.getprestitolibros().add(prestlibro); } }
and shopping cart controller:
@controller public class shoppingcartcontroller { private static final logger logger = loggerfactory.getlogger(shoppingcartcontroller.class); @autowired private libroservice libroservice; @autowired private prestitoservice prestitoservice; @autowired private shoppingcart shoppingcart; @requestmapping(value = { "/shoppingcart/add/{libroid}" }, method = requestmethod.get) public string addtoshoppingcart(@pathvariable("libroid") int libroid, @requestheader("referer") string rform) { libro libro = (libro) libroservice.findbyid(libroid); shoppingcart.addlibro(libro, 1); logger.debug("aggiunto libro carrello" + libro); return "redirect:" + rform; } @requestmapping(value = { "/shoppingcart" }, method = requestmethod.get) public string viewshoppingcart(model model) { model.addattribute("shoppingcart", shoppingcart); return "shoppingcart"; } @requestmapping(value = { "/shoppingcart/order" }, method = requestmethod.post) public string ordinashoppingcart(httpsession session) { if(shoppingcart.getcontents().isempty()){ return "redirect:/shoppingcart"; }else{ cliente cliente = (cliente) session.getattribute("cliente"); prestitoservice.salvaprestito(shoppingcart.getcontents(), cliente); return "redirect:/shoppingcart"; } }
these daos:
@repository("prestitolibrodao") public class prestitolibrodaoimpl extends abstractdao<integer, prestitolibro> implements prestitolibrodao{ public prestitolibro findbyid(int id) { prestitolibro prestitolibro = getbykey(id); if(prestitolibro!=null){ hibernate.initialize(prestitolibro.getid()); } return prestitolibro; } public void saveprestitolibro(prestitolibro prestitolibro) { persist(prestitolibro); } public void deleteprestitolibrobyid(int id) { query query = getsession().createsqlquery("delete prestitolibro id = :id"); query.setstring("id",(string) integer.tostring(id)); query.executeupdate(); } @suppresswarnings("unchecked") public list<prestitolibro> findallprestitilibro() { criteria criteria = createentitycriteria(); return (list<prestitolibro>) criteria.list(); } @suppresswarnings("unchecked") public list<prestitolibro> findallprestitilibrobyprestito(int prestitoid) { criteria criteria = createentitycriteria(); criteria.add(restrictions.eq("id_prestito", prestitoid)); return (list<prestitolibro>) criteria.list(); } @suppresswarnings("unchecked") public list<prestitolibro> findallprestitilibrobylibro(int libroid) { criteria criteria = createentitycriteria(); criteria.add(restrictions.eq("id_libro", libroid)); return (list<prestitolibro>) criteria.list(); } @repository("prestitodao") public class prestitodaoimpl extends abstractdao<integer, prestito> implements prestitodao{ public prestito findbyid(int id) { prestito prestito = getbykey(id); if(prestito!=null){ hibernate.initialize(prestito.getid()); } return prestito; } public void saveprestito(prestito prestito) { persist(prestito); // save prestito significa salvare il prestito o/e anche prestitolibiri } public void deleteprestitobysss(string sss) { query query = getsession().createsqlquery("delete libro snn = :snn"); query.setstring("sss", sss); query.executeupdate(); } @suppresswarnings("unchecked") public list<prestito> findallprestiti() { criteria criteria = createentitycriteria(); return (list<prestito>) criteria.list(); } public prestito findprestitobysss(string sss) { system.out.println("sss : "+sss); criteria criteria = createentitycriteria(); criteria.add(restrictions.eq("sss", sss)); prestito prestito = (prestito)criteria.uniqueresult(); if(prestito!=null){ hibernate.initialize(prestito.getid()); } return prestito; }
hibernate needs id
in prestito
associate prestitolibro
foreign key. think, don't have id
in prestito
here
prestlibro.setprestito(prestito); daoprestitolibro.saveprestitolibro(prestlibro);
try output prestito.getid() before set prestlibro
.
if don't have id
reason may generation strategy
@generatedvalue(strategy = identity)
or don't have transaction @transactional
in prestitoserviceimpl
dao.saveprestito(prestito)
doesn't save prestito
@ all. may adding of spring xml configuration in question let you.
you unnecessary stuff in method should be
public void salvaprestito(map<libro, integer> shoppingcartcontents, cliente cliente){ prestito prestito = new prestito(); prestito.setcliente(cliente); dao.saveprestito(prestito); for(entry<libro, integer> entry: shoppingcartcontents.entryset()){ prestitolibro prestlibro = new prestitolibro(entry.getkey(), prestito); prestlibro.setqta(entry.getvalue()); prestlibro.setsubtotal(entry.getkey().getprezzo() * entry.getvalue()); daoprestitolibro.saveprestitolibro(prestlibro); } }
you don't need prestlibro.setprestito(prestito)
, prestito.getprestitolibros().add(prestlibro)
.
Comments
Post a Comment