org.hibernate.Session 是 Hibernate 與數據庫交互的核心接口,代表一個**短生命周期**、**單線程**、**輕量級**的工作單元。它封裝了 JDBC Connection,管理一級緩存,提供 CRUD、查詢、事務控制等核心 API。
理解狀態轉換是掌握 Session 的關鍵:
new Entity() 創建,無 ID,無關聯 Session,不在數據庫中。GC 可回收。狀態轉換圖:
瞬時態 --save()/persist()--> 持久態 持久態 --delete()/remove()--> 瞬時態 (數據庫記錄刪除) 持久態 --close()/evict()/clear()--> 游離態 游離態 --update()/merge()/saveOrUpdate()--> 持久態 游離態 --lock()--> 持久態 (僅重新關聯,不檢查數據庫)
Session session = sessionFactory.openSession();
Transaction tx = null;
try {
tx = session.beginTransaction();
// 1. 保存
User user = new User("John", "john@example.com");
session.persist(user); // 或 save()
// 2. 查詢 (自動加入一級緩存)
User loaded = session.get(User.class, user.getId());
// 3. 修改 (無需調用 update,提交事務時自動脏檢查同步)
loaded.setEmail("new@example.com");
// 4. 刪除
// session.remove(loaded);
tx.commit();
} catch (Exception e) {
if (tx != null) tx.rollback();
e.printStackTrace();
} finally {
session.close(); // 必須關閉,釋放連接、清理一級緩存
}
get/load 同 ID 只發 1 條 SQL。load() vs get():load() 返回代理對象,不存在拋異常 (延遲加載);get() 立即查庫,不存在返回 null。Hibernate 通過映射元數據 (註解/XML) 將 POJO 與數據庫表關聯。遵循 POJO 規範可確保框架正常運行 (代理、反射、序列化)。
public/protected 可見性,供反射實例化與代理創建。@Id 標註主鍵字段,建議使用包裝類型 (Long, String) 以便判斷是否為新對象 (null 表示瞬時態)。private,提供標準 Getter/Setter (字段訪問策略下可省略)。Serializable (支持集群/緩存傳遞)。equals() 和 hashCode():基於**業務鍵** (非 ID,因 ID 可能未生成) 或 **ID + 類型**,保證 Set 集合去重正確。private Set roles = new HashSet<>(); 避免空指針。@Entity, @Table, @Column 等註解完成映射,或編寫 .hbm.xml。@Entity
@Table(name = "t_employee")
public class Employee implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "first_name", length = 50, nullable = false)
private String firstName;
@Column(name = "last_name", length = 50)
private String lastName;
@Column(name = "salary", precision = 10, scale = 2)
private BigDecimal salary;
@Version // 樂觀鎖版本號
private Integer version;
// 無參構造函數
public Employee() {}
// 業務構造函數
public Employee(String firstName, String lastName, BigDecimal salary) {
this.firstName = firstName;
this.lastName = lastName;
this.salary = salary;
}
// Getter/Setter 省略...
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof Employee)) return false;
Employee that = (Employee) o;
return Objects.equals(firstName, that.firstName) &&
Objects.equals(lastName, that.lastName);
}
@Override
public int hashCode() {
return Objects.hash(firstName, lastName);
}
}
Session 是 Hibernate 工作單元的核心,掌握「三態轉換」、「標準模板」、「脏檢查」與「線程安全」是高效使用的基石。持久化類遵循 POJO 規範,配合合理的映射策略,能充分發揮 ORM 的生產力優勢。