Hibernate创建表成功,但数据库中却没有表的解决方法

本文记录了一次使用Hibernate创建数据库表遇到的问题及解决方案。作者在尝试创建三张表时,发现一张表未能成功创建,经过排查发现是由于字段名与数据库关键字冲突导致。

    注意:测试数据库为Mysql

   

      编写Hibernate配置文件,然后通过SchemaExport类创建表,以前都能成功实现,但是今天却遇到了问题。

编写了三个“.hbm.xml”文件,然后通过SchemaExport类创建表,控制台输出如下Sql语句:

 

drop table if exists t_admin
drop table if exists t_message
drop table if exists t_websiteinfo
create table t_admin (userName varchar(20) not null, password varchar(20), primary key (userName))
create table t_message (id integer not null auto_increment, userName varchar(20), email varchar(20), websize varchar(100), qq varchar(10), content longtext, facePic varchar(30), headPic varchar(30), postDate varchar(20), replayContent longtext, replayDate varchar(20), show bit, userIP varchar(15), top bit, primary key (id))
create table t_websiteinfo (id integer not null auto_increment, name varchar(20), needEmail bit, supportHtml bit, needCheckup bit, contentLength integer, pageSize integer, replayTip varchar(30), replayColor varchar(20), badWords longtext, primary key (id))

 

 

     进入数据库,却发现只有t_admin和t_websiteinfo两张表,t_message表不存在,试了N次都不行,重新启动MyEclipse和Mysql,还是不行,百度、谷歌无果。休息会突然想到是不是某个属性是数据库的关键字,于是把属性复

制到SQLyog Enterprise中,发现show变成蓝色了,修改成showed,在Export,成功了。果真是关键字惹的祸,

下次要注意了。

 

PS:写了个类,boolean型,命名为isShow,Java中生成get方法如下:

public boolean isShow()
	{
		return isShow;
	}

 

使用Hibernate时会报找不到isShow属性的get方法异常。所以给变量起名字也要注意了。

你当前的情况是: > **数据库中只有架构(schema),但没有**。 这说明: ✅ 数据库连接成功了,也能访问指定的库(如 `liteflow_editor`) ❌ 但是 JPA 没有自动创建数据 --- ### ✅ JPA 什么时候会自动创建? JPA(通过 Hibernate)是否自动建,取决于配置项: ```yaml spring: jpa: hibernate: ddl-auto: <mode> ``` 以下是不同模式的行为说明: | `ddl-auto` 值 | 是否自动建 | 描述 | |---------------|----------------|------| | `create` | ✅ 是 | 启动时删除旧,重新创建(**危险!生产禁用**) | | `create-drop` | ✅ 是 | 同 `create`,并在应用关闭时删除(适合测试) | | `update` | ✅ 是 | 如果不存在,则自动创建;存在则尝试更新结构(**开发推荐**) | | `validate` | ❌ 否 | 只校验实体与结构是否一致,不修改数据库 | | `none` | ❌ 否 | 不做任何操作(默认值之一) | --- ### 🔍 你现在的问题原因 > **你的 `ddl-auto` 很可能设置为了 `validate` 或 `none`**,或者根本没配置 → 默认行为就是不建。 虽然你能看到“架构”(即数据库本身),但 JPA 并未执行 DDL 创建。 --- ### ✅ 解决方案:启用自动建(仅限开发环境) #### ✔️ 修改 `application.yml`(推荐开发阶段使用 `update`): ```yaml spring: datasource: url: jdbc:mysql://localhost:3306/liteflow_editor?useSSL=false&serverTimezone=UTC username: root password: your_password jpa: hibernate: ddl-auto: update # 👈 开发时推荐:自动创建或更新 show-sql: true # 查看生成的 SQL format-sql: true properties: hibernate: dialect: org.hibernate.dialect.MySQL8Dialect # 根据你的 MySQL 版本选择 ``` > ⚠️ 注意:MySQL 5.7 用 `MySQL5Dialect`,MySQL 8+ 推荐 `MySQL8Dialect` --- ### ✅ 确保实体类正确标注 即使配置了 `ddl-auto: update`,如果实体没写对,也不会建。 #### 示例实体: ```java @Entity @Table(name = "user") // 对应名 user public class User { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @Column(nullable = false, length = 50) private String username; @Column(length = 100) private String email; // getter / setter ... } ``` > ✅ 必须加 `@Entity`,否则不会被识别为持久化对象。 --- ### ✅ 确认包扫描路径 如果你的实体不在主启动类的子包下,需要显式声明扫描路径: ```java @SpringBootApplication @EntityScan(basePackages = "com.dogsong.entity") // 指定实体所在包 public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } } ``` --- ### ✅ 验证是否生效的方法 1. 启动项目后查看控制台是否有类似 SQL 输出: ```sql create table user (id bigint not null auto_increment, email varchar(100), username varchar(50) not null, primary key (id)) ``` 2. 登录数据库检查: ```sql USE liteflow_editor; SHOW TABLES; -- 应该能看到 user DESCRIBE user; -- 查看字段结构 ``` --- ### 🛑 生产环境建议 不要使用 `create` 或 `update`! ✅ 正确做法: - 使用 **Flyway** 或 **Liquibase** 管理数据库变更 - 关闭自动建: ```yaml spring: jpa: hibernate: ddl-auto: validate # 要求必须已存在且结构匹配 ``` --- ### ✅ 总结 | 问题 | 解决方式 | |------|-----------| | 数据库 | 设置 `spring.jpa.hibernate.ddl-auto=update` | | 实体未扫描 | 添加 `@Entity` 和 `@EntityScan` | | 方言错误 | 使用正确的 `dialect`(如 `MySQL8Dialect`) | | 控制台无 SQL | 开启 `show-sql: true` | | 生产安全 | 改用 Flyway/Liquibase,禁用自动 DDL | ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值