jpa ddl-auto: update更新数据库失败原因及解决方案

application.yml 中jpa配置

spring:
  jpa:
    database: MYSQL
    show-sql: true
    hibernate:
      ddl-auto: update
      naming-strategy: org.hibernate.cfg.ImprovedNamingStrategy
    properties:
      hibernate:
        dialect: org.hibernate.dialect.MySQL5InnoDBDialect
    open-in-view: false

ddl-auto值说明

说明
create每次运行该程序,没有表格会新建表格,表内有 数据会清空
create-drop每次程序 结束 的时候会清空表
update每次运行程序,没有表格会新建表格,表内有数据 不会清空,只会更新
validate运行程序会校验数据与数据库的字段类型 是否相同,不同会报错

问题描述

场景(jpa版本:2.0.4.RELEASE)

  1. 数据库名称含 " - ",例如: t-dev,user-table
    • jpa的更新语句为
Hibernate: alter table t-dev.test add column c varchar(10) comment '测试'
  1. 数据库名称含 " _ ",例如: t_dev,user_table
    • jpa的更新语句为
Hibernate: alter table t_dev.test add column c varchar(10) comment '测试'

运行结果

  • 场景1启动会报错,内容如下:
org.hibernate.tool.schema.spi.CommandAcceptanceException: Error executing DDL via JDBC Statement
	...
Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '-dev.test add column c varchar(10) comment '测试'' at line 1

异常原因

  • 是由于 数据库命名不规范 造成的错误

数据库命名规范之一:采用26字母和0-9的自然数(一般不使用)加上下划线‘_’ 组成,命名简洁明确,多个单词用下划线 ‘_’ 隔开

版本说明

  • 2.0.4.RELEASE
    • 更新表时会携带数据库信息,例如:alter table t_dev.test…
  • ps:中间缺省的版本没有测试
  • 2.2.2.RELEASE版本及以后
    • 更新表时不会携带数据库信息,例如:alter table test…

解决办法

  • 重命名数据库名
  • 无法重命名的,就新建一个库,然后同步结构和数据到新库
  • 升级jpa的版本信息
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值