Hibernate中的ManyToMany映射引用错误(由api生成的表名)表Spring Boot
Posted
技术标签:
【中文标题】Hibernate中的ManyToMany映射引用错误(由api生成的表名)表Spring Boot【英文标题】:ManyToMany Mapping In Hibernate Refers Wrong(Table name generated By api) Table Spring Boot 【发布时间】:2018-01-14 13:29:24 【问题描述】:Hibernate @ManyToMany 映射生成不同的 Join Table 名称并尝试从中获取数据,但它不存在。
在@JoinTable
实体映射中定义为“productcolumn_customfields”的连接表,但它需要一个不同的表并抛出以下内容
错误:
表“product_columns_details_customviews”不存在
使用的技术有: Spring-boot、Spring-data-Jpa、Hibernate、mysql
完全错误是:
org.springframework.dao.InvalidDataAccessResourceUsageException: 可以 不提取结果集; SQL [不适用];嵌套异常是 org.hibernate.exception.SQLGrammarException:无法提取 结果集在 org.springframework.orm.jpa.vendor.HibernateJpaDialect.convertHibernateAccessException(HibernateJpaDialect.java:261) 在 org.springframework.orm.jpa.vendor.HibernateJpaDialect.translateExceptionIfPossible(HibernateJpaDialect.java:244) 在 org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.translateExceptionIfPossible(AbstractEntityManagerFactoryBean.java:488) 在 org.springframework.dao.support.ChainedPersistenceExceptionTranslator.translateExceptionIfPossible(ChainedPersistenceExceptionTranslator.java:59) 在 org.springframework.dao.support.DataAccessUtils.translateIfNecessary(DataAccessUtils.java:213) 在 org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:147) 在 org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) 在 org.springframework.data.jpa.repository.support.CrudMethodMetadataPostProcessor$CrudMethodMetadataPopulatingMethodInterceptor.invoke(CrudMethodMetadataPostProcessor.java:133) 在 org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) 在 org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:92) 在 org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) 在 org.springframework.data.repository.core.support.SurroundingTransactionDetectorMethodInterceptor.invoke(SurroundingTransactionDetectorMethodInterceptor.java:57) 在 org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) 在 org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:213) 在 com.sun.proxy.$Proxy147.save(未知来源) xxxx.ViewServiceImpl.insertViewNameService(ViewServiceImpl.java:564) 在 xxxx.ViewServiceImpl$$FastClassBySpringCGLIB$$50dd8d1c.invoke() 在 org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204) 在 org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:738) 在 org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157) 在 org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:85) 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在 java.lang.reflect.Method.invoke(Method.java:498) 在 org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:629) 在 org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:618) 在 org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:70) 在 org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) 在 org.springframework.aop.aspectj.AspectJAfterThrowingAdvice.invoke(AspectJAfterThrowingAdvice.java:62) 在 org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) 在 org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:92) 在 org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) 在 org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:673) 在 xxxx.ViewServiceImpl$$EnhancerBySpringCGLIB$$1737579b.insertViewNameService() 在 xxxx.ViewController.insertViewNameController(ViewController.java:138) 在 xxxx.ViewController$$FastClassBySpringCGLIB$$d262cb92.invoke() 在 org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204) 在 org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:738) 在 org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157) 在 org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:85) 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在 java.lang.reflect.Method.invoke(Method.java:498) 在 org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:629) 在 org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:618) 在 org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:70) 在 org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) 在 org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:92) 在 org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) 在 org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:673) 在 xxxx.ViewController$$EnhancerBySpringCGLIB$$9d8d1205.insertViewNameController() 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在 java.lang.reflect.Method.invoke(Method.java:498) 在 org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:205) 在 org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:133) 在 org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:97) 在 org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:827) 在 org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:738) 在 org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85) 在 org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:967) 在 org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:901) 在 org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970) 在 org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:872) 在 javax.servlet.http.HttpServlet.service(HttpServlet.java:661) 在 org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846) 在 javax.servlet.http.HttpServlet.service(HttpServlet.java:742) 在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) 在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) 在 org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) 在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) 在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) 在 org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:317) 在 org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:127) 在 org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:91) 在 org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331) 在 org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:114) 在 org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331) 在 org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:137) 在 org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331) 在 org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:111) 在 org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331) 在 org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:170) 在 org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331) 在 org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:63) 在 org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331) 在 org.springframework.security.web.authentication.www.BasicAuthenticationFilter.doFilterInternal(BasicAuthenticationFilter.java:215) 在 org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 在 org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331) 在 org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:116) 在 org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331) 在 org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:64) 在 org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 在 org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331) 在 org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:105) 在 org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331) 在 org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:56) 在 org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 在 org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331) 在 org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:214) 在 org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:177) 在 org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:346) 在 org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:262) 在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) 在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) 在 org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:99) 在 org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) 在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) 在 org.springframework.web.filter.HttpPutFormContentFilter.doFilterInternal(HttpPutFormContentFilter.java:105) 在 org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) 在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) 在 org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:81) 在 org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) 在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) 在 org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:197) 在 org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) 在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) 在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) 在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) 在 org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:198) 在 org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96) 在 org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:478) 在 org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:140) 在 org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:80) 在 org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87) 在 org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:342) 在 org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:799) 在 org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66) 在 org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868) 在 org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1455) 在 org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 在 org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) 在 java.lang.Thread.run(Thread.java:745) 引起: org.hibernate.exception.SQLGrammarException:无法提取 结果集在 org.hibernate.exception.internal.SQLExceptionTypeDelegate.convert(SQLExceptionTypeDelegate.java:63) 在 org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:42) 在 org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:109) 在 org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:95) 在 org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.extract(ResultSetReturnImpl.java:79) 在 org.hibernate.loader.Loader.getResultSet(Loader.java:2117) 在 org.hibernate.loader.Loader.executeQueryStatement(Loader.java:1900) 在 org.hibernate.loader.Loader.executeQueryStatement(Loader.java:1876) 在 org.hibernate.loader.Loader.doQuery(Loader.java:919) 在 org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:336) 在 org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:306) 在 org.hibernate.loader.Loader.loadEntity(Loader.java:2204) 在 org.hibernate.loader.entity.AbstractEntityLoader.load(AbstractEntityLoader.java:60) 在 org.hibernate.loader.entity.AbstractEntityLoader.load(AbstractEntityLoader.java:50) 在 org.hibernate.persister.entity.AbstractEntityPersister.load(AbstractEntityPersister.java:4019) 在 org.hibernate.event.internal.DefaultLoadEventListener.loadFromDatasource(DefaultLoadEventListener.java:508) 在 org.hibernate.event.internal.DefaultLoadEventListener.doLoad(DefaultLoadEventListener.java:478) 在 org.hibernate.event.internal.DefaultLoadEventListener.load(DefaultLoadEventListener.java:219) 在 org.hibernate.event.internal.DefaultLoadEventListener.proxyOrLoad(DefaultLoadEventListener.java:278) 在 org.hibernate.event.internal.DefaultLoadEventListener.doOnLoad(DefaultLoadEventListener.java:121) 在 org.hibernate.event.internal.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:89) 在 org.hibernate.internal.SessionImpl.fireLoad(SessionImpl.java:1129) 在 org.hibernate.internal.SessionImpl.access $2600(SessionImpl.java:164) 在 org.hibernate.internal.SessionImpl$IdentifierLoadAccessImpl.load(SessionImpl.java:2696) 在 org.hibernate.internal.SessionImpl.get(SessionImpl.java:980) 在 org.hibernate.event.internal.DefaultMergeEventListener.entityIsDetached(DefaultMergeEventListener.java:290) 在 org.hibernate.event.internal.DefaultMergeEventListener.onMerge(DefaultMergeEventListener.java:170) 在 org.hibernate.internal.SessionImpl.fireMerge(SessionImpl.java:850) 在 org.hibernate.internal.SessionImpl.merge(SessionImpl.java:832) 在 org.hibernate.engine.spi.CascadingActions$6.cascade(CascadingActions.java:260) 在 org.hibernate.engine.internal.Cascade.cascadeToOne(Cascade.java:398) 在 org.hibernate.engine.internal.Cascade.cascadeAssociation(Cascade.java:323) 在 org.hibernate.engine.internal.Cascade.cascadeProperty(Cascade.java:162) 在 org.hibernate.engine.internal.Cascade.cascadeCollectionElements(Cascade.java:431) 在 org.hibernate.engine.internal.Cascade.cascadeCollection(Cascade.java:363) 在 org.hibernate.engine.internal.Cascade.cascadeAssociation(Cascade.java:326) 在 org.hibernate.engine.internal.Cascade.cascadeProperty(Cascade.java:162) 在 org.hibernate.engine.internal.Cascade.cascade(Cascade.java:111) 在 org.hibernate.event.internal.DefaultMergeEventListener.cascadeOnMerge(DefaultMergeEventListener.java:468) 在 org.hibernate.event.internal.DefaultMergeEventListener.entityIsPersistent(DefaultMergeEventListener.java:202) 在 org.hibernate.event.internal.DefaultMergeEventListener.onMerge(DefaultMergeEventListener.java:176) 在 org.hibernate.event.internal.DefaultMergeEventListener.onMerge(DefaultMergeEventListener.java:69) 在 org.hibernate.internal.SessionImpl.fireMerge(SessionImpl.java:840) 在 org.hibernate.internal.SessionImpl.merge(SessionImpl.java:822) 在 org.hibernate.internal.SessionImpl.merge(SessionImpl.java:827) 在 org.hibernate.jpa.spi.AbstractEntityManagerImpl.merge(AbstractEntityManagerImpl.java:1161) 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在 java.lang.reflect.Method.invoke(Method.java:498) 在 org.springframework.orm.jpa.ExtendedEntityManagerCreator$ExtendedEntityManagerInvocationHandler.invoke(ExtendedEntityManagerCreator.java:347) 在 com.sun.proxy.$Proxy97.merge(未知来源) sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在 java.lang.reflect.Method.invoke(Method.java:498) 在 org.springframework.orm.jpa.SharedEntityManagerCreator$SharedEntityManagerInvocationHandler.invoke(SharedEntityManagerCreator.java:298) 在 com.sun.proxy.$Proxy97.merge(未知来源) org.springframework.data.jpa.repository.support.SimpleJpaRepository.save(SimpleJpaRepository.java:511) 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在 java.lang.reflect.Method.invoke(Method.java:498) 在 org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.executeMethodOn(RepositoryFactorySupport.java:504) 在 org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.doInvoke(RepositoryFactorySupport.java:489) 在 org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.invoke(RepositoryFactorySupport.java:461) 在 org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) 在 org.springframework.data.projection.DefaultMethodInvokingMethodInterceptor.invoke(DefaultMethodInvokingMethodInterceptor.java:56) 在 org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) 在 org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:99) 在 org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:282) 在 org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96) 在 org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) 在 org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:136) ...省略了139个常见框架原因: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:表 'xxx.product_columns_details_customviews' 不存在于 sun.reflect.NativeConstructorAccessorImpl.newInstance0(本机方法) 在
自定义视图实体是:
@Entity
@Table(name = "custom_views")
public class CustomViews implements Serializable
/**
*
*/
private static final long serialVersionUID = -7325379776348403853L;
@Id
@GenericGenerator(name="generator", strategy="increment")
@GeneratedValue(generator="generator")
@Column(name="custom_id")
private Long customId;
@Column(name="view_name")
private String viewName;
@ManyToOne
@JoinColumn(name="user_id")
private User user;
@ManyToMany(cascade = CascadeType.MERGE, CascadeType.REMOVE,fetch=FetchType.LAZY)
@JoinTable(name = "productcolumn_customfields",
joinColumns = @JoinColumn(name = "cv_id") ,
inverseJoinColumns = @JoinColumn(name = "pcd_id",nullable = false, updatable = false) )
private List<ProductColumnsDetailsCV> productColumnsDetails;
public CustomViews()
super();
public CustomViews(Long customId, String viewName, User user, List<ProductColumnsDetailsCV> productColumnsDetails)
super();
this.customId = customId;
this.viewName = viewName;
this.user = user;
this.productColumnsDetails = productColumnsDetails;
/**
* @return the customId
*/
public Long getCustomId()
return customId;
/**
* @param customId the customId to set
*/
public void setCustomId(Long customId)
this.customId = customId;
/**
* @return the viewName
*/
public String getViewName()
return viewName;
/**
* @param viewName the viewName to set
*/
public void setViewName(String viewName)
this.viewName = viewName;
/**
* @return the user
*/
public User getUser()
return user;
/**
* @param user the user to set
*/
public void setUser(User user)
this.user = user;
/**
* @return the productColumnsDetails
*/
public List<ProductColumnsDetailsCV> getProductColumnsDetails()
return productColumnsDetails;
/**
* @param productColumnsDetails the productColumnsDetails to set
*/
public void setProductColumnsDetails(List<ProductColumnsDetailsCV> productColumnsDetails)
this.productColumnsDetails = productColumnsDetails;
产品栏目详情实体:
@Entity
@Table(name = "product_columns_details")
public class ProductColumnsDetailsCV implements Serializable
private static final long serialVersionUID = 7685428544522743567L;
@Id
@GenericGenerator(name="generator", strategy="increment")
@GeneratedValue(generator="generator")
@Column(name="pid")
private Long pid;
@Column(name="display_name")
private String displayName;
@Column(name="column_name")
private String columnName;
@Column(name="actual_name")
private String actualName;
@Column(name="type")
private String type;
@Column(name="is_pk")
private boolean isPk;
@Column(name="is_sortable")
private boolean isSortable;
@Column(name="order_")
private int order;
@Column(name="is_popup")
private boolean isPopUp;
@ManyToMany(cascade = CascadeType.MERGE, CascadeType.REMOVE)
@JoinColumn(name="productColumnsDetails")
private List<CustomViews> customviews;
public ProductColumnsDetailsCV()
super();
/**
* @param pid
* @param displayName
* @param columnName
* @param actualName
* @param customFilter
*/
public ProductColumnsDetailsCV(Long pid, String displayName, String columnName, String actualName)
this.pid = pid;
this.displayName = displayName;
this.columnName = columnName;
this.actualName = actualName;
//Getters & Setter
表格:
CREATE TABLE `productcolumn_customfields` (
`id` bigint(11) NOT NULL AUTO_INCREMENT,
`pcd_id` bigint(20) DEFAULT NULL,
`cv_id` bigint(20) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `id_pid_productcoldetails_idx` (`pcd_id`),
KEY `id_cvid_customviews_idx` (`cv_id`),
CONSTRAINT `fk_pcd_id_productcolumndet` FOREIGN KEY (`pcd_id`) REFERENCES `product_columns_details` (`pid`) ON DELETE CASCADE ON UPDATE CASCADE,
CONSTRAINT `id_cvid_customviews` FOREIGN KEY (`cv_id`) REFERENCES `custom_views` (`custom_id`) ON DELETE CASCADE ON UPDATE CASCADE
CREATE TABLE `product_columns_details` (
`pid` bigint(20) NOT NULL AUTO_INCREMENT,
`display_name` varchar(255) DEFAULT NULL,
`column_name` varchar(255) DEFAULT NULL,
`actual_name` varchar(255) DEFAULT NULL,
`type` varchar(25) NOT NULL DEFAULT 'String',
`is_pk` bit(1) NOT NULL DEFAULT b'0',
`is_sortable` bit(1) NOT NULL DEFAULT b'0',
`order_` int(11) NOT NULL DEFAULT '0',
`is_popup` bit(1) NOT NULL DEFAULT b'0',
PRIMARY KEY (`pid`),
UNIQUE KEY `actual_name_UNIQUE` (`actual_name`)
CREATE TABLE `custom_views` (
`custom_id` bigint(30) NOT NULL AUTO_INCREMENT,
`view_name` varchar(255) NOT NULL,
`user_id` bigint(20) NOT NULL,
PRIMARY KEY (`custom_id`),
KEY `custom_views_ibfk_1` (`user_id`),
CONSTRAINT `custom_views_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `users` (`user`enter code here`_id`) ON DELETE CASCADE ON UPDATE CASCADE
)
【问题讨论】:
【参考方案1】:这里发生了问题,因为双方(在实体中)都强制休眠执行many-to-many
映射,这是错误的。
这是休眠假设连接表名称是 product_columns_details_customviews 不存在并且不从配置中获取表名称(在实体 CustomViews
的注释中)即 productcolumn_customfields
现有代码:
@Entity
@Table(name = "product_columns_details")
public class ProductColumnsDetailsCV implements Serializable
...
...
...
@ManyToMany(cascade = CascadeType.MERGE, CascadeType.REMOVE)
@JoinColumn(name="productColumnsDetails")
private List<CustomViews> customviews;
和
@Entity
@Table(name = "custom_views")
public class CustomViews implements Serializable
...
...
...
@ManyToMany(cascade = CascadeType.MERGE, CascadeType.REMOVE,fetch=FetchType.LAZY)
@JoinTable(name = "productcolumn_customfields",
joinColumns = @JoinColumn(name = "cv_id") ,
inverseJoinColumns = @JoinColumn(name = "pcd_id",nullable = false, updatable = false) )
private List<ProductColumnsDetailsCV> productColumnsDetails;
唯一需要的修正是:
需要更改ProductColumnsDetailsCV中的实体映射,如下所示。
@ManyToMany(cascade = CascadeType.MERGE, CascadeType.REMOVE, mappedBy = "productColumnsDetails")
private List<CustomViews> customviews;
删除了注释
@JoinColumn(name="productColumnsDetails")
在@ManyToMany
中添加属性mappedBy
【讨论】:
【参考方案2】:您在一侧指定 joinColumn 并在另一侧指定 joinTable,您需要从 ProductColumnsDetailsCV 中删除 joinColumn
@ManyToMany(cascade = CascadeType.MERGE, CascadeType.REMOVE)
private List<CustomViews> customviews;
【讨论】:
即使在删除 joinColumn 后得到相同的结果 为什么不让 JPA 创建你的表? JPA 不应在 prod 环境中创建表 @TheSprinter 请尝试删除连接表名称之前和之后的 '**' name = "productcolumn_customfields", ,也是创建连接表的第一个查询,使其成为最后一个查询而不是首先以上是关于Hibernate中的ManyToMany映射引用错误(由api生成的表名)表Spring Boot的主要内容,如果未能解决你的问题,请参考以下文章
是否可以指定使用 Hibernate 将 id 自动增量非空主键设置为 @ManyToMany 关系映射?
这是 ManyToMany JPA/Hibernate 关系还是有另一种映射方式?
Hibernate:@ManyToMany 关系中对象集的传递持久性
如何在两个外键上设置 Hibernate @ManyToMany 与级联的关联?