java - spring boot using jackson persist of nested entity failing -
i working first spring-boot project. have 2 entities 1 dependant on other.
here json inserts data
{ "city": "chicago", "description": "scattered clouds", "humidity": 33, "pressure": 1020, "temperature": 25, "wind": { "speed": 3.1, "degree": 240 }, "timestamp": "2017-02-14t05:48:41.861z" } as can see wind has separate entity.
first entity weathersensor
@entity public class weathersensor { public weathersensor() { this.id = uuid.randomuuid().tostring(); } @id private string id; private string city; private string description; private int humidity; private int pressure; private int temperature; private timestamp timestamp; @onetoone private wind wind; public string getid() { return id; } public void setid(string id) { this.id = id; } @override public string tostring() { return "weathersensor [city=" + city + ", description=" + description + ", humidity=" + humidity + ", pressure=" + pressure + ", temperature=" + temperature + ", timestamp=" + timestamp + ", wind=" + wind + "]"; } public string getcity() { return city; } public void setcity(string city) { this.city = city; } public string getdescription() { return description; } public void setdescription(string description) { this.description = description; } public int gethumidity() { return humidity; } public void sethumidity(int humidity) { this.humidity = humidity; } public int getpressure() { return pressure; } public void setpressure(int pressure) { this.pressure = pressure; } public int gettemperature() { return temperature; } public void settemperature(int temperature) { this.temperature = temperature; } public timestamp gettimestamp() { return timestamp; } public void settimestamp(timestamp timestamp) { this.timestamp = timestamp; } public wind getwind() { return wind; } public void setwind(wind wind) { this.wind = wind; } } second entity wind
@entity public class wind { public wind() { this.id = uuid.randomuuid().tostring(); } @id private string id; private float speed; private int degree; public string getid() { return id; } public void setid(string id) { this.id = id; } public float getspeed() { return speed; } public void setspeed(float speed) { this.speed = speed; } public int getdegree() { return degree; } public void setdegree(int degree) { this.degree = degree; } @override public string tostring() { return "wind [speed=" + speed + ", degree=" + degree + "]"; } } here exception stack
2017-04-07 12:30:32.631 error 12282 --- [nio-9000-exec-1] o.a.c.c.c.[.[.[.[dispatcherservlet] : servlet.service() servlet [dispatcherservlet] in context path [/api] threw exception [request processing failed; nested exception org.springframework.orm.jpa.jpaobjectretrievalfailureexception: unable find io.egen.api.entity.wind id 5e022f73-3815-4b9f-84bb-5cad4e173112; nested exception javax.persistence.entitynotfoundexception: unable find io.egen.api.entity.wind id 5e022f73-3815-4b9f-84bb-5cad4e173112] root cause javax.persistence.entitynotfoundexception: unable find io.egen.api.entity.wind id 5e022f73-3815-4b9f-84bb-5cad4e173112 @ org.hibernate.jpa.boot.internal.entitymanagerfactorybuilderimpl$jpaentitynotfounddelegate.handleentitynotfound(entitymanagerfactorybuilderimpl.java:144) ~[hibernate-entitymanager-5.0.12.final.jar:5.0.12.final] @ org.hibernate.event.internal.defaultloadeventlistener.load(defaultloadeventlistener.java:227) ~[hibernate-core-5.0.12.final.jar:5.0.12.final] @ org.hibernate.event.internal.defaultloadeventlistener.proxyorload(defaultloadeventlistener.java:278) ~[hibernate-core-5.0.12.final.jar:5.0.12.final] @ org.hibernate.event.internal.defaultloadeventlistener.doonload(defaultloadeventlistener.java:121) ~[hibernate-core-5.0.12.final.jar:5.0.12.final] @ org.hibernate.event.internal.defaultloadeventlistener.onload(defaultloadeventlistener.java:89) ~[hibernate-core-5.0.12.final.jar:5.0.12.final] @ org.hibernate.internal.sessionimpl.fireload(sessionimpl.java:1129) ~[hibernate-core-5.0.12.final.jar:5.0.12.final] @ org.hibernate.internal.sessionimpl.internalload(sessionimpl.java:1022) ~[hibernate-core-5.0.12.final.jar:5.0.12.final] @ org.hibernate.type.entitytype.resolveidentifier(entitytype.java:639) ~[hibernate-core-5.0.12.final.jar:5.0.12.final] @ org.hibernate.type.entitytype.resolve(entitytype.java:431) ~[hibernate-core-5.0.12.final.jar:5.0.12.final] @ org.hibernate.type.entitytype.replace(entitytype.java:330) ~[hibernate-core-5.0.12.final.jar:5.0.12.final] @ org.hibernate.type.abstracttype.replace(abstracttype.java:147) ~[hibernate-core-5.0.12.final.jar:5.0.12.final] @ org.hibernate.type.typehelper.replace(typehelper.java:211) ~[hibernate-core-5.0.12.final.jar:5.0.12.final] @ org.hibernate.event.internal.defaultmergeeventlistener.copyvalues(defaultmergeeventlistener.java:438) ~[hibernate-core-5.0.12.final.jar:5.0.12.final] @ org.hibernate.event.internal.defaultmergeeventlistener.entityistransient(defaultmergeeventlistener.java:233) ~[hibernate-core-5.0.12.final.jar:5.0.12.final] @ org.hibernate.event.internal.defaultmergeeventlistener.entityisdetached(defaultmergeeventlistener.java:301) ~[hibernate-core-5.0.12.final.jar:5.0.12.final] @ org.hibernate.event.internal.defaultmergeeventlistener.onmerge(defaultmergeeventlistener.java:170) ~[hibernate-core-5.0.12.final.jar:5.0.12.final] @ org.hibernate.event.internal.defaultmergeeventlistener.onmerge(defaultmergeeventlistener.java:69) ~[hibernate-core-5.0.12.final.jar:5.0.12.final] @ org.hibernate.internal.sessionimpl.firemerge(sessionimpl.java:840) ~[hibernate-core-5.0.12.final.jar:5.0.12.final] @ org.hibernate.internal.sessionimpl.merge(sessionimpl.java:822) ~[hibernate-core-5.0.12.final.jar:5.0.12.final] @ org.hibernate.internal.sessionimpl.merge(sessionimpl.java:827) ~[hibernate-core-5.0.12.final.jar:5.0.12.final] @ org.hibernate.jpa.spi.abstractentitymanagerimpl.merge(abstractentitymanagerimpl.java:1161) ~[hibernate-entitymanager-5.0.12.final.jar:5.0.12.final] @ sun.reflect.nativemethodaccessorimpl.invoke0(native method) ~[na:1.8.0_121] @ sun.reflect.nativemethodaccessorimpl.invoke(nativemethodaccessorimpl.java:62) ~[na:1.8.0_121] @ sun.reflect.delegatingmethodaccessorimpl.invoke(delegatingmethodaccessorimpl.java:43) ~[na:1.8.0_121] @ java.lang.reflect.method.invoke(method.java:498) ~[na:1.8.0_121] @ org.springframework.orm.jpa.extendedentitymanagercreator$extendedentitymanagerinvocationhandler.invoke(extendedentitymanagercreator.java:347) ~[spring-orm-4.3.7.release.jar:4.3.7.release] @ com.sun.proxy.$proxy70.merge(unknown source) ~[na:na] @ sun.reflect.nativemethodaccessorimpl.invoke0(native method) ~[na:1.8.0_121] @ sun.reflect.nativemethodaccessorimpl.invoke(nativemethodaccessorimpl.java:62) ~[na:1.8.0_121] @ sun.reflect.delegatingmethodaccessorimpl.invoke(delegatingmethodaccessorimpl.java:43) ~[na:1.8.0_121] @ java.lang.reflect.method.invoke(method.java:498) ~[na:1.8.0_121] @ org.springframework.orm.jpa.sharedentitymanagercreator$sharedentitymanagerinvocationhandler.invoke(sharedentitymanagercreator.java:298) ~[spring-orm-4.3.7.release.jar:4.3.7.release] @ com.sun.proxy.$proxy70.merge(unknown source) ~[na:na] @ org.springframework.data.jpa.repository.support.simplejparepository.save(simplejparepository.java:511) ~[spring-data-jpa-1.11.1.release.jar:na] @ sun.reflect.nativemethodaccessorimpl.invoke0(native method) ~[na:1.8.0_121] @ sun.reflect.nativemethodaccessorimpl.invoke(nativemethodaccessorimpl.java:62) ~[na:1.8.0_121] @ sun.reflect.delegatingmethodaccessorimpl.invoke(delegatingmethodaccessorimpl.java:43) ~[na:1.8.0_121] @ java.lang.reflect.method.invoke(method.java:498) ~[na:1.8.0_121] @ org.springframework.data.repository.core.support.repositoryfactorysupport$queryexecutormethodinterceptor.executemethodon(repositoryfactorysupport.java:504) ~[spring-data-commons-1.13.1.release.jar:na] @ org.springframework.data.repository.core.support.repositoryfactorysupport$queryexecutormethodinterceptor.doinvoke(repositoryfactorysupport.java:489) ~[spring-data-commons-1.13.1.release.jar:na] @ org.springframework.data.repository.core.support.repositoryfactorysupport$queryexecutormethodinterceptor.invoke(repositoryfactorysupport.java:461) ~[spring-data-commons-1.13.1.release.jar:na] @ org.springframework.aop.framework.reflectivemethodinvocation.proceed(reflectivemethodinvocation.java:179) ~[spring-aop-4.3.6.release.jar:4.3.6.release] @ org.springframework.data.projection.defaultmethodinvokingmethodinterceptor.invoke(defaultmethodinvokingmethodinterceptor.java:61) ~[spring-data-commons-1.13.1.release.jar:na] @ org.springframework.aop.framework.reflectivemethodinvocation.proceed(reflectivemethodinvocation.java:179) ~[spring-aop-4.3.6.release.jar:4.3.6.release] @ org.springframework.transaction.interceptor.transactioninterceptor$1.proceedwithinvocation(transactioninterceptor.java:99) ~[spring-tx-4.3.7.release.jar:4.3.7.release] @ org.springframework.transaction.interceptor.transactionaspectsupport.invokewithintransaction(transactionaspectsupport.java:282) ~[spring-tx-4.3.7.release.jar:4.3.7.release] @ org.springframework.transaction.interceptor.transactioninterceptor.invoke(transactioninterceptor.java:96) ~[spring-tx-4.3.7.release.jar:4.3.7.release] @ org.springframework.aop.framework.reflectivemethodinvocation.proceed(reflectivemethodinvocation.java:179) ~[spring-aop-4.3.6.release.jar:4.3.6.release] @ org.springframework.dao.support.persistenceexceptiontranslationinterceptor.invoke(persistenceexceptiontranslationinterceptor.java:136) ~[spring-tx-4.3.7.release.jar:4.3.7.release] @ org.springframework.aop.framework.reflectivemethodinvocation.proceed(reflectivemethodinvocation.java:179) ~[spring-aop-4.3.6.release.jar:4.3.6.release] @ org.springframework.data.jpa.repository.support.crudmethodmetadatapostprocessor$crudmethodmetadatapopulatingmethodinterceptor.invoke(crudmethodmetadatapostprocessor.java:133) ~[spring-data-jpa-1.11.1.release.jar:na] @ org.springframework.aop.framework.reflectivemethodinvocation.proceed(reflectivemethodinvocation.java:179) ~[spring-aop-4.3.6.release.jar:4.3.6.release] @ org.springframework.aop.interceptor.exposeinvocationinterceptor.invoke(exposeinvocationinterceptor.java:92) ~[spring-aop-4.3.6.release.jar:4.3.6.release] @ org.springframework.aop.framework.reflectivemethodinvocation.proceed(reflectivemethodinvocation.java:179) ~[spring-aop-4.3.6.release.jar:4.3.6.release] @ org.springframework.data.repository.core.support.surroundingtransactiondetectormethodinterceptor.invoke(surroundingtransactiondetectormethodinterceptor.java:57) ~[spring-data-commons-1.13.1.release.jar:na] @ org.springframework.aop.framework.reflectivemethodinvocation.proceed(reflectivemethodinvocation.java:179) ~[spring-aop-4.3.6.release.jar:4.3.6.release] @ org.springframework.aop.framework.jdkdynamicaopproxy.invoke(jdkdynamicaopproxy.java:213) ~[spring-aop-4.3.6.release.jar:4.3.6.release] @ com.sun.proxy.$proxy72.save(unknown source) ~[na:na] @ io.egen.api.serviceimpl.weatherserviceimpl.save(weatherserviceimpl.java:20) ~[classes/:na] @ io.egen.api.controller.weathercontroller.save(weathercontroller.java:29) ~[classes/:na] @ sun.reflect.nativemethodaccessorimpl.invoke0(native method) ~[na:1.8.0_121] @ sun.reflect.nativemethodaccessorimpl.invoke(nativemethodaccessorimpl.java:62) ~[na:1.8.0_121] @ sun.reflect.delegatingmethodaccessorimpl.invoke(delegatingmethodaccessorimpl.java:43) ~[na:1.8.0_121] @ java.lang.reflect.method.invoke(method.java:498) ~[na:1.8.0_121] @ org.springframework.web.method.support.invocablehandlermethod.doinvoke(invocablehandlermethod.java:205) ~[spring-web-4.3.6.release.jar:4.3.6.release] @ org.springframework.web.method.support.invocablehandlermethod.invokeforrequest(invocablehandlermethod.java:133) ~[spring-web-4.3.6.release.jar:4.3.6.release] @ org.springframework.web.servlet.mvc.method.annotation.servletinvocablehandlermethod.invokeandhandle(servletinvocablehandlermethod.java:116) ~[spring-webmvc-4.3.6.release.jar:4.3.6.release] @ org.springframework.web.servlet.mvc.method.annotation.requestmappinghandleradapter.invokehandlermethod(requestmappinghandleradapter.java:827) ~[spring-webmvc-4.3.6.release.jar:4.3.6.release] @ org.springframework.web.servlet.mvc.method.annotation.requestmappinghandleradapter.handleinternal(requestmappinghandleradapter.java:738) ~[spring-webmvc-4.3.6.release.jar:4.3.6.release] @ org.springframework.web.servlet.mvc.method.abstracthandlermethodadapter.handle(abstracthandlermethodadapter.java:85) ~[spring-webmvc-4.3.6.release.jar:4.3.6.release] @ org.springframework.web.servlet.dispatcherservlet.dodispatch(dispatcherservlet.java:963) ~[spring-webmvc-4.3.6.release.jar:4.3.6.release] @ org.springframework.web.servlet.dispatcherservlet.doservice(dispatcherservlet.java:897) ~[spring-webmvc-4.3.6.release.jar:4.3.6.release] @ org.springframework.web.servlet.frameworkservlet.processrequest(frameworkservlet.java:970) ~[spring-webmvc-4.3.6.release.jar:4.3.6.release] @ org.springframework.web.servlet.frameworkservlet.dopost(frameworkservlet.java:872) ~[spring-webmvc-4.3.6.release.jar:4.3.6.release] @ javax.servlet.http.httpservlet.service(httpservlet.java:648) ~[tomcat-embed-core-8.5.11.jar:8.5.11] @ org.springframework.web.servlet.frameworkservlet.service(frameworkservlet.java:846) ~[spring-webmvc-4.3.6.release.jar:4.3.6.release] @ javax.servlet.http.httpservlet.service(httpservlet.java:729) ~[tomcat-embed-core-8.5.11.jar:8.5.11] @ org.apache.catalina.core.applicationfilterchain.internaldofilter(applicationfilterchain.java:230) ~[tomcat-embed-core-8.5.11.jar:8.5.11] @ org.apache.catalina.core.applicationfilterchain.dofilter(applicationfilterchain.java:165) ~[tomcat-embed-core-8.5.11.jar:8.5.11] @ org.apache.tomcat.websocket.server.wsfilter.dofilter(wsfilter.java:52) ~[tomcat-embed-websocket-8.5.11.jar:8.5.11] @ org.apache.catalina.core.applicationfilterchain.internaldofilter(applicationfilterchain.java:192) ~[tomcat-embed-core-8.5.11.jar:8.5.11] @ org.apache.catalina.core.applicationfilterchain.dofilter(applicationfilterchain.java:165) ~[tomcat-embed-core-8.5.11.jar:8.5.11] @ org.springframework.web.filter.requestcontextfilter.dofilterinternal(requestcontextfilter.java:99) ~[spring-web-4.3.6.release.jar:4.3.6.release] @ org.springframework.web.filter.onceperrequestfilter.dofilter(onceperrequestfilter.java:107) ~[spring-web-4.3.6.release.jar:4.3.6.release] @ org.apache.catalina.core.applicationfilterchain.internaldofilter(applicationfilterchain.java:192) ~[tomcat-embed-core-8.5.11.jar:8.5.11] @ org.apache.catalina.core.applicationfilterchain.dofilter(applicationfilterchain.java:165) ~[tomcat-embed-core-8.5.11.jar:8.5.11] @ org.springframework.web.filter.httpputformcontentfilter.dofilterinternal(httpputformcontentfilter.java:105) ~[spring-web-4.3.6.release.jar:4.3.6.release] @ org.springframework.web.filter.onceperrequestfilter.dofilter(onceperrequestfilter.java:107) ~[spring-web-4.3.6.release.jar:4.3.6.release] @ org.apache.catalina.core.applicationfilterchain.internaldofilter(applicationfilterchain.java:192) ~[tomcat-embed-core-8.5.11.jar:8.5.11] @ org.apache.catalina.core.applicationfilterchain.dofilter(applicationfilterchain.java:165) ~[tomcat-embed-core-8.5.11.jar:8.5.11] @ org.springframework.web.filter.hiddenhttpmethodfilter.dofilterinternal(hiddenhttpmethodfilter.java:81) ~[spring-web-4.3.6.release.jar:4.3.6.release] @ org.springframework.web.filter.onceperrequestfilter.dofilter(onceperrequestfilter.java:107) ~[spring-web-4.3.6.release.jar:4.3.6.release] @ org.apache.catalina.core.applicationfilterchain.internaldofilter(applicationfilterchain.java:192) ~[tomcat-embed-core-8.5.11.jar:8.5.11] @ org.apache.catalina.core.applicationfilterchain.dofilter(applicationfilterchain.java:165) ~[tomcat-embed-core-8.5.11.jar:8.5.11] @ org.springframework.web.filter.characterencodingfilter.dofilterinternal(characterencodingfilter.java:197) ~[spring-web-4.3.6.release.jar:4.3.6.release] @ org.springframework.web.filter.onceperrequestfilter.dofilter(onceperrequestfilter.java:107) ~[spring-web-4.3.6.release.jar:4.3.6.release] @ org.apache.catalina.core.applicationfilterchain.internaldofilter(applicationfilterchain.java:192) ~[tomcat-embed-core-8.5.11.jar:8.5.11] @ org.apache.catalina.core.applicationfilterchain.dofilter(applicationfilterchain.java:165) ~[tomcat-embed-core-8.5.11.jar:8.5.11] @ org.apache.catalina.core.standardwrappervalve.invoke(standardwrappervalve.java:198) ~[tomcat-embed-core-8.5.11.jar:8.5.11] @ org.apache.catalina.core.standardcontextvalve.invoke(standardcontextvalve.java:96) [tomcat-embed-core-8.5.11.jar:8.5.11] @ org.apache.catalina.authenticator.authenticatorbase.invoke(authenticatorbase.java:474) [tomcat-embed-core-8.5.11.jar:8.5.11] @ org.apache.catalina.core.standardhostvalve.invoke(standardhostvalve.java:140) [tomcat-embed-core-8.5.11.jar:8.5.11] @ org.apache.catalina.valves.errorreportvalve.invoke(errorreportvalve.java:79) [tomcat-embed-core-8.5.11.jar:8.5.11] @ org.apache.catalina.core.standardenginevalve.invoke(standardenginevalve.java:87) [tomcat-embed-core-8.5.11.jar:8.5.11] @ org.apache.catalina.connector.coyoteadapter.service(coyoteadapter.java:349) [tomcat-embed-core-8.5.11.jar:8.5.11] @ org.apache.coyote.http11.http11processor.service(http11processor.java:783) [tomcat-embed-core-8.5.11.jar:8.5.11] @ org.apache.coyote.abstractprocessorlight.process(abstractprocessorlight.java:66) [tomcat-embed-core-8.5.11.jar:8.5.11] @ org.apache.coyote.abstractprotocol$connectionhandler.process(abstractprotocol.java:798) [tomcat-embed-core-8.5.11.jar:8.5.11] @ org.apache.tomcat.util.net.nioendpoint$socketprocessor.dorun(nioendpoint.java:1434) [tomcat-embed-core-8.5.11.jar:8.5.11] @ org.apache.tomcat.util.net.socketprocessorbase.run(socketprocessorbase.java:49) [tomcat-embed-core-8.5.11.jar:8.5.11] @ java.util.concurrent.threadpoolexecutor.runworker(threadpoolexecutor.java:1142) [na:1.8.0_121] @ java.util.concurrent.threadpoolexecutor$worker.run(threadpoolexecutor.java:617) [na:1.8.0_121] @ org.apache.tomcat.util.threads.taskthread$wrappingrunnable.run(taskthread.java:61) [tomcat-embed-core-8.5.11.jar:8.5.11] @ java.lang.thread.run(thread.java:745) [na:1.8.0_121] i have make sure json first wind data should added to wind table , using id created weathersensor should updated remaining values. kindly if missing annotation or approach.
edit:-
here controller
@restcontroller @crossorigin public class weathercontroller { private weatherservice weatherservice; public weathercontroller(weatherservice weatherservice) { this.weatherservice = weatherservice; } // @requestmapping(method = requestmethod.get) // public string home() { // return "welcome!"; // } @requestmapping(method = requestmethod.post, value = "save") public weathersensor save(@requestbody weathersensor weathersensor) { system.out.println(weathersensor.tostring()); weatherservice.save(weathersensor); return weathersensor; }} and here application.properties
server.port=9000 server.context-path=/api #database setup spring.datasource.url=jdbc:mysql://localhost:3306/clearsky?usessl=false spring.datasource.username=root spring.datasource.password=root spring.datasource.driver-class-name=com.mysql.jdbc.driver spring.jpa.hibernate.ddl-auto=create-drop spring.jpa.show-sql=true and here endpoint iam hitting:-
http://localhost:9000/api/save kindly help!
the problem generated new uuid identifier in entities.
the entitymanager merge magic detached objects.
merge creates new instance of entity, copies state supplied entity, , makes new copy managed.
but new instance has new different id means can't found original id.
to solve generate uuid outside of entity / constructor.
Comments
Post a Comment