2015-12-23 36 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. 您可以避免重复图书。