当JPA遇上MySQL表名全大写+全小写+驼峰+匈牙利四风格
我一直知道的MySQL在Linux上有字段名表名等的大小写问题,于是为了避免这个问题,选择了下划线和全小写,心说虽然咱用的是JPA,只要使用注解写清楚表名和字段名是大写的,不也没事么。例如这样
实际上证明,想象比搬砖生活丰富的多。亲们,我用JPA实现查表操作的时候,Exception跳出来说表不存在,因为表名是全小写的,我还能怎样┑( ̄Д  ̄)┍。接下来,折腾才刚刚开始……不妨看下日志,内心异常的沉重 2019-09-24 17:31:16.407 ERROR 25864 --- [ XNIO-2 task-1] o.h.engine.jdbc.spi.SqlExceptionHelper : (conn=348) Table ‘4a.t_assets_mgr‘ doesn‘t exist 2019-09-24 17:31:16.420 ERROR 25864 --- [ XNIO-2 task-1] c.s.xxxx.aop.logging.LoggingAspect : Exception in com.xxx.yyyy.service.StaticQuadraa.initLevel() with cause = ‘org.hibernate.exception.SQLGrammarException: could not extract ResultSet‘ and exception = ‘could not extract ResultSet; SQL [n/a]; nested exception is org.hibernate.exception.SQLGrammarException: could not extract ResultSet‘ org.springframework.dao.InvalidDataAcce***esourceUsageException: could not extract ResultSet; SQL [n/a]; nested exception is org.hibernate.exception.SQLGrammarException: could not extract ResultSet at org.springframework.orm.jpa.vendor.HibernateJpaDialect.convertHibernateAccessException(HibernateJpaDialect.java:242) at org.springframework.orm.jpa.vendor.HibernateJpaDialect.translateExceptionIfPossible(HibernateJpaDialect.java:225) at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.translateExceptionIfPossible(AbstractEntityManagerFactoryBean.java:527) at org.springframework.dao.support.ChainedPersistenceExceptionTranslator.translateExceptionIfPossible(ChainedPersistenceExceptionTranslator.java:61) at org.springframework.dao.support.DataAccessUtils.translateIfNecessary(DataAccessUtils.java:242) at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:153) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:185) at org.springframework.data.jpa.repository.support.CrudMethodMetadataPostProcessor$CrudMethodMetadataPopulatingMethodInterceptor.invoke(CrudMethodMetadataPostProcessor.java:135) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:185) at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:92) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:185) at org.springframework.data.repository.core.support.SurroundingTransactionDetectorMethodInterceptor.invoke(SurroundingTransactionDetectorMethodInterceptor.java:61) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:185) at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:212) at com.sun.proxy.$Proxy195.getAllByBusinessName(Unknown Source) 通常情况下解决这个问题,如果你的数据库是搭建在windows上面,而且你还是自己写玩的,第一步肯定是改MySQL的cnf,改成不区分大小写,这样总是可以的?不过现在都是在docker环境下,这操作,不行了啊,再装个Oracle又麻烦,怎么办呢?既然MySQL那边解决起来麻烦,我们在Java这想想办法吧。简单的分析一下过程,浏览器点按钮,发起请求到后台,Controller接到请求后通过service找到对应的DTO,DTO又通过Spring Data找到Hibernate从而实现的JPA规范,再转化成SQL语句发送给数据库执行。因此只要能在发送前把表名改成大写就能解决问题了。 spring.jpa.hibernate.naming.implicit-strategy=org.hibernate.boot.model.naming.ImplicitNamingStrategyJpaCompliantImpl spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl 这两个策略还是有点小小的区别的:
这里提供两种解决方法:
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |