hibernate笔记(3)——关系

表之间关系分:多对一、一对多、多对多

一个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() ;

一种Product可以被多个User购买 
一个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() ;
结果:


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值