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

Hibernate 入門學習筆記整理:從配置到映射的完整起步指南

     編輯:Java 綜合教學

Hibernate 入門學習筆記整理:從配置到映射的完整起步指南

Hibernate 作為 Java 持久層領域的經典 ORM 框架,雖然近年 MyBatis 更受青睞,但 Hibernate 的全自動映射、HQL 查詢語言、二級緩存、延遲加載等特性在特定場景(中小型專案、快速原型、領域模型驅動開發)仍具不可替代優勢。本文整理 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="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hibernate_db</property>
        <property name="hibernate.connection.username">root</property>
        <property name="hibernate.connection.password">root</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>
        
        <!-- 自動建表:create/create-drop/update/validate -->
        <property name="hibernate.hbm2ddl.auto">update</property>
        
        <!-- 映射文件註冊 -->
        <mapping resource="com/example/domain/User.hbm.xml"/>
    </session-factory>
</hibernate-configuration>

實體類與映射文件(.hbm.xml)

User.java - POJO 實體類:

public class User {
    private Integer id;
    private String username;
    private String password;
    private String email;
    // Getter/Setter、toString 省略
}

User.hbm.xml - 映射文件:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "https://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.example.domain">
    <class name="User" table="t_user">
        <id name="id" column="id">
            <generator class="native"/> <!-- 自增/序列自適應 -->
        </id>
        <property name="username" column="username" length="50"/>
        <property name="password" column="password" length="100"/>
        <property name="email" column="email" length="100"/>
    </class>
</hibernate-mapping>

註解映射:零 XML 配置

@Entity
@Table(name = "t_user")
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private Integer id;
    
    @Column(name = "username", length = 50, nullable = false, unique = true)
    private String username;
    
    @Column(name = "password", length = 100)
    private String password;
    
    @Column(name = "email", length = 100)
    private String email;
    // Getter/Setter
}

核心 API 與 Session 生命周期

接口/類核心職責關鍵方法
Configuration啟動時加載配置、構建 SessionFactoryconfigure()、buildSessionFactory()
SessionFactory線程安全、重量級、緩存編譯後映射元數據openSession()、getCurrentSession()
Session線程不安全、輕量級、代表數據庫會話、一級緩存持有者save()、get()、load()、createQuery()、beginTransaction()
Transaction事務邊界管理commit()、rollback()
Query / CriteriaHQL / 標準查詢list()、uniqueResult()、setParameter()

對象三大狀態與轉換

瞬時態  --save()/persist()-->  持久態  --session.close()/evict()-->  游離態
   ^                                                         |
   |---------------------- update()/merge() ------------------|
   |                                                         |
   |---------------------- delete() -------------------------|
   |                                                         |
   +---------------------- load()/get() ---------------------+
  • 瞬時態:new 出來、無 ID、未關聯 Session
  • 持久態:有 ID、關聯 Session、納入一級緩存、脏檢查自動同步 DB
  • 游離態:有 ID、Session 關閉/清除、可重新關聯

HQL 查詢語言精華

  • 面向對象查詢:from User u where u.username = :name
  • 投影查詢:select u.username, u.email from User u 返回 Object[]
  • 分頁:query.setFirstResult(0).setMaxResults(10)
  • 命名參數:query.setParameter("name", "admin") 防注入
  • 左外連接抓取:from User u left join fetch u.orders 解決 N+1 問題

關聯映射速查

性能優化三板斧

  1. 二級緩存:啟用 hibernate.cache.use_second_level_cache=true,配置 Ehcache/Redis,標註 @Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
  2. 延遲加載:默認開啟,@OneToMany(fetch = FetchType.LAZY),注意 Session 關閉後訪問導致 LazyInitializationException
  3. 批量操作:hibernate.jdbc.batch_size=20,session.flush()/clear() 定期清理一級緩存

Spring 整合要點

  • 交由 Spring 管理 SessionFactory:LocalSessionFactoryBean
  • 聲明式事務:@Transactional + HibernateTransactionManager
  • 獲取 Session:sessionFactory.getCurrentSession() 綁定當前線程事務
  • DAO 支持類:繼承 HibernateDaoSupport 或注入 SessionFactory

Hibernate 學習曲線雖陡峭,但其「領域模型驅動」的設計哲學、豐富的映射策略、強大的查詢語言,構建了 Java 持久層技術的高地。建議初學者從 XML 映射入手理解本質,再過渡到註解與 Spring 整合,最後深入緩存、鎖、攔截器等進階特性。

系列完整學習鏈接:
web進修之—Hibernate起步(1)
web進修之—Hibernate起步(2)

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
關係單向雙向關鍵標籤/註解
一對多<set> + <key>雙向:inverse="true" 由多方維護@OneToMany(mappedBy="user") / @ManyToOne
多對一<many-to-one>同上@ManyToOne
一對一共享主鍵/外鍵唯一mappedBy 指定擁有方@OneToOne + @JoinColumn / @MapsId
多對多<set> + <many-to-many>中間表,一方 inverse="true"@ManyToMany + @JoinTable