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

Popular posts from this blog

php - Wordpress website dashboard page or post editor content is not showing but front end data is showing properly -

How to get the ip address of VM and use it to configure SSH connection dynamically in Ansible -

javascript - Get parameter of GET request -