Hibernate实现多对一,一对多,多对多关系

一个Product对应一个Category,一个Category对应多个Product。故而Product和Category是多对一关系。

1.Category.java

package com.fubin.pojo;
import java.util.Set;
public class Category {
    int id;
    String name;
 
    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;
    }

}

2.Category.hbm.xml

<?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.fubin.pojo">
    <class name="Category" table="category_">
        <id name="id" column="id">
            <generator class="native"></generator>
        </id>
        <property name="name"/>
    </class>
</hibernate-mapping>

3. Product,java增加Category属性

package com.fubin.pojo;

import java.util.Set;

public class Product {
    int id;
    String name;
    float price;
    Category 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;
    }

    public float getPrice() {
        return price;
    }

    public void setPrice(float price) {
        this.price = price;
    }

    public Category getCategory() {
        return category;
    }

    public void setCategory(Category category) {
        this.category = category;
    }

}

4.  在Product,hbm.xml中设置Category多对一关系

many-to-one 标签设置多对一关系

name = "category"对应Product类中的category属性

class = "Category“ 表示对应Category类

column = "cid"表示指向category_表的外键

<?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.fubin.pojo">
    <class name="Product" table="product_">
        <id name="id" column="id">
            <generator class="native"></generator>
        </id>
        <property name="name"/>
        <property name="price"/>
        <many-to-one name="category" class="Category" column="cid"/>
    </class>
</hibernate-mapping>

5.在hibernate,cfg.xml中增加Category的映射

<mapping resource="com/fubin/pojo/Category.hbm.xml">

6.测试,增加一个新的Category对象,并将其设置为id=8的product的category。

Category c = new Category();
c.setName("c1");
s.save(c);
Product p = (Product)s.get(Product.class,8);
p.setCategory(c);
s.update(p);


而Category和Product是一对多关系。

1. 为Category增加一个Set集合

Set<Product> products;
 public Set<Product> getProducts() {
        return products;
    }

    public void setProducts(Set<Product> products) {
        this.products = products;
    }

2. 为Category.hbm.xml增加one-to-many映射

set 用于设置 一对多关系。

name="products”对应Category类中的products属性

lazy = "false"表示不适用延迟加载。

<key column="cid" not-null="false"/>表示外键是cid,可以为空

<one-to-many class="Product"/>表示一对多所对应的类是Product

 <set name="products" lazy="false">
            <key column="cid" not-null="false"></key>
            <one-to-many class="Product"/>
 </set>

3.测试,首先获取id=1的category。然后通过getProducts()直接取出其所对应的所有product.

Category c = (Category)s.get(Category.class,1);
Set<Product> ps = c.getProducts();
for(Product p:ps){
    System.out.print(p.getName());
}


一个Product可以被多个User购买,一个User可以购买多种Product.所以Product和User之间的关系是多对多,要实现多对多,必须有一张中间表 user_product用于维护User和Product之间的关系。

1.User.java

package com.fubin.pojo;
import java.util.Set;
public class User {
    int id;
    String name;
    Set<Product> products;

    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> getProducts() {
        return products;
    }

    public void setProducts(Set<Product> products) {
        this.products = products;
    }
}

2.User.hbm.xml

<?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.fubin.pojo">
    <class name="User" table="user_">
        <id name="id" column="id">
            <generator class="native">
            </generator>
        </id>
        <property name="name"/>

        <set name="products" table="user_product" lazy="false">
            <key column="uid"></key>
            <many-to-many column="pid" class="Product"/>
        </set>

    </class>
</hibernate-mapping>

3.Product.java

 public Set<User> getUsers() {
        return users;
    }

    public void setUsers(Set<User> users) {
        this.users = users;
    }

4, Product.hbm.xml

  <set name="users" table="user_product" lazy="false">
            <key column="pid"/>
            <many-to-many column="uid" class="User"/>
  </set>

5.在hibernate.cfg.xml中增加映射

 <mapping resource="com/how2java/pojo/User.hbm.xml" />

6.测试。新增三个用户,然后有一个产品1被三个用户所购买。

 Set<User> users = new HashSet<>();
     for(int i = 0; i < 3; i++){
         User u = new User();
         u.setName("user"+i);
         users.add(u);
         s.save(u);
        }
  Product p1 = (Product)s.get(Product.class,1);
  p1.setUsers(users);
  s.save(p1);
发布了25 篇原创文章 · 获赞 1 · 访问量 7526

猜你喜欢

转载自blog.csdn.net/qq_28334237/article/details/83892415