2015-12-23 2 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 код для заполнения объекта bookForUser от JS. Я использую JAVA + REST для задней части. но после того, как успешно маршрутизации вызова REST я получаю исключение

СИЛЬНЫЙ: Servlet.service() для сервлета [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; строка: 1, столбец: 12] в com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException.from (UnrecognizedPropertyException.java:51) в com.fasterxml.jackson.databind.DeserializationContext.reportUnknownProperty (DeserializationContext.java:839) at com.fasterxml.jackson.databind.deser.std.StdDeserializer.handleUnknownProperty (StdDeserializer.java:1045) на com.fasterxml.jackson.databind.deser.BeanDeserializerBase.handleUnknownProperty (BeanDeserializerBase.java:1352) на 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) at 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) на или 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) на 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) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter (ApplicationFilterChain.java:303) at 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) на org.apache.catalina.core.StandardWrapperValve.invoke (StandardWrapperValve.java:220) на org.apache.catalina.core.StandardContextValve.invoke (StandardContextValve.java: 122) at org.apache.catalina.authenticator.AuthenticatorBase.inv окэ (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) по адресу org.apache.catalina.core.StandardEngineValve.invoke (StandardEngineValve.java:116) at org.apache.catalina.connector.CoyoteAdapter. службы (CoyoteAdapter.java:408) at org.apache.coyote.http11.AbstractHttp11Processor.process (AbstractHttp11Processor.java:1070) at org.apache.coyote.AbstractProtocol $ AbstractConnectionHandler.process (AbstractProtocol.java:611) at org.apache.tomcat.util.net.JIoEndpoint $ SocketProcessor.run (JIoEndpoint.java:314) на java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1145) на java.util.concurrent.ThreadPoolExecutor $ Worker.run (ThreadPoolExecutor.java:615) на org.apache.tomcat.util.threads. TaskThread $ WrappingRunnable.run (TaskThread.java:61) в java.lang.Thread.run (Thread.java:745)

e_mail является первичным ключом для объекта пользователя. Имя таблицы совпадает с именем класса user Поскольку электронная почта String не является хорошим способом сохранить первичный ключ, я планирую изменить его на 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

Идентификатор электронной почты не может эффективно сохранять ссылку на внешний ключ. Хорошо обдумайте свой вопрос. – vels4j

+1

Где находится пользовательский класс? Что такое имя класса после имени JPA? Является ли электронная почта не идентификатором пользователя? Где исключение + 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. Вы можете избежать дублирования книг.
Смежные вопросы