Hibernate 作為 Java 持久層領域的經典 ORM 框架,雖然近年 MyBatis 更受青睞,但 Hibernate 的全自動映射、HQL 查詢語言、二級緩存、延遲加載等特性在特定場景(中小型專案、快速原型、領域模型驅動開發)仍具不可替代優勢。本文整理 Hibernate 起步核心知識點,構建完整知識骨架。
<?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>
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>
@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
}
| 接口/類 | 核心職責 | 關鍵方法 |
|---|---|---|
| Configuration | 啟動時加載配置、構建 SessionFactory | configure()、buildSessionFactory() |
| SessionFactory | 線程安全、重量級、緩存編譯後映射元數據 | openSession()、getCurrentSession() |
| Session | 線程不安全、輕量級、代表數據庫會話、一級緩存持有者 | save()、get()、load()、createQuery()、beginTransaction() |
| Transaction | 事務邊界管理 | commit()、rollback() |
| Query / Criteria | HQL / 標準查詢 | list()、uniqueResult()、setParameter() |
瞬時態 --save()/persist()--> 持久態 --session.close()/evict()--> 游離態 ^ | |---------------------- update()/merge() ------------------| | | |---------------------- delete() -------------------------| | | +---------------------- load()/get() ---------------------+
from User u where u.username = :nameselect 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 問題| 關係 | 單向 | 雙向 | 關鍵標籤/註解 |
|---|---|---|---|
| 一對多 | <set> + <key> | 雙向:inverse="true" 由多方維護 | @OneToMany(mappedBy="user") / @ManyToOne |
| 多對一 | <many-to-one> | 同上 | @ManyToOne |
| 一對一 | 共享主鍵/外鍵唯一 | mappedBy 指定擁有方 | @OneToOne + @JoinColumn / @MapsId |
| 多對多 | <set> + <many-to-many> | 中間表,一方 inverse="true" | @ManyToMany + @JoinTable |