hibernate之多对多映射操做中间表

1.需求

1.1 在一个网上商城里有订单表,商品表,那么一个订单内能够有多个商品,一个商品能够被多个订单拥有。订单与商品就造成了多对多的关系,那么咱们如何将这个关系经过hibernate映射到数据库呢?java

1.2 解决思路,hibernate为咱们提供了,多对多的映射,web

<set ...>
        <many-to-many>
    </set>

这个方法的确可行,可是经过这个方法咱们的中间表并不能操做其余数据,如订单记录中还有着数量以及购买单价字段,那么咱们没法操做这些字段。数据库

1.3 经过将多对多,转换为两个一对多的映射完成需求,并为中间表创建对应的实体。session

2.实现

2.1 商品实体类app

package com.lab9.domain;

import java.util.HashSet;
import java.util.Set;

public class Product {
    Integer id;
    String name;
    double price;
    String description;
    Set<OrderItem> orderitems = new HashSet<OrderItem>();
    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 double getPrice() {
        return price;
    }
    public void setPrice(double price) {
        this.price = price;
    }
    public String getDescription() {
        return description;
    }
    public void setDescription(String description) {
        this.description = description;
    }
    public Set<OrderItem> getOrderitems() {
        return orderitems;
    }
    public void setOrderitems(Set<OrderItem> orderitems) {
        this.orderitems = orderitems;
    }


}

2.2 订单实体dom

package com.lab9.domain;

import java.util.HashSet;
import java.util.Set;

public class Order {
    private Integer id;
    double total;
    String realname;
    String phone;
    String address;
    String postcode;
    Set<OrderItem> orderitems = new HashSet<OrderItem>();
    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public double getTotal() {
        return total;
    }
    public void setTotal(double total) {
        this.total = total;
    }
    public String getRealname() {
        return realname;
    }
    public void setRealname(String realname) {
        this.realname = realname;
    }
    public String getPhone() {
        return phone;
    }
    public void setPhone(String phone) {
        this.phone = phone;
    }
    public String getAddress() {
        return address;
    }
    public void setAddress(String address) {
        this.address = address;
    }
    public String getPostcode() {
        return postcode;
    }
    public void setPostcode(String postcode) {
        this.postcode = postcode;
    }
    public Set<OrderItem> getOrderitems() {
        return orderitems;
    }
    public void setOrderitems(Set<OrderItem> orderitems) {
        this.orderitems = orderitems;
    }   
}

2.3 中间表(记录订单,商品,购买数量,购买单价)svg

package com.lab9.domain;

public class OrderItem {

    Integer id;
    Order order;
    Product product;
    int quantity;
    double purchase;
    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public Order getOrder() {
        return order;
    }
    public void setOrder(Order order) {
        this.order = order;
    }
    public Product getProduct() {
        return product;
    }
    public void setProduct(Product product) {
        this.product = product;
    }
    public int getQuantity() {
        return quantity;
    }
    public void setQuantity(int quantity) {
        this.quantity = quantity;
    }
    public double getPurchase() {
        return purchase;
    }
    public void setPurchase(double purchase) {
        this.purchase = purchase;
    }

}

2.4 映射文件post

<!---product.hbm.xml--->
<?xml version='1.0' encoding='utf-8'?> 
<!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.lab9.domain">
    <class name="Product" table="product">
        <id name="id" column="id" type="integer">
            <generator class="native"></generator>
        </id>
        <property name="name" type="string" length="16" not-null="true" column="name"></property>
        <property name="price" type="double" column="price"></property>
        <property name="description" type="string" length="16" column="description"></property>

        <!-- 一对多 -->
        <set name="orderitems" table="orderitem"> 
            <key column="product_id"></key>
            <one-to-many class="OrderItem"/>
        </set>
    </class>
</hibernate-mapping>

<!---order.hbm.xml--->
<hibernate-mapping package="com.lab9.domain">
    <class name="Order" table="orders">
        <id name="id" column="id" type="integer">
            <generator class="native"></generator>
        </id>
        <property name="total" type="double" not-null="true" column="total"></property>
        <property name="realname" type="string" length="8" column="realname"></property>
        <property name="phone" type="string" length="16" column="phone"></property>
        <property name="address" type="string" length="16" column="address"></property>
        <property name="postcode" type="string" length="6" column="postcode"></property>

        <!-- 一对多 -->
        <set name="orderitems" table="orderitem"> 

            <key column="order_id"></key>

            <one-to-many class="OrderItem"/>

        </set>
    </class>
</hibernate-mapping>

<!---orderitem.hbm.xml--->
<hibernate-mapping package="com.lab9.domain">
    <class name="OrderItem" table="orderitem">
        <id name="id" column="id" type="integer">
            <generator class="native"></generator>
        </id>
        <many-to-one name="order" class="Order" column="order_id"></many-to-one>
        <many-to-one name="product" class="Product" column="product_id" fetch="join"></many-to-one>

        <property name="quantity" type="integer" column="quantity" not-null="true"></property>
        <property name="purchase" type="double" column="purchase" not-null="true"></property>
    </class>
</hibernate-mapping>

2.5测试类测试

public class Client {
    private static SessionFactory sf;
    private static Session session;


    public static void main(String[] args) {

        StandardServiceRegistry registy = new StandardServiceRegistryBuilder().configure().build();
        sf = new MetadataSources(registy).buildMetadata().buildSessionFactory();
        session = sf.openSession();
        Transaction tx = session.beginTransaction();

        //订单一
        Order order = new Order();
        order.setTotal(1000);
        order.setAddress("华软");
        order.setRealname("李浩然");
        order.setPostcode("510990");
        order.setPhone("87818998");

        //订单二
        Order order2 = new Order();
        order2.setTotal(5000);
        order2.setAddress("中大");
        order2.setRealname("李明");
        order2.setPostcode("510000");
        order2.setPhone("38008781");


        //产品1
        Product pro = new Product();
        pro.setName("thinkpad电脑");
        pro.setDescription("thinkpad");
        pro.setPrice(6780);

        //产品2
        Product p2 = new Product();
        p2.setName("彩电");
        p2.setDescription("性价比高");
        p2.setPrice(200);

        //产品3
        Product p3 = new Product();
        p3.setName("tcl彩电");
        p3.setPrice(3600);
        p3.setDescription("tcl彩电");

        //订单记录
        OrderItem item1 = new OrderItem();
        OrderItem item2 = new OrderItem();
        OrderItem item3 = new OrderItem();
        OrderItem item4 = new OrderItem();

        //一个订单有多条商品记录
        item1.setOrder(order);
        item1.setProduct(pro);
        item1.setQuantity(100);
        item1.setPurchase(6000);

        item2.setOrder(order);
        item2.setProduct(p2);
        item2.setQuantity(200);
        item2.setPurchase(3000);
        order.getOrderitems().add(item1);
        order.getOrderitems().add(item2);

        //一个商品有多条商品记录
        item3.setOrder(order2);
        item3.setProduct(p3);
        item3.setQuantity(30);
        item3.setPurchase(3300);

        item4.setOrder(order2);
        item4.setProduct(pro);
        item4.setQuantity(60);
        item4.setPurchase(6200);
        order2.getOrderitems().add(item3);
        order2.getOrderitems().add(item4);




        try
        {
            //保存记录
            session.save(order);
            session.save(pro);
            session.save(p2);
            session.save(item1);
            session.save(item2);
            session.save(order2);
            session.save(p3);
            session.save(item3);
            session.save(item4);

            //查询
            Order myOrder = (Order)session.get(Order.class, 9);
            if(myOrder != null)
            {
                int costMoney = 0;
                for(OrderItem item:myOrder.getOrderitems())
                {
                    costMoney += (item.getQuantity()*item.getPurchase());
                }
                System.out.println("订单号:"+myOrder.getId());
                System.out.println("总花费:"+costMoney+"\n"+"购买了如下商品:");
                for(OrderItem item:myOrder.getOrderitems())
                {
                    System.out.println("商品名:"+item.getProduct().getName());
                }

            }

            tx.commit();
        }
        catch(Exception e)
        {
            e.printStackTrace();
            tx.rollback();
        }
        session.close();
    }
}