2015-12-23 34 views
0

我有以下的JPA實體如何設置外鍵JPA + REST

my JPA entity :: BookForUser 
@Id 
private int id; 

@ManyToOne 
@JoinColumn(name="e_mail") 
private User user;// I do not want User object in the table, 
//I want a string e_mail to be foreign key in my entity table 

var booking = { e_mail: localStorage.getItem("email"),...

以上是我的JSON代碼填寫從JS bookForUser對象。我使用JAVA + REST作爲後端。但成功路由REST調用 後,我得到一個異常

重度:Servlet.service()進行的servlet [com.RRS.config.RRSConfig]在上下文中與路徑[/ RRS_2]拋出異常org.glassfish .jersey.server.ContainerException:com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException:無法識別的字段 「的E_mail」 在[來源:org.glassfish.jersey.me[email protected]178546ce;行:1,柱:12](通過參考鏈:com.RRS.bean.Reservation [ 「的E_mail」])]與根源com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException:無法識別的字段 「的E_mail」(類clasName ),未標記在[來源爲可忽略:org.glassfish.jersey.me[email protected]178546ce; line:1,column:12] at com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException.from(UnrecognizedPropertyException.java:51)at com.fasterxml.jackson.databind.DeserializationContext.reportUnknownProperty(DeserializationContext.java:839) at com.fasterxml.jackson.databind.deser.std.StdDeserializer.handleUnknownProperty(StdDeserializer.java:1045) at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.handleUnknownProperty(BeanDeserializerBase.java:1352) at com.fasterxml。 jackson.databind.deser.BeanDeserializerBase.handleUnknownVanilla(BeanDeserializerBase.java:1330) at com.fasterxml.jackson.databind.deser.BeanDeserializer.vanillaDeserialize(BeanDeserializer.java:264) at com.fasterxml.jackson.databind.deser。 BeanDeserializer.deserialize(BeanDeserializer.java:125) 在com.fasterxml.jac kson.databind.ObjectReader._bind(ObjectReader.java:1470) at com.fasterxml.jackson.databind.ObjectReader.readValue(ObjectReader.java:912) at com.fasterxml.jackson.jaxrs.base.ProviderBase.readFrom( ProviderBase.java:811) 在org.glassfish.jersey.message.internal.ReaderInterceptorExecutor $ TerminalReaderInterceptor.invokeReadFrom(ReaderInterceptorExecutor.java:256) 在org.glassfish.jersey.message.internal.ReaderInterceptorExecutor $ TerminalReaderInterceptor.aroundReadFrom(ReaderInterceptorExecutor。的java:235) 在org.glassfish.jersey.message.internal.ReaderInterceptorExecutor.proceed(ReaderInterceptorExecutor.java:155) 在org.glassfish.jersey.server.internal.MappableExceptionWrapperInterceptor.aroundReadFrom(MappableExceptionWrapperInterceptor.java:74) 在org.glassfish .jersey.message.internal.ReaderInterceptorExecutor.proceed(ReaderInterceptorExecutor.java:155) at org.glassfish.jersey.message.internal.MessageBodyFactory.readFrom(MessageBodyFactory.java:1085) at org.glassfish.jersey.message.internal .InboundMessageContext.readEntity(InboundMessageContext.java:874) 在org.glassfish.jersey.server.ContainerRequest.readEntity(ContainerRequest.java:271) 在org.glassfish.jersey.server.internal.inject.EntityParamValueFactoryProvider $ EntityValueFactory.provide (EntityParamValueFactoryProvider.java:96) 在org.glassfish.jersey.server.spi.internal.ParamValueFactoryWithSource.provide(ParamValueFactoryWithSource.java:71) 在org.glassfish.jersey.server.spi.internal.ParameterValueHelper.getParameterValues(ParameterValueHelper .java:94) at或g.glassfish.jersey.server.model.internal.JavaResourceMethodDispatcherProvider $ AbstractMethodParamInvoker.getParamValues(JavaResourceMethodDispatcherProvider.java:127) 在org.glassfish.jersey.server.model.internal.JavaResourceMethodDispatcherProvider $ TypeOutInvoker.doDispatch(JavaResourceMethodDispatcherProvider.java:205) at org。glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher.dispatch(AbstractJavaResourceMethodDispatcher.java:99) at org.glassfish.jersey.server.model.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:389) at org.glassfish.jersey。 server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:347) at org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:102) at org.glassfish.jersey.server.ServerRuntime $ 2.run (ServerRuntime.java:326) at org.glassfish.jersey.internal.Errors $ 1.call(Errors.java:271) at org.glassfish.jersey.internal.Errors $ 1.call(Errors.java:267) org.glassfish.jersey.internal.Errors.process(Errors.java:315) at org.glassfish.jersey.internal.Errors.proce ss(Errors.java:297) at org.glassfish.jersey.internal.Errors.process(Errors.java:267) at org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:317) at org.glassfish.jersey.server.ServerRuntime.process(ServerRuntime.java:305) at org.glassfish.jersey.server.ApplicationHandler.handle(ApplicationHandler.java:1154) at org.glassfish.jersey.servlet。 WebComponent.serviceImpl(WebComponent.java:471) at org.glassfish.jersey.servlet.WebComponent.service(WebComponent.java:425) at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:383) at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:336) at org.glassfish.jersey.servlet.ServletCon tainer.service(ServletContainer.java:223) 在org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303) 在org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) 在org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) 在org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) 在org.apache.catalina。 core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java: 122) at org.apache.catalina.authenticator.AuthenticatorBase.inv OKE(AuthenticatorBase.java:501) 在org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171) 在org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103) 在org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:950) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116) at org.apache.catalina.connector.CoyoteAdapter。服務(CoyoteAdapter.java:408) 在org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1070) 在org.apache.coyote.AbstractProtocol $ AbstractConnectionHandler.process(AbstractProtocol.java:611) 在org.apache.tomcat.util.net.JIoEndpoint $ SocketProcessor.run(JIoEndpoint.java:314) 在java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:615) at org.apache.tomcat.util.threads。 TaskThread $ WrappingRunnable.run(TaskThread.java:61) 在java.lang.Thread.run(Thread.java:745)

的e_mail是實體用戶的主鍵。表名與類名用戶相同 由於字符串電子郵件不是保存主鍵的好方法,因此我計劃將其更改爲int userId。但對我來說問題依然存在。

我要的是

class User : primary key=email, some other params 
class BookForUser : primary key = id, some other params, foreign key = email 

我已經明白是BookForUser是不是有用戶的一個完整的對象了。我不想要它。

這種聲明外鍵是否正確? (我想要1個用戶=許多預訂)

我該如何將這個電子郵件屬性傳遞給我的Java代碼?

+0

電子郵件ID可能無法有效保留外鍵引用。很好地表達你的問題。 – vels4j

+1

用戶類在哪裏?什麼是「繼JPA實體」類名?電子郵件不是用戶的ID嗎?例外+ STACKTRACE在哪裏?如上所述,詳細說明你的問題,因爲你發佈的內容難以理解 –

+0

我想你會得到一個JSON到Java的映射錯誤。如果預訂是您在帖子中提到的實體,那麼您的json應該像'booking = {e_mail:localStorage.getItem(「email」),...},... \t}' – nickmesi

回答

0

首先,使用諸如電子郵件地址這樣的字符串作爲主要字符串不是一個好主意。你可以得到的是:

使用戶的主鍵爲一個整數,並有一個唯一的電子郵件字段。這是允許你有整數主鍵(更簡單的使用和參考),並避免重複的電子郵件地址。

另一種方式可能是擁有一個類用戶和一個類只是爲書籍。 這些會在目前不同,但它們之間沒有任何關聯。然後,您將有一個三等功,將使用自己的主鍵將它們連接在UserReservedBooks

例子:Class UserReservedBooks {idReservation(你的這個類的主鍵),idUser - >用戶的主鍵,idBook - >的爲書主鍵,...專用於保留其他參數,例如日期它被保留,等)

的優點這種方法是:

  1. 1用戶可以擁有多個預約
  2. 它可以讓你(如果你願意)看到哪些用戶保留了特定的書籍
  3. 你也可以讓用戶一次預訂多本書籍。
  4. 一本書可以由多人保留。
  5. 您的用戶將擁有唯一的電子郵件地址
  6. 您可以避免重複圖書。