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

Hibernate 進階(八):級聯操作詳解與 Struts+Hibernate+接口編程架構

     編輯:Java 綜合教學

級聯操作核心概念

級聯操作:對主對象操作時,Hibernate 自動對關聯的從對象執行相應操作。

典型場景

  • Department ←→ Student:刪除部門 → 自動刪除該部門所有學生
  • BBS 主帖 ←→ 回帖:刪除主帖 → 自動刪除所有回帖

級聯配置與代碼實戰

映射文件配置

<!-- Department.hbm.xml -->
<set name="stus" cascade="delete">
    <key column="dept_id" />
    <one-to-many class="Student" />
</set>

cascade="delete":刪除主對象時級聯刪除從對象。

Java 代碼驗證

// 保存數據
Department dept = new Department();
dept.setName("業務部門");

Student s1 = new Student(); s1.setName("小紅"); s1.setDept(dept);
Student s2 = new Student(); s2.setName("小明"); s2.setDept(dept);

session.save(dept);
session.save(s1);
session.save(s2);

// 刪除部門 → 級聯刪除學生
Department dept = (Department) session.get(Department.class, 41);
session.delete(dept); // 觸發級聯 delete

cascade 類型詳解

save-update

<set name="stus" cascade="save-update"> ... </set>

場景一:僅保存主對象(無反向引用)

Department dept = new Department();
dept.setName("業務部門3");
Student s1 = new Student(); s1.setName("小紅");
Student s2 = new Student(); s2.setName("小明");
Set<Student> set = new HashSet<>();
set.add(s1); set.add(s2);
dept.setStus(set); // 必須設置集合關系
session.save(dept); // 級聯保存學生

若不設置 dept.setStus(set),僅保存部門,學生不會級聯保存(無外鍵引用)。

場景二:從持有外鍵的一方操作


常用 cascade 值

值觸發操作
save-updatesave()/update()/saveOrUpdate()
deletedelete()
all包含以上所有 + lock/refresh/replicate
all-delete-orphanall + 孤兒刪除(從對象移出集合自動刪除)

配置位置原則

  • 集合屬性(one-to-many)和單端關聯(one-to-one 主對象側)
  • 通常配在「一」的一方(如 Department)

Struts + Hibernate + 接口編程架構

分層架構圖

架構分層圖

從上至下:Web層 → 業務層 → DAO層 → Hibernate層 → 數據庫層

接口編程核心:解耦

// Web 層調用業務層
UserServiceInter userService = new UserServiceImp(); // 面向接口
userService.register(user);
  • Web 層依賴接口,不依賴具體實現
  • 業務層實現接口,邏輯變更不影響 Web 層
  • 引入 Spring 後,通過 XML 配置實現類,解耦度更高:
    <bean id="userService" class="com.service.UserServiceImp"/>

基礎接口與抽象實現類

// 基礎接口:公共 CRUD
public interface BaseServiceInter<T> {
    void save(T entity);
    void delete(Serializable id);
    T get(Serializable id);
    List<T> list();
}

// 基礎實現:抽象類,部分方法留給子類實現
public abstract class BaseServiceImpl<T> implements BaseServiceInter<T> {
    // 通用邏輯實現
    public void save(T entity) { /* ... */ }
    // 某些方法需子類特定實現,不提供默認實現
    public abstract void delete(Serializable id);
}

// 業務接口繼承基礎接口,添加特有方法
public interface UserServiceInter extends BaseServiceInter<User> {
    User findByUsername(String username);
}

設計優勢

  • 復用性:公共邏輯集中在基類
  • 擴展性:子類實現特有業務
  • 解耦性:Web 層零依賴具體實現
  • Spring 整合:聲明式事務、依賴注入無縫接入
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved