Hibernate学习第一步之生成表结构的方式及报错原因

本文解决了使用较新版本Hibernate时遇到的表结构生成错误问题,介绍了如何替换废弃的ServiceRegistryBuilder方法,并提供了5.x版本的简化示例。

好,话不多说,相信有很多刚开始学习hibernate的小伙伴们(尤其是自己看视频自学)都碰到过这样的问题:第一生成表结构的时候发现会有这样的错误:


很奇怪,明明都是照着视频中的敲的呀,怎么这几个地方会报错呢?其实原因是这个样子的:

这是因为笔者或者朋友你使用的是比较高级的hibernate版本,以上是hibernate4.3版本以前的方式,以后的,ServiceRegistryBuilder()这个方法机已经被弃用了,所以你如果用的是比较高级的hibernate版本,或者干脆就是用比较新的版本的IDE开发工具(比如说笔者的idea2017.3.4版)自动下载的话,那么恭喜你,会报错的呦~

新的方法如下:

public void testSchemaExport(){
    //创建配置对象
    Configuration config = new Configuration().configure();
    //创建服务注册对象
    ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().applySettings(config .getProperties()).build();
    //创建会话工厂对象
    SessionFactory sessionFactory = config.buildSessionFactory(serviceRegistry);
    //会话对象
    Session session = sessionFactory.openSession();
    //开启事务
    Transaction transaction = session.beginTransaction();
}

甚至hibernate5之后更加简单:

public void testSchemaExport(){
    //创建配置对象(读取配置文档)
    Configuration config = new Configuration().configure();
    //创建会话工厂对象
    SessionFactory sessionFactory = config.buildSessionFactory();
    //会话对象
    Session session = sessionFactory.openSession();
    //开启事务
    Transaction transaction = session.beginTransaction();
}

由此搞定学习hibernate碰到的第一个问题

在这里要说一下,网上有很多介绍hibernate使用的,并且都是介绍的非常好,我在这里仅仅是记录一下自己在学习hibernate的过程中犯的错误,记录下来以免以后再犯,同时给刚开始学习hibernate的猿们提供一个参照,毕竟刚开始的时候什么都不懂,因为配置或者版本问题困扰很久是很苦恼的,当然,本人也是一个刚开始学习的小白,希望大家互相学习,大神勿喷~

是的,你可以将补充的 SQL 语句粘贴到 MySQL 中执行,但**需要注意执行顺序和数据库环境配置**。下面我来详细说明正确的操作流程。 --- ### ✅ 正确的操作步骤:在 MySQL 中执行建表 SQL #### ✅ 第一步:登录 MySQL 打开终端(命令行),输入以下命令登录 MySQL: ```bash mysql -u root -p ``` 然后输入你的密码(比如你配置的是 `123456`)。 --- #### ✅ 第二步:选择数据库 你之前已经创建了 `dosepre` 数据库,所以先使用它: ```sql USE dosepre; ``` > ⚠️ 确保这个数据库存在。如果不存在,先创建: > > ```sql > CREATE DATABASE dosepre CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; > ``` --- #### ✅ 第三步:按顺序执行建表语句 由于表之间有外键依赖关系(如 `doctor.id` 引用 `user.id`),**必须先创建父表 `user`,再创建子表 `doctor` 和 `admin`**。 👉 按以下顺序粘贴并执行 SQL: --- ##### 1. 创建 `user` 表(基表) ```sql CREATE TABLE user ( id BIGINT PRIMARY KEY AUTO_INCREMENT, username VARCHAR(50) NOT NULL UNIQUE, password VARCHAR(255) NOT NULL, role ENUM('ADMIN', 'DOCTOR') NOT NULL, status ENUM('PENDING', 'APPROVED', 'REJECTED') DEFAULT 'PENDING', full_name VARCHAR(100) NOT NULL, email VARCHAR(100), phone VARCHAR(20), create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; ``` --- ##### 2. 创建 `doctor` 表(继承自 user) ```sql CREATE TABLE doctor ( id BIGINT PRIMARY KEY, license_number VARCHAR(50) UNIQUE, hospital VARCHAR(100), department VARCHAR(50), profile_photo TEXT, FOREIGN KEY (id) REFERENCES user(id) ON DELETE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; ``` --- ##### 3. 创建 `admin` 表(继承自 user) ```sql CREATE TABLE admin ( id BIGINT PRIMARY KEY, FOREIGN KEY (id) REFERENCES user(id) ON DELETE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; ``` --- ### 🔍 验证是否成功 执行以下命令查看表是否创建成功: ```sql SHOW TABLES; ``` 你应该能看到: ``` +-------------------+ | Tables_in_dosepre | +-------------------+ | user | | doctor | | admin | | drug | | patient | | dose_prediction | +-------------------+ ``` 还可以查看结构: ```sql DESCRIBE doctor; ``` --- ### 🛠️ 注意事项 | 问题 | 解决方案 | |------|----------| | ❌ 报错 `Cannot add foreign key constraint` | 可能是因为存储引擎不是 InnoDB 或字段类型不匹配。确保:① 使用 `ENGINE=InnoDB`;② `id` 类型一致(BIGINT);③ 先创建父表 `user` | | ❌ 报错 `Table already exists` | 说明表已存在,可先删除(仅开发环境):<br>`DROP TABLE IF EXISTS doctor;` | | 💡 建议开发阶段开启 `hibernate.ddl-auto: update` | Spring Boot 会自动同步实体与数据库,减少手动维护成本 | --- ### ✅ 推荐做法(更安全):使用 Spring Boot 自动建表 你已经在 `application.yml` 中配置了: ```yaml spring: jpa: hibernate: ddl-auto: update ``` ✅ 只要你在 Java 中定义好 `@Entity` 类,Spring Boot 启动时就会**自动创建这些表**,无需手动执行 SQL! > 所以你现在可以: > > 1. **先把上面的 Java 实体类写好**(放在 `entity` 包) > 2. **启动 Spring Boot 应用** > 3. 框架会自动创建对应的表(包括外键) 👉 这才是现代开发的标准做法! --- ### ✅ 总结:两种方式任选其一 | 方式 | 是否推荐 | 适用场景 | |------|----------|---------| | ✅ 手动执行 SQL | ⚠️ 适合初期快速搭建或生产初始化 | 快速验证、DBA 操作 | | ✅ 使用 JPA `ddl-auto: update` 自动生成 | ✅ 强烈推荐(开发阶段) | 开发调试、模型频繁变更 | | 🔄 结合使用:SQL 初始化 + JPA 维护 | ✅ 最佳实践 | 初次建库用 SQL,后续用 JPA | --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值