表之间关系分:多对一、一对多、多对多
一个Product对应一个Category (注:接上期笔记Product类)
一个Category对应多个Product
所以Product和Category是
多对一
的关系
步骤一:为Product.java增加Category属性
private Category category;
public Category getCategory() {
return category;
}
public void setCategory(Category category) {
this.category = category;
}
步骤二:
在Product.hbm.xml中设置Category 多对一关系
<many-to-one
name
="category"
class
="Category"
column
="cid"
/>
在hibernate.cfg.xml中增加Category的映射
<mapping
resource
="com/java/pojo/Category.hbm.xml"
/>
步骤三:测试
SessionFactory sf =
new
Configuration().configure().buildSessionFactory()
;
Session s = sf.openSession()
;
s.beginTransaction()
;
Category category = new Category();
category.setName("生活用品");
s.save(category);
Product product = new Product();
product.setName("肥皂");
product.setCategory(category);
s.save(product);
s.getTransaction().commit()
;
s.close()
;
sf.close()
;
所以Category和Product是一对多的关系
步骤一:为Category增加一个Set集合
package
com.java.pojo
;
import
java.util.Set
;
public class
Category {
private int
id
;
private
String
name
;
private Set<Product> productSet;
public int
getId
() {
return
id
;
}
public void
setId
(
int
id) {
this
.
id
= id
;
}
public
String
getName
() {
return
name
;
}
public void
setName
(String name) {
this
.
name
= name
;
}
public Set<Product> getProductSet() {
return productSet;
}
public void setProductSet(Set<Product> productSet) {
this.productSet = productSet;
}
}
步骤二:为Category.hbm.xml增加one-to-many映射
<!--<set 用于设置一对多(多对多也是他)关系,也可以用list,设置稍复杂点,这里使用简单的set来入门-->
<!--name="productSet"对应Category类中的productSet属性 lazy="false"表示不使用延迟加载-->
<set
name
="productSet"
lazy
="false"
>
<key
column
="cid"
not-null
="false"
/>
<!--表示外键是cid,可以为空-->
<one-to-many
class
="Product"
/>
<!--一对多所对应的类是Product-->
</set>
步骤三:测试
SessionFactory sf =
new
Configuration().configure().buildSessionFactory()
;
Session s = sf.openSession()
;
Category category = (Category)s.get(Category.class, 1);
Set<Product> productSet = category.getProductSet();
for
(Product p : productSet) {
System.
out
.println(p.getName())
;
}
s.close()
;
sf.close()
;
一个User可以购买多种Product
所以Product和User之间的关系是
多对多
many-to-many
要实现多对多关系,必须有一张
中间表
user_product 用于维护 User和Product之间的关系
步骤一:User.java
package com.java.pojo;
import java.util.Set;
public class User {
private int id;
private String name;
private Set<Product> productSet;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Set<Product> getProductSet() {
return productSet;
}
public void setProductSet(Set<Product> productSet) {
this.productSet = productSet;
}
}
步骤二:User.hbm.xml
<hibernate-mapping package="com.java.pojo">
<class name="User" table="user_">
<id name="id" column="id">
<generator class="native" />
</id>
<property name="name" />
<set name="productSet" table="user_product" lazy="false">
<key column="uid" />
<many-to-many column="pid" class="Product" />
</set>
</class>
</hibernate-mapping>
步骤三:为Product类增加User集合
private
Set<User>
userSet
;
public void
setCategory
(Category category) {
this
.
category
= category
;
}
public
Set<User>
getUserSet
() {
return
userSet
;
}
步骤四:Product.hbm.xml
<set
name
="userSet"
table
="user_product"
lazy
="false"
>
<key
column
="pid"
/>
<many-to-many
column
="uid"
class
="User"
/>
</set>
步骤五: 在hibernate.cfg.xml中增加User的映射
<mapping
resource
="com/java/pojo/User.hbm.xml"
/>
步骤六:测试
SessionFactory sf =
new
Configuration().configure().buildSessionFactory()
;
Session s = sf.openSession()
;
s.beginTransaction()
;
Set<User> userSet = new HashSet<>();
for(int i = 1; i < 4; i++) {
User u = new User();
u.setName("user"+i);
s.save(u);
userSet.add(u);
}
Product product = (Product)s.get(Product.class, 1);
product.setUserSet(userSet);
s.update(product);
Set<Product> productSet = new HashSet<>();
for (int i = 2; i < 10; i++) {
Product p = (Product)s.get(Product.class, i);
productSet.add(p);
}
User user4 = new User();
user4.setName("user4");
user4.setProductSet(productSet);
s.save(user4);
s.getTransaction().commit()
;
s.close()
;
sf.close()
;
结果: