相关文章推荐
斯文的春卷  ·  Email 类 · ...·  3 月前    · 
细心的警车  ·  中国科学技术大学 ...·  1 年前    · 
魁梧的排球  ·  ImageJ - 知乎·  1 年前    · 

项目中使用 JPA 和 mysql 。表名是全大写的。

出现 如下报错:

 java.sql.SQLSyntaxErrorException: Table 'XXX_ms.work_task' doesn't exist

各种查询后得知问题出在 hibernate 对于数据库命名 策略的配置上。

我目前的使用的应该是默认配置,会自动把表名从大写转换为小写。

spring data jpa 是基于hibernate5.0 , 而 Hibernate5 关于数据库命名策略的配置与之前版本略有不同:

不再支持早期的 hibernate.ejb.naming_strategy ,而是直接替换为两个新属性:
hibernate.physical_naming_strategy

hibernate.implicit_naming_strategy

至于 physical_naming_strategy 则有两个常用的配置:

org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy  
org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl

解决方法一:

可以在 springboot 项目中配置文件内加上配置行,设置命名为 无修改命名策略:

spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl

解决方法二:

1)重写命名策略中改表名为小写的方法:

import org.hibernate.boot.model.naming.Identifier;
import org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl;
import org.hibernate.engine.jdbc.env.spi.JdbcEnvironment;
 * 重写 hibernate 对于命名策略中改表名大写为小写的方法
public class MySQLUpperCaseStrategy extends PhysicalNamingStrategyStandardImpl {
    @Override
    public Identifier toPhysicalTableName(Identifier name, JdbcEnvironment context) {
        String tableName = name.getText().toUpperCase();
        return name.toIdentifier(tableName);

2)在对应配置文件中 使用自己实现的策略

spring.jpa.hibernate.naming.physical-strategy=com.xxx.xxx.util.MySQLUpperCaseStrategy

https://blog.csdn.net/q979076061/article/details/51539960

https://blog.csdn.net/jiangyu1013/article/details/80395579

http://blog.51cto.com/4528195/1983780

https://blog.csdn.net/holdlg/article/details/52252471

解决springboot + Jpa + MySQL报错:Table 'XXX.xxx' doesn't exist Caused by: java.sql.SQLSyntaxErrorException: Table ‘tfjl.reg_activity_xml’ doesn’t exist 如图所示: 解决方法: 报错信息提示表名不存在,并且在表名后面有个".xml",于是一路查找到实体...
这几天在用spring boot开发项目, 在开发的过程中遇到一个问题hibernate在执行sql时,总会提示列名不存在。 寻找之后发现, 建时,统一采用了大写。hibernate会把大写统一转换成小写。且 postgreSQL对 大小写敏感(实际上如果把表名大写也会提示表名不存在)。 具体提示错误如下: Caused by: org.postgresql.util.PSQLExceptio...
SELECT 语句用于从中选取数据 结果被存储在一个结果中(称为结果集) 这里的mysql其实是一个数据库 而不是一个 所以会出现不存在”这个问题
1. 先根据异常中说不存在表名去项目里局搜索,是否有jpa实体声明或引用,确保项目里没有的情况下 2. 去所连接的数据库中搜索,是否存在这张,如果存在 3. 检查表名,我所遇到的情况是,表名头部带了空格。导致hibernate启动的时候会扫描整个数据库里的的元数据信息时,对表名查询时找不到此问题很隐蔽,解决的时候还是很爽的。 在LINUX下调一个程序老说找不到,但是我明明是建了的,在MYSQL的命令行下也可以查到,为什么程序就找不到呢?   原来是LINUX下的MYSQL默认是要区分表名大小写的   让MY...
spring 中构造Constructor、@Autowired、@PostConstruct、静态方法的执行顺序 (@PostConstruct 说明) super wheat: PreDestroy destroy 执行顺序 你确定是对的? Docker : 数据卷(创建、挂载、查看、删除) name_Deng: 比如docker run -it -v /opt/app:/tmp/data --name user1 容器id 解决:Caused by: redis.clients.jedis.exceptions.JedisDataException: WRONGTYPE Operation against a key 解决:Unexpected token (START_OBJECT), expected START_ARRAY: need JSON Array to contain As.WRAPPER_ARRA