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

Hibernate 5 入門實戰:從環境搭建到第一個持久化對象

     編輯:Java 綜合教學

什麼是 Hibernate?

Hibernate 是開源的對象關系映射(ORM)框架。它對 JDBC 進行輕量級封裝,建立 POJO 與數據庫表的映射關系,自動生成並執行 SQL,讓開發者以面向對象思維操作數據庫。可用於 Java SE 客戶端、Servlet/JSP Web 應用,也能在 J2EE 中替代 CMP 完成持久化。

環境搭建清單

  1. 下載 Hibernate 5.0.7 Final:官方下載頁
  2. 解壓後關鍵目錄:
    • lib/required/:核心依賴(hibernate-core、javassist、antlr 等)
    • lib/jpa/:JPA API 依賴
    • project/etc/:DTD/XSD 約束文件
  3. 創建 Web 項目並導入 JAR:required 下所有 JAR + MySQL 驅動(mysql-connector-java-5.1.x.jar)+ 日誌實現(slf4j-api + log4j/logback)

Hibernate 解壓目錄結構

項目導入 JAR 包

完整項目依賴列表

數據庫準備

CREATE DATABASE hibernate DEFAULT CHARSET utf8;

CREATE TABLE `cst_customer` (
    `cust_id` BIGINT(32) NOT NULL AUTO_INCREMENT COMMENT '客戶編號(主鍵)',
    `cust_name` VARCHAR(32) NOT NULL COMMENT '客戶名稱(公司名稱)',
    `cust_source` VARCHAR(32) DEFAULT NULL COMMENT '客戶信息來源',
    `cust_industry` VARCHAR(32) DEFAULT NULL COMMENT '客戶所屬行業',
    `cust_level` VARCHAR(32) DEFAULT NULL COMMENT '客戶級別',
    `cust_phone` VARCHAR(64) DEFAULT NULL COMMENT '固定電話',
    `cust_mobile` VARCHAR(16) DEFAULT NULL COMMENT '移動電話',
    PRIMARY KEY (`cust_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

實體類:Customer.java

public class Customer {
    private Long custId;
    private String custName;
    private String custSource;
    private String custIndustry;
    private String custLevel;
    private String custPhone;
    private String custMobile;
    // Getter/Setter 省略
}

映射文件:Customer.hbm.xml

命名規約:類名.hbm.xml,與實體類同包路徑(src/main/resources/com/hibernate/domain/)

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "https://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">

<hibernate-mapping package="com.hibernate.domain">
    <class name="Customer" table="cst_customer">
        <id name="custId" column="cust_id">
            <generator class="native"/>
        </id>
        <property name="custName" column="cust_name"/>
        <property name="custSource" column="cust_source"/>
        <property name="custIndustry" column="cust_industry"/>
        <property name="custLevel" column="cust_level"/>
        <property name="custPhone" column="cust_phone"/>
        <property name="custMobile" column="cust_mobile"/>
    </class>
</hibernate-mapping>

獲取 DTD 約束技巧:Eclipse 中打開 hibernate-core-xxx.jar → org.hibernate → hibernate-mapping-3.0.dtd 複制前幾行,或離線配置 XML Catalog。

查找 DTD 文件

jar 內部結構

DTD 文件位置

複製 DTD 聲明

映射文件編寫

核心配置文件:hibernate.cfg.xml (放在 src 根目錄)

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
    "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
    "https://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">

<hibernate-configuration>
    <session-factory>
        <!-- 數據庫連接 -->
        <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="hibernate.connection.url">jdbc:mysql:///hibernate</property>
        <property name="hibernate.connection.username">root</property>
        <property name="hibernate.connection.password">123</property>

        <!-- 方言:自動生成特定數據庫 SQL -->
        <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>

        <!-- 調試:顯示/格式化 SQL -->
        <property name="hibernate.show_sql">true</property>
        <property name="hibernate.format_sql">true</property>

        <!-- DDL 策略:update 自動建表/更新結構 -->
        <property name="hibernate.hbm2ddl.auto">update</property>

        <!-- 加載映射文件 -->
        <mapping resource="com/hibernate/domain/Customer.hbm.xml"/>
    </session-factory>
</hibernate-configuration>

測試代碼:保存客戶對象

public class HibernateDemo1 {
    @Test
    public void demo1() {
        // 1. 加載配置,創建 SessionFactory(線程安全,重量級,通常作單例)
        Configuration cfg = new Configuration().configure();
        SessionFactory sf = cfg.buildSessionFactory();

        // 2. 開啟 Session(輕量級,非線程安全,請求級)
        Session session = sf.openSession();

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

        // 4. 業務操作
        Customer customer = new Customer();
        customer.setCustName("某某某");
        session.save(customer); // 持久化

        // 5. 提交事務
        tx.commit();

        // 6. 釋放資源
        session.close();
        sf.close(); // 應用關閉時調用
    }
}

數據庫插入成功記錄

核心概念速記

概念對應 JDBC生命週期
Configuration解析配置文件啟動一次
SessionFactory連接池/數據源應用級單例
SessionConnection請求級/事務級
TransactionConnection.commit/rollback事務級
Query/CriteriaPreparedStatement查詢級

避坑指南

  1. hbm2ddl.auto 取值:create(每次重建)、create-drop(結束刪表)、update(推薦開發)、validate(僅校驗)、none(生產環境)。
  2. 映射文件 <mapping> 路徑需與 src/resources 下相對路徑一致,區分大小寫。
  3. 實體類必須提供無參構造器,字段建議用包裝類型(Long vs long)支持 null。
  4. 主鍵生成策略:MySQL 用 native(identity),Oracle 用 sequence,通用 uuid/assigned。

完成第一個 CRUD,你已跨越 ORM 門檻。下一站:關聯映射、HQL/JPQL、緩存機制、性能調優。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved