接第三部分內容,本章節就要簡單多了。
市場是無情的,機遇和危機無處不在。張三在經歷過生意紅火之后,接下來的一年內生意場上連連告負,不得不把自己的攤子收縮一下。這第一件事要把跑運輸的車賣掉,就是 那輛牌照為“ A00002”的 。package com.dao;import java.util.*;import net.sf.hibernate.*;import net.sf.hibernate.cfg.*;import bo.*;public class Test {?AutoInfo ai;?People people;?public void DoTest() {??try {???Configuration cfg = new Configuration().configure();???SessionFactory sessions = cfg.buildSessionFactory();???Session session = sessions.openSession();???Transaction tx = session.beginTransaction();???ai =????(AutoInfo) session.find(?????"from AutoInfo where LICENSE_PLATE='A00002'").get(?????0);???people = ai.getOwnerNo();???people.getAutoInfoSet().remove(ai);???session.delete(ai);???tx.commit();???session.close();??} catch (Exception e) {???System.out.println(e);??}?}}
package com.dao;
import java.util.*;
import net.sf.hibernate.*;import net.sf.hibernate.cfg.*;
import bo.*;
public class Test {
?AutoInfo ai;?People people;?public void DoTest() {??try {???Configuration cfg = new Configuration().configure();???SessionFactory sessions = cfg.buildSessionFactory();???Session session = sessions.openSession();???Transaction tx = session.beginTransaction();???ai =????(AutoInfo) session.find(?????"from AutoInfo where LICENSE_PLATE='A00002'").get(?????0);???people = ai.getOwnerNo();???people.getAutoInfoSet().remove(ai);???session.delete(ai);???tx.commit();???session.close();??} catch (Exception e) {???System.out.println(e);??}?}}
為什么要從 People 對象中移除某個 AutoInfo 對象?
??? 問得好!傳統 JDBC 程序可以直接刪除以“ A00002 ”為條件查詢出的記錄,這樣沒有問題。但如果在 Hibernate 中用同樣的方式直接刪除,會引起不小的麻煩:net.sf.hibernate.ObjectDeletedException: deleted object would be re-saved by cascade (remove deleted object from associations): 2, of class: bo.AutoInfo
??? 造成無法刪除的原因是 PEOPLE 和 AUTO_INFO 表存在著一對多( one-to-many )關系,想要從 AUTO_INFO 刪除一條記錄,就必須用 people.getAutoInfoSet().remove(ai) 方法為 People 移除以“ A00002 ”為條件查詢出的 AutoInfo 對象,才能真正刪除該 AutoInfo 對象。
??? 從張三的失落中回過頭來,這次 Hibernate 之旅也即將結束了。最后要體驗的是刪除 PEOPLE 表及其關聯的 AUTO_INFO 表。package com.dao;import java.util.*;import net.sf.hibernate.*;import net.sf.hibernate.cfg.*;import bo.*;public class Test {?People people;?public void DoTest() {??try {???Configuration cfg = new Configuration().configure();???SessionFactory sessions = cfg.buildSessionFactory();???Session session = sessions.openSession();???Transaction tx = session.beginTransaction();???people =????(People) session.load(People.class,new Integer(1));???session.delete(people);???tx.commit();???session.close();??} catch (Exception e) {???System.out.println(e);??}?}}
?People people;?public void DoTest() {??try {???Configuration cfg = new Configuration().configure();???SessionFactory sessions = cfg.buildSessionFactory();???Session session = sessions.openSession();???Transaction tx = session.beginTransaction();???people =????(People) session.load(People.class,new Integer(1));???session.delete(people);???tx.commit();???session.close();??} catch (Exception e) {???System.out.println(e);??}?}}
??? Hibernate 的優勢又一次體現出來。我們只需把一對多( one-to-many )關系中“ one ”這方刪除,與之相關聯的所有其他記錄會一并刪除。
??? 最后,通過這次旅程,也算把 Hibernate 的特性體驗了一把。作為一種 O/R Mapping 實現,它是很優秀的,希望我們都可以用好它。請注意!引用、轉貼本文應注明原作者:Rosen Jiang 以及出處:http://www.tkk7.com/rosen
Powered by: BlogJava Copyright © Rosen