Hibernate hbm2ddl.auto设为update时跨库同名表无法创建问题
问题原因
- MySQL JDBC驱动默认配置下,
DatabaseMetaData.getTables()接口会返回当前MySQL实例所有数据库的匹配表,而非仅返回当前连接指定的cc_db库的表。Hibernate执行hibernate.hbm2ddl.auto=update逻辑时,只要检测到整个实例内存在同名的table_def表,就会判定表已存在,不会在目标库cc_db中重复创建。 - 你当前使用
root账号配置数据源,该账号默认拥有cc_db_back备份库的访问权限,因此Hibernate可以扫描到备份库的table_def表,触发了上述判定逻辑。
解决方案
以下方案按优先级从高到低排列:
- 修改JDBC连接URL参数,新增
nullCatalogMeansCurrent=true配置,强制JDBC驱动仅返回当前连接库的元数据,是改动最小的通用解决方案。如果是在XML文件中配置URL,需要将&转义为&,修改后的URL配置如下:
jdbc:mysql://localhost:3306/cc_db?autoReconnect=true&useSSL=false&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true
- 配置Hibernate默认catalog,在JPA属性中新增如下配置,强制Hibernate仅在目标库下校验表是否存在:
<prop key="hibernate.default_catalog">cc_db</prop>
- 收窄数据库账号权限,单独创建业务专用数据库账号,仅开放
cc_db库的访问权限,移除其他库的访问权限。Hibernate无法扫描到其他库的表,自然不会出现误判定问题,该方案从安全规范角度更适合生产环境使用。
内容的提问来源于stack exchange,提问作者rhl mngl
相关产品推荐
相关产品推荐

