在實際業務處理中,往往會存在很多複雜的數據關聯關係,所以在使用 Hibernate 的時候需要掌握好,如何建立數據關聯的不同關係,如單向一對多,單向多對一,單向多對多,雙向一對多,雙向多對多…….
現在記錄學習如何在 Hibernate 中建立雙向多對多的複雜關聯關係:
以書店 BookStore 和書本 Book 爲例子,一個書店存放很多不同類型的書,一本書可以在多家書店中存貨,這樣形成一種雙向的多對多關係,下面來建立對應的類:
package com.wqt.POJO;
BookStore. java:
private int bookStore_id;
private String bookStore_name;
private Set<Book> books;
......//省略setter & getter & toString()
Book. java :
private int book_id;
private String book_name;
priavte Set<BookStore> bookStores;
......//省略setter & getter & toString()
在 hbm 文件中建立雙向多對多的關聯關係(核心部分):
BookStore.hbm.xml:
<set name="books" table="BookStore_Book" cascade="save-update">
<key column="bookStore_id"></key>
<many-to-many class="com.wqt.POJO.Book">
<column name="book_id" />
</many-to-many>
</set>
Book.hbm.xml:
<set name="bookStore" table="BookStore_Book" cascade="save-update">
<key column="book_id"></key>
<many-to-many class="com.wqt.POJO.BookStore">
<column name="bookStore_id">
</many-to-many>
</set>
從上面配置可以看到在 set 集合中關聯到了一個 table=”BookStore_Book” ,這就是雙向多對多關聯關係的主要實現:通過關聯表“BookStore_Book“來保存對象之間的關聯關係,具體關聯關係如圖所示:
雙向多對多關聯關係表:
關聯關係數據表建立完畢後,下面進行數據保存操作,並關聯部分數據:
Main. java:
BookStore bs1 = new BookStore();
BookStore bs2 = new BookStore();
BookStore bs3 = new BookStore();
bs1.setBookStore_name("新華書店");
bs2.setBookStore_name("國家圖書館");
bs3.setBookStore_name("Canada Library");
Book b1 = new Book();
Book b2 = new Book();
Book b3 = new Book();
Book b4 = new Book();
Book b5 = new Book();
b1.setBook_name("Oracle");
b2.setBook_name("Sun");
b3.setBook_name("Thinking in Java");
b4.setBook_name("國家通史");
b5.setBook_name("JVM");
// 設定關聯關係
// 需要先初始化容器
bs1.setBooks(new HashSet<Book>());
bs2.setBooks(new HashSet<Book>());
bs3.setBooks(new HashSet<Book>());
b1.setBookStore(new HashSet<BookStore>());
b2.setBookStore(new HashSet<BookStore>());
b3.setBookStore(new HashSet<BookStore>());
b4.setBookStore(new HashSet<BookStore>());
b5.setBookStore(new HashSet<BookStore>());
//設定關聯關係
bs1.getBooks().add(b1);
bs1.getBooks().add(b2);
bs1.getBooks().add(b5);
bs2.getBooks().add(b1);
bs2.getBooks().add(b4);
bs3.getBooks().add(b2);
bs3.getBooks().add(b3);
bs3.getBooks().add(b4);
bs3.getBooks().add(b5);
//保存插入到數據庫中
session.save(bs1);
session.save(bs2);
session.save(bs3);
session.save(b1);
session.save(b2);
session.save(b3);
session.save(b4);
session.save(b5);
將書店 BookStore 和書本 Book 數據關聯之後,保存到數據庫中即可。
此處應注意切勿重複關聯數據,否則會出現主鍵衝突錯誤;關聯關係的確立,只需要其中一方將關係關聯好即可,關聯操作實際上相當於將書店 BookStore 和 書本Book 的主鍵一起保存到關聯表 BookStore_Book 中去,所以不能存在重複的主鍵數據。
如有錯漏,歡迎指出。