級聯操作
所謂級聯操作就是說,當你進行主對象某個操作時,從對象hibernate自動完成相應操作。
比如: Department <---->Student 對象關系,我希望當我刪除一個department ,那麼就自動刪除該部門的所有學生。
再比如: bbs項目主帖<---->回帖 , 把主帖刪除,那我們就希望把該主帖的回帖自動刪除,這樣我們可以使用級聯(cascade)操作。
案例:如何配置級聯操作,當刪除某個部門的時候,我們自動刪除其學生.
首先我們在配置文件中修改:
<!-- 配置one-to-many關系cascade="delete" 當刪除該部門的時候(主對象,則級聯刪除它的學生從對象) -->
<set name="stus" cascade="delete">
<!-- 指定Student類對應的外鍵 -->
<key column="dept_id" />
<one-to-many class="Student" />
</set>
java代碼中操作:
Department department=new Department();
department.setName("業務部門");
Student stu1=new Student();
stu1.setName("小紅") ;
stu1.setDept(department);
Student stu2=new Student();
stu2.setName("小明");
stu2.setDept(department);
session.save(department);
session.save(stu1);
session.save(stu2);
Department department=(Department) s.get(Department.class, 41);
s.delete(department);
save-update
配置文件:
<set name="stus" cascade="save-update">
<!-- 指定Student類對應的外鍵 -->
<key column="dept_id" />
<one-to-many class="Student" />
</set>
java代碼:
1.Department department=new Department();
department.setName("業務部門");
Student stu1=new Student();
stu1.setName("小紅");
stu1.setDept(department);
Student stu2=new Student();
stu2.setName("小明");
stu2.setDept(department);
session.save(department);
雖然設置了級聯操作,但是這種情況下是只會保存部門的,因為沒有設置從部門到學生的反向外鍵引用。
可是如果在學生這邊設置級聯操作(學生是持有部門的外鍵引用的),當保存學生時,就可以將部門一並保存。
當還是從部門這邊做操作時,要改成下面操作才行:
2.Department department=new Department();
department.setName("業務部門3");
Student stu1=new Student();
stu1.setName("小紅");
Student stu2=new Student();
stu2.setName("小明");
Set<Student> students=new HashSet<Student>();
students.add(stu1);
students.add(stu2);
department.setStus(students); //明確使用集合關系保存
s.save(department);
說明:
① 在集合屬性和普通屬性中都能使用cascade
② 一般講cascade配置在one-to-many(one的一方,比如Employee-Department),和one-to-one(主對象一方)
struts+hibernate+接口編程
案例:留言本
這是韓順平老師所講hibernate案例中的一張框架圖。從上往下分別是web層、業務層、dao層、hibernate層、數據庫層。
在這個地方重點要學習是這個框架中的接口編程的方式,關注程序設計結構。
在框架中接口使得web層和業務層達到解耦的目的。在接口中聲明方法,在業務層中將其方法實現,可是在業務層中實現的方法可能需要改變,
為了在web層中保持代碼的不變性,在web層我們使用接口調用方法即可,
UsersServiceInter usersServiceInter=new UsersServiceImp();
而在我們學習使用Spring後,可以通過xml文件配置方法的方式配置 UsersServiceImp()即可,這樣解耦性更高了。
還有就是定義基礎接口和基礎實現類。因為在MessageServiceInter和UserServiceInter中可能有公共的方法,為了增強代碼的復用性,添加一個
基礎接口,而只在MessageServiceInter和UserServiceInter定義自己的特有方法。同時BaseServiceImpl是一個抽象類,它可以不完全實現
BaseServiceInter中的方法,因為有些方法都需要它的繼承者各自獨特實現而不定義統一方法實現。