一个Product对应一个Category
一个Category对应多个Product
所以Category和Product是一对多的关系
本例讲解如何使用Hibernate实现一对多关系
一个Category对应多个Product
所以Category和Product是一对多的关系
本例讲解如何使用Hibernate实现一对多关系
- 为Category增加一个Set集合
import java.util.Set; public class Category { 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; } int id; String name; Set<Product> products; public Set<Product> getProducts() { return products; } public void setProducts(Set<Product> products) { this.products = products; } }
- 为Category.hbm.xml增加one-to-many映射
<set 用于设置一对多(多对多也是他)关系,也可以用list,设置稍复杂点,这里使用简单的set来入门。<set name="products" lazy="false"> <key column="cid" not-null="false" /> <one-to-many class="Product" /> </set>
name="products" 对应 Category类中的products属性
lazy="false" 表示不使用延迟加载。关于延迟加载,请参考关系的延迟加载
<key column="cid" not-null="false" /> 表示外键是cid,可以为空
<one-to-many class="Product" /> 表示一对多所对应的类是Product
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="com.how2java.pojo"> <class name="Category" table="category_"> <id name="id" column="id"> <generator class="native"> </generator> </id> <property name="name" /> <set name="products" lazy="false"> <key column="cid" not-null="false" /> <one-to-many class="Product" /> </set> </class> </hibernate-mapping>
- TestHibernate 测试one-to-many关系
首先获取id=1的category,然后通过getProducts() 直接取出其所对应的所有product
import java.util.Set; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; import com.how2java.pojo.Category; import com.how2java.pojo.Product; public class TestHibernate { public static void main(String[] args) { SessionFactory sf = new Configuration().configure().buildSessionFactory(); Session s = sf.openSession(); s.beginTransaction(); Category c = (Category) s.get(Category.class, 1); Set<Product> ps = c.getProducts(); for (Product p : ps) { System.out.println(p.getName()); } s.getTransaction().commit(); s.close(); sf.close(); } }