hibernate(五)多對多
阿新 • • 發佈:2018-12-18
資料庫中不能直接對映多對多 處理:建立一個橋接表(中間表),將一個多對多關係轉換成兩個一對多
hibernate可以直接對映多對多關聯關係(看作兩個一對多)
3. 多對多關係注意事項 3.1 一定要定義一個主控方 3.2 多對多刪除 3.2.1 主控方直接刪除 3.2.2 被控方先通過主控方解除多對多關係,再刪除被控方 3.2.3 禁用級聯刪除 3.3 關聯關係編輯,不需要直接操作橋接表,hibernate的主控方會自動維護
案例:
資料庫表:
-- 書本類別表 create table t_hibernate_category ( category_id int primary key auto_increment, category_name varchar(50) not null ); -- 書本表 create table t_hibernate_book ( book_id int primary key auto_increment, book_name varchar(50) not null, price float not null ); -- 橋接表 -- 定義三個列,其實只要兩個列 -- 一個類別對應多本書,一本書對應多個類別 create table t_hibernate_book_category ( bcid int primary key auto_increment, bid int not null, cid int not null, foreign key(bid) references t_hibernate_book(book_id), foreign key(cid) references t_hibernate_category(category_id) ); insert into t_hibernate_book(book_id, book_name, price) values(1,'西遊記',50); insert into t_hibernate_book(book_id, book_name, price) values(2,'紅樓夢',50); insert into t_hibernate_book(book_id, book_name, price) values(3,'水滸',50); insert into t_hibernate_book(book_id, book_name, price) values(4,'三國演義',50); insert into t_hibernate_category(category_id, category_name) values(1,'古典'); insert into t_hibernate_category(category_id, category_name) values(2,'神話'); insert into t_hibernate_category(category_id, category_name) values(3,'歷史'); insert into t_hibernate_book_category(bid, cid) values(1,1); insert into t_hibernate_book_category(bid, cid) values(1,2); insert into t_hibernate_book_category(bid, cid) values(2,1); insert into t_hibernate_book_category(bid, cid) values(3,1); insert into t_hibernate_book_category(bid, cid) values(3,3); insert into t_hibernate_book_category(bid, cid) values(4,1); insert into t_hibernate_book_category(bid, cid) values(4,3);
Book.java
package com.zking.five.entity; import java.util.HashSet; import java.util.Set; public class Book { // -- 書本表 // create table t_hibernate_book // ( // book_id int primary key auto_increment, // book_name varchar(50) not null, // price float not null // ); private Integer bookid; private String bookname; private float price; private Set<Category> categorys = new HashSet<>();//多對多 private Integer initcategorys = 0; public Set<Category> getCategorys() { return categorys; } public void setCategorys(Set<Category> categorys) { this.categorys = categorys; } public Integer getInitcategorys() { return initcategorys; } public void setInitcategorys(Integer initcategorys) { this.initcategorys = initcategorys; } public Integer getBookid() { return bookid; } public void setBookid(Integer bookid) { this.bookid = bookid; } public String getBookname() { return bookname; } public void setBookname(String bookname) { this.bookname = bookname; } public float getPrice() { return price; } public void setPrice(float price) { this.price = price; } }
Category.java
package com.zking.five.entity; import java.util.HashSet; import java.util.Set; public class Category { // create table t_hibernate_category // ( // category_id int primary key auto_increment, // category_name varchar(50) not null // ); private Integer categoryId; private String categoryName; private Set<Book> books = new HashSet<>(); private Integer initbooks = 0; public Set<Book> getBooks() { return books; } public void setBooks(Set<Book> books) { this.books = books; } public Integer getInitbooks() { return initbooks; } public void setInitbooks(Integer initbooks) { this.initbooks = initbooks; } public Integer getCategoryId() { return categoryId; } public void setCategoryId(Integer categoryId) { this.categoryId = categoryId; } public String getCategoryName() { return categoryName; } public void setCategoryName(String categoryName) { this.categoryName = categoryName; } }
用來檢驗所有對映的配置檔案是否準確:
SessionFactoryUtils.java
package com.zking.two.util;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
/**
* 1、方便獲取session會話,用來操作資料庫
* 2、用來檢驗所有對映的配置檔案是否準確
*
* @author Administrator
*
*/
public class SessionFactoryUtils {
private static SessionFactory sessionFactory;
static {
Configuration cfg = new Configuration().configure("hibernate.cfg.xml");
sessionFactory = cfg.buildSessionFactory(); //通過xml建模得到sessionfactory工廠
}
//獲取session
public static Session getSession() {
Session session = sessionFactory.getCurrentSession();
if(session == null) {
session = sessionFactory.openSession();
}
return session;
}
//關閉session
public static void closeSession() {
Session session = sessionFactory.getCurrentSession();
if(session != null && session.isOpen()) {//如果開啟,建立了session,就把它關閉
session.close();
}
}
public static void main(String[] args) {
Session session = SessionFactoryUtils.getSession();
session.beginTransaction();
System.out.println(session.isConnected());
SessionFactoryUtils.closeSession();
System.out.println(session.isConnected());
}
}
dao方法:
BookDao.java
package com.zking.five.dao;
import java.io.Serializable;
import org.hibernate.Hibernate;
import org.hibernate.Session;
import org.hibernate.Transaction;
import com.zking.five.entity.Book;
import com.zking.two.util.SessionFactoryUtils;
public class BookDao {
public Book getBook(Book book) {
Session session = SessionFactoryUtils.getSession();
Transaction transaction = session.beginTransaction();
Book b = session.get(Book.class, book.getBookid());
if(b !=null && new Integer(1).equals(book.getInitcategorys()) ) {
Hibernate.initialize(b.getCategorys());
}
transaction.commit();
session.close();
return b;
}
public Integer add(Book book) {
Session session = SessionFactoryUtils.getSession();
Transaction transaction = session.beginTransaction();
Integer bid = (Integer) session.save(book);
transaction.commit();
session.close();
return bid;
}
public void delete(Book book) {
Session session = SessionFactoryUtils.getSession();
Transaction transaction = session.beginTransaction();
session.delete(book);
transaction.commit();
session.close();
}
}
CategoryDao.java
package com.zking.five.dao;
import org.hibernate.Hibernate;
import org.hibernate.Session;
import org.hibernate.Transaction;
import com.zking.five.entity.Book;
import com.zking.five.entity.Category;
import com.zking.two.util.SessionFactoryUtils;
public class CategoryDao {
public Category getCategory(Category category) {
Session session = SessionFactoryUtils.getSession();
Transaction transaction = session.beginTransaction();
Category c = session.get(Category.class, category.getCategoryId());
if(c !=null && new Integer(1).equals(category.getInitbooks()) ) {
Hibernate.initialize(c.getBooks());
}
transaction.commit();
session.close();
return c;
}
public Integer add(Category category) {
Session session = SessionFactoryUtils.getSession();
Transaction transaction = session.beginTransaction();
Integer cid = (Integer) session.save(category);
transaction.commit();
session.close();
return cid;
}
public void delete(Category category) {
Session session = SessionFactoryUtils.getSession();
Transaction transaction = session.beginTransaction();
Category c = session.get(Category.class, category.getCategoryId());
for (Book b : c.getBooks()) {
// c.getBooks().remove(c);
b.getCategorys().remove(c);
}
session.delete(c);
transaction.commit();
session.close();
}
}
配置:
Book.hbm.xml
Category.hbm.xml
Junit測試:
private BookDao bookDao = new BookDao();
private CategoryDao categoryDao = new CategoryDao();
@Test
public void testGetBook() {
Book book = new Book();
book.setBookid(4);
book.setInitcategorys(1);
Book b = this.bookDao.getBook(book);
System.out.println(b.getBookname());
for (Category c : b.getCategorys()) {
System.out.println(" "+c.getCategoryName());
}
}
@Test
public void testGetCategory() {
Category category = new Category();
category.setCategoryId(1);
category.setInitbooks(1);
Category c = this.categoryDao.getCategory(category);
System.out.println(c.getCategoryName());
for (Book ca : c.getBooks()) {
System.out.println(" "+ca.getBookname());
}
}
結果如下: