多对多的关联关系都是基于表实现的。
如果A类的实例关联多个B类的实例,而同时B类的实例也关联多个A类的实例,那么A和B就是双向的多对多关联关系。
A类和B类的演示代码如下:
public class A{
//A类其他属性
...
//存储B类对象的集合
private Set bs = new HashSet();
}
public class B{
//B类其他属性
...
//存储A类对象的集合
private Set as = new HashSet();
}
创建表:
create table category(
id int not null primary key,
name varchar(20)
);
create table items(
id int not null primary key,
name varchar(20),
price double
);
create table category_item(
category_id integer,
item_id integer,
primary key(category_id,item_id)
);
alter table category_item add constraint foreign key(category_id) references category(id);
alter table category_item add constraint foreign key(item_id) references items(id);
Category类
package manytomany;
import java.util.HashSet;
import java.util.Set;
public class Category {
private Integer id;
private String name;
private Set itemses = new HashSet(0);
public Category() {
}
public Category(Integer id) {
super();
this.id = id;
}
public Category(Integer id, String name) {
super();
this.id = id;
this.name = name;
}
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;
}
public Set getItemses() {
return itemses;
}
public void setItemses(Set itemses) {
this.itemses = itemses;
}
}
Items类
package manytomany;
import java.util.HashSet;
import java.util.Set;
public class Items {
private Integer id;
private String name;
private Double price;
private Set categories = new HashSet(0);
public Items() {
}
public Items(Integer id) {
super();
this.id = id;
}
public Items(Integer id, String name, Double price) {
super();
this.id = id;
this.name = name;
this.price = price;
}
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;
}
public Double getPrice() {
return price;
}
public void setPrice(Double price) {
this.price = price;
}
public Set getCategories() {
return categories;
}
public void setCategories(Set categories) {
this.categories = categories;
}
}
Category.hbm.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="manytomany.Category" table ="category" catalog="mldn">
<id name="id" type ="java.lang.Integer">
<column name="id"/>
<generator class ="assigned"/>
</id>
<property name="name" type ="java.lang.String">
<column name="name" length="20" />
</property>
<set name ="itemses" cascade="all" table="category_item">
<key>
<column name="category_id" not-null="true"/>
</key>
<many-to-many column="item_id" class="manytomany.Items"/>
</set>
</class>
</hibernate-mapping>
Item.hbm.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="manytomany.Items" table ="items" catalog="mldn">
<id name="id" type ="java.lang.Integer">
<column name="id"/>
<generator class ="assigned"/>
</id>
<property name="name" type ="java.lang.String">
<column name="name" length="20" />
</property>
<property name="price" type ="java.lang.Double">
<column name="price" precision="22" scale="0"/>
</property>
<set name ="categories" table="category_item">
<key>
<column name="item_id" not-null="true"/>
</key>
<many-to-many column="category_id" class="manytomany.Category"/>
</set>
</class>
</hibernate-mapping>
<mapping resource="manytomany/Category.hbm.xml" />
<mapping resource="manytomany/Items.hbm.xml" />
测试类:
public static void main(String[] args) {
Category c1 = new Category(1,"childbook");
Category c2 = new Category(2,"novel");
Items item1 = new Items(100,"Happy duck",20.9);
Items item2 = new Items(101,"Fate",13.9);
Items item3 = new Items(102,"Love tree",30.5);
c1.getItemses().add(item1);
c1.getItemses().add(item3);
c2.getItemses().add(item1);
c2.getItemses().add(item2);
Session session = HibernateSessionFactory.getSession();
Transaction tran = session.beginTransaction();
session.save(c1);
session.save(c2);
tran.commit();
}
显示结果: