級聯操作:對主對象操作時,Hibernate 自動對關聯的從對象執行相應操作。
Department ←→ Student:刪除部門 → 自動刪除該部門所有學生BBS 主帖 ←→ 回帖:刪除主帖 → 自動刪除所有回帖<!-- Department.hbm.xml -->
<set name="stus" cascade="delete">
<key column="dept_id" />
<one-to-many class="Student" />
</set>
cascade="delete":刪除主對象時級聯刪除從對象。
// 保存數據
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
<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-update | save()/update()/saveOrUpdate() |
delete | delete() |
all | 包含以上所有 + lock/refresh/replicate |
all-delete-orphan | all + 孤兒刪除(從對象移出集合自動刪除) |
one-to-many)和單端關聯(one-to-one 主對象側)
從上至下:Web層 → 業務層 → DAO層 → Hibernate層 → 數據庫層
// Web 層調用業務層 UserServiceInter userService = new UserServiceImp(); // 面向接口 userService.register(user);
<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);
}