日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Hibernate一对多关联映射及cascade级联操作

發布時間:2025/1/21 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Hibernate一对多关联映射及cascade级联操作 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

我們以客戶(Customer)與訂單(Order)為例

實體類創建

Order訂單實體類

//訂單-----多的一方 public class Order {private Integer id;private Double money;private String receiverInfo; // 收貨地址// 訂單與客戶關聯private Customer c; // 描述訂單屬于某一個客戶public Customer getC() {return c;}public void setC(Customer c) {this.c = c;}public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public Double getMoney() {return money;}public void setMoney(Double money) {this.money = money;}public String getReceiverInfo() {return receiverInfo;}public void setReceiverInfo(String receiverInfo) {this.receiverInfo = receiverInfo;}}

Customer客戶實體類

//客戶 ------一的一方 public class Customer {private Integer id; // 主鍵private String name; // 姓名// 描述客戶可以有多個訂單private Set<Order> orders = new HashSet<Order>();public Set<Order> getOrders() {return orders;}public void setOrders(Set<Order> orders) {this.orders = orders;}public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}}

Hbm映射文件編寫

Order.hbm.xml配置文件

<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN""http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"><hibernate-mapping><class name="cn.nwtxxb.oneToMany.Order" table="t_order"><id name="id" column="c_id"><generator class="identity" /></id><property name="money" column="c_money" /><property name="receiverInfo" column="c_receiverInfo" length="50"/><!-- 多對一 --><many-to-one fetch="join" lazy="false" name="c" class="cn.nwtxxb.oneToMany.Customer" column="c_customer_id"></many-to-one><!-- name屬性它描述的是Order類中的一的一方的屬性名稱 Customer c;class 代表一的一方的類型column 描述的是一對多,在多的一方產生的外鍵的名稱 c_customer_id--></class></hibernate-mapping>

Customer.hbm.xml

<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN""http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"><hibernate-mapping><class name="cn.nwtxxb.oneToMany.Customer" table="t_customer"><id name="id" column="c_id"><generator class="identity" /></id><property name="name" column="c_name" length="20" /><!-- 一個客戶關聯多個訂單 --><set name="orders" inverse="true" cascade="save-update"><key column="c_customer_id" /><one-to-many class="cn.nwtxxb.oneToMany.Order" /></set><!-- 使用set來描述在一的一方中關聯的多 Set<Order>,它的name屬性就是set集合的名稱 key:它主要描述關聯的多的一方產生的外鍵名稱,注意要與多的一方定義的外鍵名稱相同 one-to-many 描述集合中的類型 --></class> </hibernate-mapping>

測試保存

public class OneToManyTest {// 測試保存@Testpublic void test1() {// 1.得到sessionSession session = HibernateUtils.openSession();session.beginTransaction();// 2.操作// 2.1創建一個客戶Customer c = new Customer();c.setName("張三");// 2.2創建兩個訂單Order o1 = new Order();o1.setMoney(1000d);o1.setReceiverInfo("北京");Order o2 = new Order();o2.setMoney(2000d);o2.setReceiverInfo("上海");// 2.3建立關系// 2.3.1 訂單關聯客戶o1.setC(c);o2.setC(c);// 2.3.2 客戶關聯訂單c.getOrders().add(o1);c.getOrders().add(o2);session.save(o1);session.save(o2);session.save(c);// 3.事務提交,關閉session.getTransaction().commit();session.close();} }

上面操作是一種雙向關聯
問題:我們可不可以只保存訂單或只保存客戶完成保存操作?

測試單向關聯保存

// 測試保存---單向操作(保存訂單并自動保存客戶)@Testpublic void test2() {// 1.得到sessionSession session = HibernateUtils.openSession();session.beginTransaction();// 2.操作// 2.1創建一個客戶Customer c = new Customer();c.setName("張三");// 2.2創建兩個訂單Order o1 = new Order();o1.setMoney(1000d);o1.setReceiverInfo("北京");Order o2 = new Order();o2.setMoney(2000d);o2.setReceiverInfo("上海");// 2.3建立關系// 2.3.1 訂單關聯客戶o1.setC(c);o2.setC(c);session.save(o1); // o1是一個持久化對象session.save(o2); // o2是一個持久化對象// 3.事務提交,關閉session.getTransaction().commit();session.close();}

org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: cn.nwtxxb.oneToMany.Customer
…………..
這個異常代表提一個持久化對象關聯了一個瞬時對象。
我們可以使用級聯操作來解決上述的問題.
我們現在要做的是保存訂單時保存客戶,需要在訂單的hbm配置文件中修改

<!-- 多對一 --> <many-to-one name="c" class="cn.nwtxxb.oneToMany.Customer" column="c_customer_id" cascade="save-update"> </many-to-one>

設置cascade=save-update 那么在保存訂單時就可以自動將客戶保存。
如果我們要完成保存客戶時,保存訂單

<!-- 一個客戶關聯多個訂單 --> <set name="orders" cascade="save-update"><key column="c_customer_id" /><one-to-many class="cn.nwtxxb.oneToMany.Order" /> </set>

雙向關聯保存

我們在開發中要配置雙向關聯配置。———可以通過任意一方來操作對方
在操作代碼,盡量來要進行單向關聯。——可以盡量資源浪費。
在雙向關聯中,會存在多余的update語句。
我們可以使用inverse屬性來設置,雙向關聯時由哪一方來維護表與表之間的關系。

<!-- 一個客戶關聯多個訂單 --> <set name="orders" inverse="true" cascade="save-update"><key column="c_customer_id" /><one-to-many class="cn.nwtxxb.oneToMany.Order" /> </set>

Inverse它的值如果為true代表,由對方來維護外鍵。
Inverse它的值如果為false代表,由本方來維護外鍵。
關于inverse的取值:
外鍵在哪一個表中,我們就讓哪一方來維護外鍵。

對象導航

級聯刪除

我們在刪除客戶時,也要刪除訂單,如果沒有做級聯,那么這個操作是不允許。
為了維護數據完整性

<!-- 一個客戶關聯多個訂單 --> <set name="orders" inverse="true" cascade="delete"><key column="c_customer_id" /><one-to-many class="cn.nwtxxb.oneToMany.Order" /> </set>

delete-orphan用法

<!-- 一個客戶關聯多個訂單 --> <set name="orders" inverse="true" cascade="delete-orphan"><key column="c_customer_id" /><one-to-many class="cn.nwtxxb.oneToMany.Order" /> </set>

測試類

public class OneToManyTest {// 級聯 cascade= delete-orphan@Testpublic void test6() {// 1.得到sessionSession session = HibernateUtils.openSession();session.beginTransaction();// 2.操作// 得到客戶Customer c = session.get(Customer.class, 2);// 得到客戶的訂單Order o = session.get(Order.class, 6);c.getOrders().remove(o);// 3.事務提交,關閉session.getTransaction().commit();session.close();}// 測試級聯刪除@Testpublic void test5() {// 1.得到sessionSession session = HibernateUtils.openSession();session.beginTransaction();// 操作----刪除訂單時,不需要刪除客戶,當我們刪除一個客戶時,應該將客戶對應訂單也刪除。Customer c = session.get(Customer.class, 1);session.delete(c);// 刪除客戶?訂單是否會刪除?// 3.事務提交,關閉session.getTransaction().commit();session.close();}// 測試一對多對象導航@Testpublic void test4() {// 1.得到sessionSession session = HibernateUtils.openSession();session.beginTransaction();// 操作// 2.1創建一個客戶Customer c = new Customer();c.setName("張三");// 2.2創建兩個訂單Order o1 = new Order();o1.setMoney(1000d);o1.setReceiverInfo("北京");Order o2 = new Order();o2.setMoney(2000d);o2.setReceiverInfo("上海");Order o3 = new Order();o3.setMoney(3000d);o3.setReceiverInfo("深圳");// 描述關系// o1要關聯co1.setC(c);// c要關聯o2 o3c.getOrders().add(o2);c.getOrders().add(o3);session.save(o1);// 3.事務提交,關閉session.getTransaction().commit();session.close();}// 測試保存---單向操作(保存客戶并自動保存訂單)@Testpublic void test3() {// 1.得到sessionSession session = HibernateUtils.openSession();session.beginTransaction();// 2.操作// 2.1創建一個客戶Customer c = new Customer();c.setName("張三");// 2.2創建兩個訂單Order o1 = new Order();o1.setMoney(1000d);o1.setReceiverInfo("北京");Order o2 = new Order();o2.setMoney(2000d);o2.setReceiverInfo("上海");// 2.3建立關系// 2.3.1 客戶與訂單關聯c.getOrders().add(o1);c.getOrders().add(o2);session.save(c);// 保存客戶// 3.事務提交,關閉session.getTransaction().commit();session.close();}// 測試保存---單向操作(保存訂單并自動保存客戶)@Testpublic void test2() {// 1.得到sessionSession session = HibernateUtils.openSession();session.beginTransaction();// 2.操作// 2.1創建一個客戶Customer c = new Customer();c.setName("張三");// 2.2創建兩個訂單Order o1 = new Order();o1.setMoney(1000d);o1.setReceiverInfo("北京");Order o2 = new Order();o2.setMoney(2000d);o2.setReceiverInfo("上海");// 2.3建立關系// 2.3.1 訂單關聯客戶o1.setC(c);o2.setC(c);session.save(o1); // o1是一個持久化對象session.save(o2); // o2是一個持久化對象// 3.事務提交,關閉session.getTransaction().commit();session.close();}// 測試保存@Testpublic void test1() {// 1.得到sessionSession session = HibernateUtils.openSession();session.beginTransaction();// 2.操作// 2.1創建一個客戶Customer c = new Customer();c.setName("張三");// 2.2創建兩個訂單Order o1 = new Order();o1.setMoney(1000d);o1.setReceiverInfo("北京");Order o2 = new Order();o2.setMoney(2000d);o2.setReceiverInfo("上海");// 2.3建立關系// 2.3.1 訂單關聯客戶o1.setC(c);o2.setC(c);// 2.3.2 客戶關聯訂單c.getOrders().add(o1);c.getOrders().add(o2);session.save(o1);session.save(o2);session.save(c);// 3.事務提交,關閉session.getTransaction().commit();session.close();} }

HibernateUtils工具類

public class HibernateUtils {private static Configuration config;private static SessionFactory sessionFactory;static{config=new Configuration().configure();sessionFactory=config.buildSessionFactory();}public static Session openSession(){return sessionFactory.openSession();} }

cascade級聯操作總結

使用cascade可以完成級聯操作
它可常用取值:
none這是一個默認值
save-update,當我們配置它時,底層使用save update或save-update完成操作,級聯保存臨時對象,如果是游離對象,會執行update.
delete 級聯刪除
delete-ophan 刪除與當前對象解除關系的對象。
all 它包含了save-update delete操作
all-delete-orphan 它包信了delete-orphan與all操作
問題:cascade與inverse有什么區別?
cascade它是完成級聯操作
Inverse它只有在雙向關聯情況下有作用,它來指定由哪一方維護外鍵。

總結

以上是生活随笔為你收集整理的Hibernate一对多关联映射及cascade级联操作的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 欧美一级日韩 | 亚洲精品日韩丝袜精品 | 国产女主播喷水高潮网红在线 | 国产精品女人久久久 | 亚洲一区国产一区 | 免费国产一区二区 | 一区二区三区四区免费 | 亚洲精品免费在线播放 | 日本免费在线一区 | 国产一区二区三区免费在线观看 | 国产a√| 国产酒店自拍 | 国产九区 | 日韩少妇视频 | 国产成人一区二区三区视频 | 四虎影院国产精品 | 欧美日韩人妻精品一区二区三区 | 动漫玉足吸乳羞免费网站玉足 | 久久综合操 | 精品在线视频播放 | 欧美精品免费在线 | 污在线观看 | 欧美精品国产动漫 | 蜜桃视频污 | 嫩草研究院在线 | 日本3级网站 | 污免费在线观看 | 福利视频第一页 | 香蕉视频国产 | 欧美多p | 日剧大尺度床戏做爰 | 第一色影院 | 销魂美女一区二区 | 亚洲国产欧美自拍 | 日韩av在线观看免费 | 天天操天天干视频 | 久久中文字幕人妻熟av女蜜柚m | 久久午夜片| 日韩三级中文字幕 | 偷拍夫妻性生活 | 日韩人妻一区二区三区 | 91免费看国产| 无码av天堂一区二区三区 | 51热门大瓜今日大瓜 | 新91av| 91av国产在线 | a天堂在线资源 | 在线观看jizz | 国产精品久久免费视频 | 久久在线精品视频 | 茄子视频色 | 亚洲av成人无码网天堂 | 天天曰夜夜操 | 香蕉久久一区二区三区 | 欧美猛操 | 97在线看 | 国产亚洲精品成人a | 伊人激情综合网 | 国内久久精品 | 午夜国产福利在线 | 国产999| 国产精品入口a级 | 李华月全部毛片 | 精品1区2区 | 内射国产内射夫妻免费频道 | 一眉道姑 电影 | 日日嗨av一区二区三区四区 | 国产视频自拍一区 | a在线观看| 黄色片网站在线播放 | 成年人网站免费观看 | 激情综合六月 | 女人十八岁毛片 | 日韩av在线播放一区 | 国产精品日韩在线观看 | 亚洲色图小说 | 国产一区欧美 | 亚洲精品福利网站 | 久久麻豆精品 | 国产美女www | 欧美成人黄色 | 免费一级片 | 深夜福利网站在线观看 | v天堂在线观看 | 国产suv精品一区二区33 | 国产在线青青草 | 中文字幕a√ | 国产精品一区二区久久 | 一个人看的www片免费高清中文 | 亚洲第一综合 | 亚洲中午字幕 | 8x8x最新网址 | 久久久999国产 | 日本h片在线观看 | 天天视频天天爽 | 乱色熟女综合一区二区三区 | 8x国产一区二区三区精品推荐 | 色999在线| 日韩网站免费观看高清 |