如:商品對應(yīng)多個(gè)分類 分類對應(yīng)多個(gè)商品
多對多關(guān)聯(lián)關(guān)系 需要依賴中間表記錄關(guān)系
第一個(gè)對象(商品分類)
//商品分類
public class Category {
private Integer id;
private String name;
private Set<Item> items=new HashSet<>();//商品集合
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<Item> getItems() {
return items;
}
public void setItems(Set<Item> items) {
this.items = items;
}
}
第二個(gè)對象(商品)
//商品
public class Item {
private Integer id;
private String name;
private Set<Category> categories=new HashSet<>();//商品分類集合
public Set<Category> getCategories() {
return categories;
}
public void setCategories(Set<Category> categories) {
this.categories = categories;
}
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;
}
}
第一個(gè)對象(商品分類)映射文件
- set元素 table屬性指定中間表名
- 子元素key column屬性指定當(dāng)前持久化類在中間表的外鍵列名稱
- 使用many-to-many 指定多對多的關(guān)聯(lián)關(guān)系,column指定set集合中的持久化類在中間表的外鍵列名稱
<hibernate-mapping>
<class name="chen.Category" table="CATEGORY">
<id name="id" type="java.lang.Integer">
<column name="ID" />
<generator class="native" />
</id>
<property name="name" type="java.lang.String">
<column name="NAME" />
</property>
<!-- table指定中間表 -->
<set name="items" table="CATEGORY_ITEM">
<!-- column指定當(dāng)前持久化類在中間表的外鍵列名稱 -->
<key>
<column name="C_ID" />
</key>
<!-- 使用many-to-many 指定多對多的關(guān)聯(lián)關(guān)系,column指定set集合中的持久化類在中間表的外鍵列名稱 -->
<many-to-many class="chen.Item" column="I_ID"></many-to-many>
</set>
</class>
</hibernate-mapping>
商品分類
第二個(gè)對象(商品)映射文件
- 幾乎一樣 調(diào)換了key many-to-many的屬性值
- 兩邊都要維護(hù)會導(dǎo)致主鍵重復(fù) 所以要設(shè)置inverse="true"(兩邊任意)
<hibernate-mapping>
<class name="chen.Item" table="ITEMS">
<id name="id" type="java.lang.Integer">
<column name="ID" />
<generator class="native" />
</id>
<property name="name" type="java.lang.String">
<column name="NAME" />
</property>
<set name="categories" table="CATEGORY_ITEM" inverse="true">
<key column="I_ID"></key>
<many-to-many class="chen.Category" column="C_ID"></many-to-many>
</set>
</class>
</hibernate-mapping>
商品表
中間表
保存
/**
* 多對多關(guān)聯(lián)關(guān)系 需要中間表 保存
* 兩邊都要維護(hù)會導(dǎo)致主鍵重復(fù) 所以要設(shè)置inverse="true"
*/
public static void testManyToManySave() {
StandardServiceRegistry registry = new StandardServiceRegistryBuilder().configure().build();// 配置文件configure()
SessionFactory sessionFactory = new MetadataSources(registry).buildMetadata().buildSessionFactory();
Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
Category category1=new Category();
category1.setName("電器類");
Category category2=new Category();
category2.setName("小電器");
Category category3=new Category();
category3.setName("男性用品");
Item item=new Item();
item.setName("電動剃須刀");
Item item1=new Item();
item1.setName("蒸蛋器");
//設(shè)定關(guān)聯(lián)關(guān)系
category1.getItems().add(item);
category2.getItems().add(item);
category3.getItems().add(item);
category1.getItems().add(item1);
category2.getItems().add(item1);
item.getCategories().add(category1);
item.getCategories().add(category2);
item.getCategories().add(category3);
item1.getCategories().add(category1);
item1.getCategories().add(category2);
session.save(category1);
session.save(category2);
session.save(category3);
session.save(item);
session.save(item1);
transaction.commit();
session.close();
sessionFactory.close();
}
查詢
- 需要鏈接中間表 軟加載
/**
* 多對多關(guān)聯(lián)關(guān)系 查詢
*/
public static void testManyToManyGet() {
StandardServiceRegistry registry = new StandardServiceRegistryBuilder().configure().build();// 配置文件configure()
SessionFactory sessionFactory = new MetadataSources(registry).buildMetadata().buildSessionFactory();
Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
//需要鏈接中間表 軟加載
Category category=session.get(Category.class, 4);
System.out.println(category.getName());
System.out.println(category.getItems().size());
Item item=session.get(Item.class, 3);
System.out.println(item.getName());
System.out.println(item.getCategories().size());
transaction.commit();
session.close();
sessionFactory.close();
}