废话不多说,两个问题:自动创建表、大小写敏感。
原因
由于之前一直没有使用过Spring Data JPA作为dao框架去开发,这次公司新建了个项目,这个项目dao的框架使用的刚好是JPA,但因为不熟悉,所以在开发过程中遇到了一些问题,记录一下。
问题及解决办法
自动创建表
在初步了解如何使用JPA之后,使用了@Entity注解和@Table注解将表和实体类映射好之后,按照以前使用mybatis的逻辑,我先创建了表,不过表名和表字段都是大写的。
然后启动服务,ok,服务启动没问题。but!当我想到数据库中看数据时,发现多了几张表,what?在咨询没有哪位同事创建表之后,我怀疑是JPA自动创建的,网上查了一下,JPA确实有配置项会自动创建表。。。
配置文件中的配置项如下:
spring.jpa.database=MySQL
spring.jpa.database-platform=org.hibernate.dialect.MySQL5InnoDBDialect
spring.jpa.show-sql=true
spring.jpa.hibernate.ddl-auto=update
其中spring.jpa.hibernate.ddl-auto
这个参数如果配置为update,则每次运行程序,没有表格会新建表格,表内有数据不会清空,只会更新。
我开始以为因为这个配置项,服务启动之后就会创建新表,因此,将配置修改为如下:
spring.jpa.database=MySQL
spring.jpa.database-platform=org.hibernate.dialect.MySQL5InnoDBDialect
spring.jpa.show-sql=true
#spring.jpa.hibernate.ddl-auto=update
大小写敏感
发现了上面的坑之后,没多想,直接把配置项注释掉,删除多余的表,重启。
结果在调用的时候报错了,说找不到对应的表名:
Caused by: java.sql.SQLSyntaxErrorException: Table 'test.test' doesn't exist
at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:120)
at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:122)
at com.mysql.cj.jdbc.ClientPreparedStatement.executeInternal(ClientPreparedStatement.java:953)
at com.mysql.cj.jdbc.ClientPreparedStatement.executeQuery(ClientPreparedStatement.java:1003)
at com.zaxxer.hikari.pool.ProxyPreparedStatement.executeQuery(ProxyPreparedStatement.java:52)
at com.zaxxer.hikari.pool.HikariProxyPreparedStatement.executeQuery(HikariProxyPreparedStatement.java)
at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.extract(ResultSetReturnImpl.java:57)
... 128 common frames omitted
这就奇怪了,我已经创建了TEST表啊,为什么找不到。
仔细看了下错误,发现表名是小写的?难道是大小写敏感问题?
又到网上查了下,发现确实有这个问题。需要加新的配置项才开启大小写敏感。。。
大小写敏感的配置项:
spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
OK,这次启动没创建新表,调用的时候也不报错。
感觉主要的问题还是因为大小写敏感没有开启,如果数据库涉及的时候,表名和字段名都是大写,那就需要开启JPA的大小写敏感开关。