首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

Hibernate 實戰入門 (二):從建表到第一條持久化代碼完整演練

     編輯:Java 綜合教學

準備工作

  • 數據庫:MySQL,創建 database hibernateTest
  • JAR 包:Hibernate 5.6.x + MySQL Connector/J 8.0.x + SLF4J 綁定
  • IDE:Eclipse / IntelliJ IDEA

1. Hibernate 核心配置文件 hibernate.cfg.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "https://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
    <session-factory>
        <!-- 數據庫連接 -->
        <property name="connection.driver_class">com.mysql.cj.jdbc.Driver</property>
        <property name="connection.url">jdbc:mysql://localhost:3306/hibernateTest?useSSL=false&serverTimezone=UTC</property>
        <property name="connection.username">root</property>
        <property name="connection.password">123456</property>

        <!-- Hibernate 方言 -->
        <property name="dialect">org.hibernate.dialect.MySQL8Dialect</property>

        <!-- 控制台打印 SQL -->
        <property name="show_sql">true</property>
        <property name="format_sql">true</property>

        <!-- 自動建表策略:update 保留數據,create 重建,validate 只校驗 -->
        <property name="hbm2ddl.auto">update</property>

        <!-- 映射文件 -->
        <mapping resource="com/jbit/entity/User/User.hbm.xml"/>
    </session-factory>
</hibernate-configuration>

2. 持久化類 User

package com.jbit.entity.User;

public class User {
    private int id;
    private String name;
    private int age;
    // 構造器、getter/setter、toString 省略
}

3. 映射文件 User.hbm.xml

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "https://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
    <class name="com.jbit.entity.User.User" table="USER">
        <id name="id" type="java.lang.Integer">
            <column name="ID"/>
            <generator class="native"/> <!-- 主鍵生成策略:MySQL 自增 -->
        </id>
        <property name="name" column="NAME" type="string"/>
        <property name="age" column="AGE" type="int"/>
    </class>
</hibernate-mapping>

4. 測試代碼:保存對象

package com.jbit.entity.User;

import org.hibernate.*;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;
import org.hibernate.service.ServiceRegistryBuilder;
import org.junit.Test;

public class HibernateTest {
    @Test
    public void testSave() {
        // 1. Configuration 讀取配置與映射
        Configuration cfg = new Configuration().configure();

        // 2. ServiceRegistry (Hibernate 4+ 必須)
        ServiceRegistry sr = new ServiceRegistryBuilder()
                .applySettings(cfg.getProperties())
                .buildServiceRegistry();

        // 3. SessionFactory (線程安全、重量級、應用級單例)
        SessionFactory sf = cfg.buildSessionFactory(sr);

        // 4. Session (線程不安全、輕量級、請求級)
        Session session = sf.openSession();

        // 5. 開啟事務
        Transaction tx = session.beginTransaction();

        try {
            // 6. 執行保存
            User user = new User("Java12345", 10);
            session.save(user); // 持久化狀態

            // 7. 提交事務
            tx.commit();
            System.out.println("保存成功,生成 ID=" + user.getId());
        } catch (Exception e) {
            tx.rollback();
            throw e;
        } finally {
            // 8. 關閉資源
            session.close();
            sf.close();
        }
    }
}

5. 運行結果驗證

  • 控制台打印格式化 SQL:insert into USER (NAME, AGE) values (?, ?)
  • MySQL 數據庫自動創建 USER 表,插入一條記錄,ID 自增。
  • 對象 user 的 id 被回寫。

核心概念釐清

概念生命周期線程安全作用
Configuration啟動時一次是解析配置、構建元數據
ServiceRegistry啟動時一次是服務容器,管理內部服務
SessionFactory應用級單例是緩存元數據、生產 Session、二級緩存
Session請求/事務級否一級緩存、執行 CRUD、管理事務
Transaction事務級否邊界控制、ACID

避坑指南

  1. hbm2ddl.auto:開發用 update,測試用 create-drop,**生產嚴禁非 validate**!
  2. Session 必須關閉:否則連接洩漏、一級緩存膨脹、數據庫連接池耗盡。
  3. 異常必須回滾:tx.rollback() 在 catch 塊中,防止髒數據提交。
  4. 映射文件路徑:resource 使用 classpath 相對路徑,包名用 / 分隔。
  5. MySQL 8+ 驅動類:com.mysql.cj.jdbc.Driver,URL 加 useSSL=false&serverTimezone=UTC。

下一步

  • 註解配置 (@Entity, @Table, @Id, @GeneratedValue) 替換 XML
  • 關聯映射:一對多、多對一、多對多
  • HQL / Criteria / Native SQL 查詢
  • 緩存策略:一級/二級/查詢緩存
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved