我的数据库访问存在这个(常见)问题。但就我而言,我找不到合适的回答......
创建了一个非常基本的MySql DB和Spring Boot App来访问它。
在我的本地主机上,它运行顺畅。
然后我转储了本地数据库。将其插入AWS-MySql DB。 并将带有Docker的Spring-Boot应用程序部署到我的EC2。 一切都很好。
但是在使用AWS MySQL时,所有REST端点都会返回: 状态500 无法提取ResultSet; SQL [不适用];嵌套异常是org.hibernate.exception.SQLGrammarException:无法提取ResultSet
对我来说,它看起来和localhost一样。
我错过了什么?
答案 0 :(得分:0)
我找到了原因。我知道一个解决方案。 但我不能接受不知道它是如何发生的:
我的POJO仅由Classname定义(无Table =“”Metadata decortion)
在我的本地机器上运行良好。
SQL查询是:"... 'Dbname'.'tablename' ... "
在RDS Mysql上在AWS上进行Docker化。
SQL查询是:"... 'Dbname'.'TableName' ... "
然后当然查询失败了。
我的配置:
属性:
#Hibernate (Spring-JPA)
hibernate.dialect=org.hibernate.dialect.MySQLDialect
spring.jpa.properties.hibernate.show_sql=true
spring.jpa.properties.hibernate.use_sql_comments=true
spring.jpa.properties.hibernate.format_sql=true
spring.jpa.hibernate.ddl-auto=none
spring.jpa.hibernate.naming.implicit-strategy=org.hibernate.boot.model.naming.ImplicitNamingStrategyLegacyJpaImpl
spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
POM:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.6.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<spring-cloud-services.version>1.5.0.RELEASE</spring-cloud-services.version>
<spring-cloud.version>Dalston.SR3</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka-server</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>io.pivotal.spring.cloud</groupId>
<artifactId>spring-cloud-services-starter-service-registry</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>io.pivotal.spring.cloud</groupId>
<artifactId>spring-cloud-services-dependencies</artifactId>
<version>${spring-cloud-services.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
很明显,我的NamingStrategy设置将在本地或aws中被忽略或覆盖。
但此时我需要一些帮助。
PS:为什么我找不到任何关于Hibernate命名策略设置的有用文档?!?例如:strat-setting-A =&gt; TableName - &gt; TABLE_NAME等...... 为什么我必须阅读代码才能理解这一点? (T.T)
编辑:
万岁!我有原因。
我的本地数据库配置不同。好吧,默认情况下:lower_case_table_names=1
所以它只是忽略了CamelCase。但是在aws上似乎设置为0
这意味着它会处理骆驼案例名称。
所以灵魂很容易:只将我的命名策略设置为小写! 我在哪里可以找到配置正确的文档? : - )
好吧反正...更好的没有文档然后错误的文档!
解决方案:
2个选项:
1 - 使用@Table()装饰器手动配置POJO。 2 - 从属性中删除休眠命名设置(或将其更改为所需的)
PS:如果有人认识一位优秀的医生,我仍然会注意到所有的设置可能性。