首页 文章

如何在JPA REST中设置外键

提问于
浏览
0

我有以下JPA实体

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调用后,我收到异常

SEVERE:Servlet [com.RRS.config.RRSConfig]的Servlet.service()在路径[/ RRS_2]的上下文中引发异常org.glassfish.jersey.server.ContainerException:com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException :无法识别的字段“e_mail”在[来源:org.glassfish.jersey.message.internal.ReaderInterceptorExecutor$UnCloseableInputStream@178546ce; line:1,column:12](通过引用链:com.RRS.bean.Reservation [“e_mail”])]与根本原因com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException:无法识别的字段“e_mail”(类clasName ),未在[来源:org.glassfish.jersey.message.internal.ReaderInterceptorExecutor$UnCloseableInputStream@178546ce;中标记为可忽略;行:1,柱:12]在com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException.from(UnrecognizedPropertyException.java:51)在com.fasterxml.jackson.databind.DeserializationContext.reportUnknownProperty(DeserializationContext.java:839)在玉米.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)位于com.fasterxml.jackson.databind.deser.BeanDeserializer.vanillaDeserialize(BeanDeserializer.java:264)的com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer) .java:125)com.fasterxml.jackson.databind.ObjectReader._bind(ObjectReader.java:1470)位于com.fasterxml.jackson的com.fasterxml.jackson.databind.ObjectReader.readValue(ObjectReader.java:912) . jaxrs.base.ProviderBase.readFrom(临viderBase.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)在org.glassfish.jersey.message.internal.MessageBodyFactory.readFrom(MessageBodyFactory.java:1085)在org.glassfish.jersey.message.internal.InboundMessageContext.readEntity (InboundMessageContext.java:874)位于org.glassfish.jersey.server.internal.inj的org.glassfish.jersey.server.ContainerRequest.readEntity(ContainerRequest.java:271)位于org.glassfish.jersey.server.spi.internal的org.glassfish.jersey.server.spi.internal.ParamValueFactoryWithSource.provide(ParamValueFactoryWithSource.java:71)的ect.EntityParamValueFactoryProvider $ EntityValueFactory.provide(EntityParamValueFactoryProvider.java:96) . org.glassfish.jersey.server.model.internal.JavaResourceMethodDispatcherProvider $ AbstractRethource.MerodMisodMisod.DatpatcherProvider $,来自org.glassfish.jersey.server.model.internal.JavaResourceMethodDispatcherProvider $的ParameterValueHelper.getParameterValues(ParameterValueHelper.java:94) TypeOutInvoker.doDispatch(JavaResourceMethodDispatcherProvider.java:205)位于org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher.dispatch(AbstractJavaResourceMethodDispatcher.java:99)org.glassfish.jersey.server.model.ResourceMethodInvoker.invoke(ResourceMethodInvoker . java:389)org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:347)at o rg.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:102)维持在org.glassfish.jersey.internal.Errors org.glassfish.jersey.server.ServerRuntime $ 2.run(ServerRuntime.java:326) $ 1.call(Errors.java:271)org.glassfish.jersey.internal.Errors $ 1.call(Errors.java:267)org.glassfish.jersey.internal.Errors.process(Errors.java:315)at at org.glassfish.jersey.internal.Errors.process(Errors.java:297)org.glassfish.jersey.internal.Errors.process(Errors.java:267)org.glassfish.jersey.process.internal.RequestScope . run orScope(RequestScope.java:317)org.glassfish.jersey.server.ServerRuntime.process(ServerRuntime.java:305)org.glassfish.jersey.server.ApplicationHandler.handle(ApplicationHandler.java:1154)atg.glassfish .jersey.servlet.WebComponent.serviceImpl(WebComponent.java:471)在org.glassfish.jersey.servlet.WebComponent.service(WebComponent.java:425)在org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java :383)在Org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:336)位于org.apache.catalina.core.ApplicationFilterChain.internalDoFilter的org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:223) ApplicationFilterChain.java:303)org.apache上的org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)中的.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java) :220)org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122)org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:501)org.apache.catalina.core . org.apache.catalina.valve上的StandardHostValve.invoke(StandardHostValve.java:171)位于org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:950)的s.ErrorReportValve.invoke(ErrorReportValve.java:103)org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116) org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1070)org.apache.coyote.AbstractProtocol $ AbstractConnectionHandler.process (AbstractProtocol.java:611)在java的java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)的org.apache.tomcat.util.net.JIoEndpoint $ SocketProcessor.run(JIoEndpoint.java:314) . 在java.lang.Thread.run(Thread . Java的:745)

e_mail是实体用户的主键 . 表名与类名用户相同As String电子邮件不是保存主键的好方法,我打算将其更改为int userId . 但问题对我来说仍然是一样的 .

我想要的是什么

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

我所理解的是BookForUser没有完整的User对象 . 我不想要它 .

这种声明外键是否正确? (我想要1个用户=很多预订)

如何将此电子邮件属性传递给我的Java代码?

1 回答

  • 0

    首先,使用诸如电子邮件地址之类的字符串作为主要信息并不是一个好主意 . 你可以拥有的是:

    使用户的主键为整数,并为电子邮件设置一个唯一的字段 . 这允许您拥有整数主键(更易于使用和引用)并避免重复的电子邮件地址 .

    另一种方法可能是 User 有一个类,而 Books 只有一个类 . 目前这些不同,它们之间没有联系 . 然后,您将有一个第三个类,它将使用 UserReservedBooks 中的主键连接它们

    示例: Class UserReservedBooks { idReservation (此类的主键), idUser - >用户的主键, idBook - >图书的主键,...保留特定的其他参数,例如保留日期等 . )

    这种方法的优点是:

    • 1用户可以进行多次预约

    • 它允许您(如果您愿意)查看哪些用户保留了特定图书

    • 您还可以让用户一次预订多本图书 .

    • 这本书可以由多人保留 .

    • 您的用户将拥有唯一的电子邮件地址

    • 您可以避免书籍的重复 .

相关问题