Springboot JPA объединяет столбцы как объекты - PullRequest
0 голосов
/ 23 октября 2019

У меня есть два домена:

GameMode и Game.

Столбцом игрового режима является game_id, который является внешним ключом для Game.

    @Entity
@Table(name = "game")
@TypeDef(name = "jsonb", typeClass = JsonBinaryType.class)
public class Game extends BaseTable implements Serializable {

    // PROPERTIES
    @Id
   @GeneratedValue()
   @Column(name = "id")
   private UUID id;

   ...

Я хотел бы получить объект Game внутри GameMode следующим образом:

@Entity
@Table(name = "game_mode")
@TypeDef(name = "jsonb", typeClass = JsonBinaryType.class)
public class GameMode extends BaseTable implements Serializable {

    // PROPERTIES
    @Id
   @GeneratedValue()
   @Column(name = "id")
   private UUID id;

   @JoinColumn(name="id")
   @Column(name = "game_id")
   private Game game;

   ...

Но когда я пытаюсь сделать этот вызов:

GameMode gameMode = gameModeRepository.findByGameAndDescription(game, reqBody.getDescription());

(где игра типа Game)

Я получаю эту ошибку:

org.springframework.dao.InvalidDataAccessResourceUsageException: не удалось извлечь ResultSet;SQL [н / п];вложенным исключением является org.hibernate.exception.SQLGrammarException: не удалось извлечь ResultSet \ r \ n \ tat org.springframework.orm.jpa.vendor.HibernateJpaDialect.convertHibernateAccessException (HibernateJpaDialect.java:280) \ r \ ning или.orm.jpa.vendor.HibernateJpaDialect.translateExceptionIfPossible (HibernateJpaDialect.java:254) \ r \ n \ tat org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.translateExceptionIfPossible \70.dao.support.ChainedPersistenceExceptionTranslator.translateExceptionIfPossible (ChainedPersistenceExceptionTranslator.java:61) \ г \ п \ тат org.springframework.dao.support.DataAccessUtils.translateIfNecessary (DataAccessUtils.java:242) \ г \ п \ тат org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke (PersistenceExceptionTranslationInterceptor.java:153) \ r \ n \ tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed (ReflectiveMethodInvocation.j \ n:6:18)на org.springframework.data.jpa.repository.support.CrudMethodMetadataPostProcessor $ CrudMethodMetadataPopulatingMethodInterceptor.invoke (CrudMethodMetadataPostProcessor.java:149) \ г \ п \ тат org.springframework.aop.framework.ReflectiveMethodInvocation.proceed (ReflectiveMethodInvocation.java:186) \r \ n \ tat org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke (ExposeInvocationInterceptor.java:93) \ r \ n \ tat org.springframework.aop.framework.ReflectiveMethodInvocation.procej \ отражающий \ путь_рекламыn \ tat org.springframework.aop.framework.JdkDynamicAopProxy.invoke (JdkDynamicAopProxy.java:212) \ r \ n \ tat com.sun.proxy. $ Proxy125.findByGameAndDescription (Неизвестный источник) \ r \ n \ tat comebat.core.controller.GameModeController.addGameMode (GameModeController.java:46) \ r \ n \ tat java.base / jdk.internal.reflect.NativeMethodAccessorImpl.invoke0 (собственный метод) \ r \ n \ tat java.base / jinternal.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:62) \ r \ n \ tat java.base / jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43) \ r \ n \ tat java.base / java.lang.reflect.Method.invoke (Method.java:566) \ r \ n \ tat org. springframework.web.method.support.InvocableHandlerMethod.doInvoke (InvocableHandlerMethod.java:190) \ r \ n \ tat org.springframework.web.method.support. org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle (ServletInvocableHandlerMethod.java:106) \ r \ n \ tat org.springframework.hoandMackerJava: 888) \ r \ n \ tat org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal (RequestMappingHandlerAdapter.java:793) \ r \ n \ tat org.springframework.web.servlet.mc. method.AbstractHandlerMethodAdapter.handle (AbstractHandlerMethodAdapter.java:87) \ r \ n \ tat org.springframework.web.servlet. DispatcherServlet.doDispatch (DispatcherServlet.java:1040) \ r \ n \ tat org.springframework.web.servlet.DispatcherServlet.doService (DispatcherServlet.java:943) \ r \ n \ tat org.springframeworker.rab. processRequest (FrameworkServlet.java:1006) \ r \ n \ tat org.springframework.web.servlet.FrameworkServlet.doPost (FrameworkServlet.java:909) \ r \ n \ tatjavax.servlet.http.HttpServlet.service (HttpServlet.java:660) \ r \ n \ tat org.springframework.web.servlet.FrameworkServlet.service (FrameworkServlet.java:883) \ r \ n \ tat javax.servlet. http.HttpServlet.service (HttpServlet.java:741) \ r \ n \ tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter (ApplicationFilterChain.java:231) \ r \ n \ tat org.apache.catalina.core. ApplicationFilterChain.doFilter (ApplicationFilterChain.java:166) \ r \ n \ tat org.apache.tomcat.websocket.server.WsFilter.doFilter (WsFilter.java:53) \ r \ n \ tat org.apache.catalina.core. ApplicationFilterChain.internalDoFilter (ApplicationFilterChain.java:193) \ r \ n \ tat org.apache.catalina.core.ApplicationFilterChain.doFilter (ApplicationFilterChain.java:166) \ r \ n \ tat org.springframework.Filter $. VirtualFilterChain.doFilter (FilterChainProxy.java:320) \ r \ n \ tat org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke (FilterSecurityInterceptor.java:126) \ r \ n \ tat org.ssecraf. web.access.intercept.FilterSecurityInterceptor.doFilter (FilterSecurityInterceptor.java:90) \ r \ n \ tat org.springframework.security.web.FilterChainProxy $ VirtualFilterChain.doFilter (FilterChainProxy.java:33ra) \ r \ .secra илиweb.access.ExceptionTranslationFilter.doFilter (ExceptionTranslationFilter.java:118) \ r \ n \ tat org.springframework.security.web.FilterChainProxy $ VirtualFilterChain.doFilter (FilterChainProxy.java:33ra) \ r. security.web.session.SessionManagementFilter.doFilter (SessionManagementFilter.java:137) \ r \ n \ tat org.springframework.security.web.FilterChainProxy $ VirtualFilterChain.doFilter (FilterChainProxy.java: \ org. r.. springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter (AnonymousAuthenticationFilter.java:111) \ r \ n \ tat org.springframework.security.web.FilterChainProxy $ VirtualFilterChain.doFilter \ tatjj: \ java.ph:org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter (SecurityContextHolderAwareRequestFilter.java:158) \ r \ n \ tat org.springframework.security.web.FilterChainProxy $ VirtualFilterChain.doFilter (FilterChainProxy.java:334) \ r \ n \ tat org.sprvedrequ.web. RequestCacheAwareFilter.doFilter (RequestCacheAwareFilter.java:63) \ r \ n \ tat org.springframework.security.web.FilterChainProxy $ VirtualFilterChain.doFilter (FilterChainProxy.java:334) \ r \ n \ tat orguth.sec.f. server.resource.web.BearerTokenAuthenticationFilter.doFilterInternal (BearerTokenAuthenticationFilter.java:130) \ r \ n \ tat org.springframework.web.filter.OncePerRequestFilter.doFilter (OncePerRequest.spr. security.web.FilterChainProxy $ VirtualFilterChain.doFilter (FilterChainProxy.java:334) \ r \ n \ tat org.springframework.security.web.authentication.logout.LogoutFilter.doFilter (LogoutFilter.java:11 \ \ n)org.springframework.security.web.FilterChainProxy $ VirtualFilterChain.doFilter (FilterChainProxy.java:334) \ r \ n \ tat org.springframework.security.web.csrf.CsrfFilter.doFilterInternal (CsrfFilter.java:117) \ r \ n \ tat org.springframework.web.filter.OncePerRequestFilter.doFilter (OncePerRequestFilter \ n \ or \ r. springframework.security.web.FilterChainProxy $ VirtualFilterChain.doFilter (FilterChainProxy.java:334) \ r \ n \ tat org.springframework.security.web.header.HeaderWriterFilter.doHeadersAfter (HeaderWrit \ neril):org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal (HeaderWriterFilter.java:77) \ r \ n \ tat org.springframework.web.filter.OncePerRequestFilter.doFilter (OncePerRejestF):org.springframework.security.web.FilterChainProxy $ VirtualFilterChain.doFilter (FilterChainProxy.java:334) \ r \ n \ tat org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilers: nFF\ татorg.springframework.security.web.FilterChainProxy $ VirtualFilterChain.doFilter (FilterChainProxy.java:334) \ r \ n \ tat org.springframework.security.web.context.request.async.WebAsyncManagerInynFilterFilterFilterInterFire\ r \ n \ tat org.springframework.web.filter.OncePerRequestFilter.doFilter (OncePerRequestFilter.java:119) \ r \ n \ tat org.springframework.security.web.FilterChainProxy $ VirtualFilterChain.hain.hain.hain:\ r \ n \ tat org.springframework.security.web.FilterChainProxy.doFilterInternal (FilterChainProxy.java:215) \ r \ n \ tat org.springframework.security.web.FilterChainProxy.doFilter (FilterChainProxy.j:\ n \ tat org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate (DelegatingFilterProxy.java:358) \ r \ n \ tat org.springframework.web.filter.DelegatingFilterProxy.doFilter (DelegatingFilter \ n \ r) .jj\ tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter (ApplicationFilterChain.java:193) \ r \ n \ tat org.apache.catalina.core.ApplicationFilterChain.doFilter (ApplicationFilterChain.java:166) \ r \ n \ tat org.springframework.web.filter.RequestContextFilter.doFilterInternal (RequestContextFilter.java:100) \ r \ pring илиweb.filter.OncePerRequestFilter.doFilter (OncePerRequestFilter.java:119) \ r \ n \ tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter (ApplicationFilterChain.java:193) \ r \ n \ tatal.ap. core.ApplicationFilterChain.doFilter (ApplicationFilterChain.java:166) \ r \ n \ tat org.springframework.web.filter.FormContentFilter.doFilterInternal (FormContentFilter.java:93) \ r \ n \ tat org.springfilmework .weOncePerRequestFilter.doFilter (OncePerRequestFilter.java:119) \ r \ n \ tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter (ApplicationFilterChain.java:193) \ r \ n \ tat org.apache.hain. doFilter (ApplicationFilterChain.java:166) \ r \ n \ tat org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal (CharacterEncodingFilter.java:201)\r\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter (OncePerRequestFilter.java:119) \ r \ n \ tat org.apache.catalina.core.ApplicationFilterChain.internalFilterJava: 193) \ r \ n \ tat org.apache.catalina.core.ApplicationFilterChain.doFilter (ApplicationFilterChain.java:166) \ r \ n \ tat org.apache.catalina.core.StandardWrapperValve.invoke (StandardWrapperValve.java:202) \ r \ n \ tat org.apache.catalina.core.StandardContextValve.invoke (StandardContextValve.java:96) \ r \ n \ tat org.apache.catalina.authenticator.AuthenticatorBase.invoke (AuthenticatorBase.java:526)\ r \ n \ tat org.apache.catalina.core.StandardHostValve.invoke (StandardHostValve.java:139) \ r \ n \ tat org.apache.catalina.valves.ErrorReportValve.invoke (ErrorReportValve.java:92) \ r\ n \ tat org.apache.catalina.core.StandardEngineValve.invoke (StandardEngineValve.java:74) \ r \ n \ tat org.apache.catalina.connector.CoyoteAdapter.service (CoyoteAdapter.java:343) \ r \ n\ tat org.apache.coyote.http11.Http11Processor.service (Http11Processor.java:408)\r\n\tat org.apache.coyote.AbstractProcessorLight.process (AbstractProcessorLight.java:66) \ r \ n \ tat org.apache.coyote.AbstractProtocol $ ConnectionHandler.process (AbstractProtocol.java:861) \ r \ n \ tat org.apache.tomcat.util.net.NioEndpoint $ SocketProcessor.doRun (NioEndpoint.java:1579) \ r \ n \ tat org.apache.tomcat.util.net.SocketProcessorBase.run (SocketProcessorBase.java:49)\r\n\tat java.base / java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1128) \ r \ n \ tat java.base / java.util.concurrent.Thread $oececWorker.run (ThreadPoolExecutor.java:628) \ r \ n \ tat org.apache.tomcat.util.threads.TaskThread $ WrappingRunnable.run (TaskThread.java:61) \ r \ n \ tat java.base / java. lang.Thread.run (Thread.java:834) \ r \ nПричинено: org.hibernate.exception.SQLGrammarException: не удалось извлечь ResultSet \ r \ n \ tatorg.hibernate.exception.internal.SQLStateConversionDelegate.convert (SQLStateConversionDelegate.java:103) \ r \ n \ tat org.hibernate.exception.internal.StandardSQLExceptionConverter.convert (StandardSQLExceptionConverter.java:42 \. hibernate.engine.jdbc.spi.SqlExceptionHelper.convert (SqlExceptionHelper.java:113) \ r \ n \ tat org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert (SqlExceptionHelper.java:99) \ r \ n tatorg.hibernate.engine.jdbc.internal.ResultSetReturnImpl.extract (ResultSetReturnImpl.java:67) \ r \ n \ tat org.hibernate.loader.Loader.getResultSet (Loader.java:2287) \ r \ n \ tat org. hibernate.loader.Loader.executeQueryStatement (Loader.java:2045) \ r \ n \ tat org.hibernate.loader.Loader.executeQueryStatement (Loader.java:2007) \ r \ n \ tat org.hibernate.loader.Loader. doQuery (Loader.java:953) \ r \ n \ tat org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections (Loader.java:354) \ r \ n \ tat org.hibernate.loader.Loader.doList (Loader.java:2810) \ r \ n \ tat org.hibernate.loader.Loader.doList (Loader.java:2792) \ r \ n \ tat org.hibernate.loader.Loader.listIgnoreQueryCache (Loader.java:2624) \ r \ n \ tat org.hibernate.loader.Loader.list (Loader.java:2619) \ r \ n\ tat org.hibernate.loader.hql.QueryLoader.list (QueryLoader.java:506) \ r \ n \ tat org.hibernate.hql.internal.ast.QueryTranslatorImpl.list (QueryTranslatorImpl.java:396) \ r \ n\ tat org.hibernate.engine.query.spi.HQLQueryPlan.performList (HQLQueryPlan.java:219) \ r \ n \ tat org.hibernate.internal.SessionImpl.list (SessionImpl.java:1410) \ r \ n \ tatorg.hibernate.query.internal.AbstractProducedQuery.doList (AbstractProducedQuery.java:1558) \ r \ n \ tat org.hibernate.query.internal.AbstractProducedQuery.list (AbstractProducedQuery.java:1526) \ r \ n \ tat org. hibernate. org.springframework.data.jpa.repository.query.JpaQueryExecution $ SingleEntityExecution. doExecute (JpaQueryExecution.java:196) \ r \ n \ tat org.springframework.data.jpa.repository.query.JpaQueryExecution.execute (JpaQueryExecution.java:88) \ r \ n \ tat org.springframework.data.j. repository.query.AbstractJpaQuery.doExecute (AbstractJpaQuery.java:154) \ r \ n \ tat org.springframework.data.jpa.repository.query.AbstractJpaQuery.execute (AbstractJpaQuery.java:142) \ r \ n tatspringframework.data.repository.core.support.RepositoryFactorySupport $ QueryExecutorMethodInterceptor.doInvoke (RepositoryFactorySupport.java:618) \ r \ n \ tat org.springframework.data. 605) \ r \ n \ tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed (ReflectiveMethodInvocation.java:186) \ r \ n \ tat org.springframework.data. проекция. \ r \ n \ tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed (ReflectiveMethodInvocation.java:186)\r\n\tat org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction (TransactionAspectSupport.java:353) \ r \ n \ tat org.springframeinterInceptor. java: 99) \ r \ n \ tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed (ReflectiveMethodInvocation.java:186) \ r \ n \ tat org.springframework.dao.support.PersistenceExceptionTransceptInceptor139) \ r \ n \ t ... еще 95 \ r \ nПричинено: org.postgresql.util.PSQLException: ОШИБКА: оператор не существует: uuid = bytea \ n Подсказка: ни один оператор не соответствует данному имени и типу аргумента,Возможно, вам потребуется добавить явное приведение типов. \ N Позиция: 313 \ r \ n \ tat org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse (QueryExecutorImpl.java:2497) \ r \ n \ tatorg.postgresql.core.v3.QueryExecutorImpl.processResults (QueryExecutorImpl.java:2233) \ r \ n \ tat org.postgresql.core.v3.QueryExecutorImpl.execute (QueryExecutorImpl.java:3 \ org. \ \ org. r.. postgresql.jdbc.PgStatement.executeInternal (PgStatement.java:446) \ r \ n \ tat org.postgresql.jdbc.PgStatement.execute (PgStatement.java:370) \ r \ n \ tat org.postgresql.jrepaStatePg. executeWithFlags (PgPreparedStatement.java:149) \ r \ n \ tat org.postgresql.jdbc. java: 52) \ r \ n \ tat com.zaxxer.hikari.pool.HikariProxyPreparedStatement.executeQuery (HikariProxyPreparedStatement.java) \ r \ n \ tat org.hibernate.engine.jdbc.internal.ResultSetReturnImpl. 57) \ r \ n \ t ... еще 125 \ r \ n

Вы знаете, как это решить? Спасибо.

Ответы [ 2 ]

2 голосов
/ 23 октября 2019

Я думаю, что вы пропустили @ManyToOne в вышеприведенном отношении к игре. Поэтому измените GameMode следующим образом:

   @ManyToOne
   @JoinColumn(name="id")
   @Column(name = "game_id")
   private Game game;
1 голос
/ 23 октября 2019

Таким образом, каждый раз, когда вы отсылаете одну сущность к другой, вы должны думать, является ли это отношением многие-к-одному / один-к-одному / один-ко-многим / многие-ко-многим, то же самое при разработкебазы данных.

И вам нужно указать в аннотациях к JPA, как вы отобразили это в базе данных.

Я буду считать, что в вашем случае Одна игра можетесть Множество режимов игры. Итак:

  • Один (игра) до много (режимы игры)
  • Много (режимы игры) One (Игра) -> это то, что вы пытаетесь отобразить

Итак, в вашем классе GameMode:

@Entity
@Table(name = "game_mode")
@TypeDef(name = "jsonb", typeClass = JsonBinaryType.class)
public class GameMode extends BaseTable implements Serializable {

   // PROPERTIES
   @Id
   @GeneratedValue()
   @Column(name = "id")
   private UUID id;

   @ManyToOne // this will map game_id(game_mode) to id from (game)
   private Game game;
   ...
}
...