多对多:
老师和学生,一个老师可以教多个学生,一个学生可以被多个老师教。
Book.java
package entity;
import java.io.Serializable;
import java.util.HashSet;
import java.util.Set;
public class Book implements Serializable {
private static final long serialVersionUID = -4507633746397878138L;
private Integer bookId;
private String bookName;
private Float price;
private Integer[] categoryIds = new Integer[] {};
public Integer[] getCategoryIds() {
return categoryIds;
}
public void setCategoryIds(Integer[] categoryIds) {
this.categoryIds = categoryIds;
}
private Set<Category> categoryies = new HashSet<Category>();
public Set<Category> getCategoryies() {
return categoryies;
}
public void setCategoryies(Set<Category> categoryies) {
this.categoryies = categoryies;
}
public Book(Integer bookId, String bookName) {
super();
this.bookId = bookId;
this.bookName = bookName;
}
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;
}
public Book() {
super();
}
@Override
public String toString() {
return "Book [bookId=" + bookId + ", bookName=" + bookName + ", price=" + price + "]";
}
}
多对多关系注意事项:
1.一定要定义一个主控方
2.关联关系编辑,不需要直接操作桥接表,hibernate的主控方会自动维护
Book.hbm.xml(非主控方)
<!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="entity.Book" table="t_book">
<id name="bookId" column="book_id" type="integer">
<generator class="native"></generator>
</id>
<property name="bookName" column="book_name" type="string"></property>
<property name="price" column="price" type="java.lang.Float"></property>
<set name="categoryies" table="t_book_category" inverse="true" cascade="save-update">
<!-- one -->
<key column="bid"></key>
<!-- many -->
<many-to-many class="entity.Category" column="cid"/>
</set>
</class>
</hibernate-mapping>
Category.java
package entity;
import java.io.Serializable;
import java.util.HashSet;
import java.util.Set;
public class Category implements Serializable {
private static final long serialVersionUID = -1071596622026998554L;
private Integer categoryId;
private String categoryName;
private Set<Book> books = new HashSet<Book>();
private boolean userCache;
public boolean isUserCache() {
return userCache;
}
public void setUserCache(boolean userCache) {
this.userCache = userCache;
}
public Set<Book> getBooks() {
return books;
}
public void setBooks(Set<Book> books) {
this.books = books;
}
public Category() {
super();
}
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;
}
@Override
public String toString() {
return "Category [categoryId=" + categoryId + ", categoryName=" + categoryName + "]";
}
}
Category.hbm.xml(主控方)
<!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="entity.Category" table="t_category">
<cache usage="read-only"/>
<id name="categoryId" column="category_id" type="integer">
<generator class="native"></generator>
</id>
<property name="categoryName" column="category_name" type="string"></property>
<!-- inverse="false" 主控方 -->
<set name="books" table="t_book_category" inverse="false" cascade="save-update">
<!-- one -->
<key column="cid"></key>
<!-- many -->
<many-to-many class="entity.Book" column="bid"/>
</set>
</class>
</hibernate-mapping>
测试:
package dao;
import java.util.List;
import org.junit.Before;
import org.junit.Test;
import entity.Book;
import entity.Category;
import utils.PageBean;
public class BookDAOTest {
private BookDAO bookDAO;
private Book book;
private Category category;
private CategoryDAO categoryDAO;
private PageBean pageBean;
@Before
public void setUp() throws Exception {
bookDAO = new BookDAO();
book = new Book();
category = new Category();
categoryDAO = new CategoryDAO();
pageBean = new PageBean();
}
@Test
public void testAdd() {
book.setBookName("云");
book.setPrice(250f);
book.setCategoryIds(new Integer[] {1,3});
bookDAO.add(book);
}
在核心配置文件中引入映射文件
<!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="entity.User" table="t_user">
<id name="id" column="id" type="java.lang.Integer">
<generator class="increment"></generator>
</id>
<version name="version" type="java.lang.Integer"></version>
<property name="userName" column="user_name" type="java.lang.String"></property>
<property name="userPwd" column="user_pwd" type="java.lang.String"></property>
<property name="realName" column="real_name" type="java.lang.String"></property>
<property name="sex" column="sex" type="java.lang.String"></property>
<property name="birthday" column="birthday" type="java.sql.Date"></property>
<property insert="false" update="false" name="createDatetime" column="create_datetime" type="java.sql.Timestamp"></property>
<property name="remark" column="remark" type="java.lang.String"></property>
</class>
</hibernate-mapping>
删除注意:
被控方先通过主控方解除多对多关系,再删除被控方