Hibernate映射关联(2)

来源:互联网 发布:网络包工头在哪找活 编辑:程序博客网 时间:2024/06/05 04:32

Hibernate映射关联(2)

1、一般情况下,为了方便维护数据,在多对多中会生成一张中间表。

情况一:如果中间表仅仅是做关联用的,它里面仅有2个外键做联合主键,则使用ManyToMany(不用写中间表的Model,只需要写出两张主表的model即可)。
情况二:如果中间表还有其他属性,例如订单和产品,通常还会有单价和数量会作为中间表的属性。这时,我们不能再用ManyToMany。
我们必须把多对多拆成两个一对多。
使用的hiberenate为5.2.9
Order.java

package com.ljs.bean;import java.util.HashSet;import java.util.Set;public class Order {    private Integer id;    private double total;    private String realname;    private String phone;    private String address;    private String postcode;    private 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;    }}

Product

package com.ljs.bean;import java.util.HashSet;import java.util.Set;public class Product {    private Integer id;    private String name;    private double price;    private String description;    private 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;    }}

OrderItem

package com.ljs.bean;public class OrderItem {    private Integer id;    private Order order;    private Product product;    private Integer quantity;    private double purchasePrice;    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 Integer getQuantity() {        return quantity;    }    public void setQuantity(Integer quantity) {        this.quantity = quantity;    }    public double getPurchasePrice() {        return purchasePrice;    }    public void setPurchasePrice(double purchasePrice) {        this.purchasePrice = purchasePrice;    }}

Order.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.ljs.bean">    <class name="Order" table="orders" >        <id name="id" type="integer">            <generator class="native"/>        </id>    <property name="total" type="double"/>    <property name="realname" type="string" length="12"/>    <property name="phone" type="string" length="11"/>    <property name="address" type="string" length="50"/>    <property name="postcode" type="string" length="12"/>    <set name="orderitems" table="OrderItem" cascade="save-update" lazy="false">        <key column="oid"/>        <one-to-many class="OrderItem"/>    </set>    </class></hibernate-mapping>

Product.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.ljs.bean">        <class name="Product" table="products">            <id name="id" type="integer">                <generator class="native"/>            </id>        <property name="name" type="string" length="20"/>        <property name="price" type="double"/>        <property name="description" type="string" length="50"/>        <set name="orderitems" table="OrderItem" lazy="false">            <key column="pid"/>            <one-to-many class="OrderItem"/>        </set>        </class>    </hibernate-mapping>

OrderItem.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.ljs.bean">        <class name="OrderItem" table="OrderItem">            <id name="id" type="integer">                <generator class="native"/>            </id>            <property name="quantity" type="integer" length="4"/>            <property name="purchasePrice" type="double"/>            <many-to-one name="order" class="Order" column="oid" lazy="false"/>            <many-to-one name="product" class="Product" column="pid" cascade="save-update" lazy="false"/>        </class>    </hibernate-mapping>

Test.java

package com.ljs.test;import com.ljs.bean.Order;import com.ljs.bean.OrderItem;import com.ljs.bean.Product;import com.ljs.dao.OrderDao;import com.ljs.dao.impl.OrderDaoImpl;public class Test {    static OrderDao o = new OrderDaoImpl();    public static void main(String[] args) {        // TODO Auto-generated method stub        //订单一        Order o1 = new Order();        o1.setRealname("李浩然");        o1.setPostcode("510990");        o1.setAddress("广州华软");        o1.setPhone("87818998");        //订单二        Order o2 = new Order();        o2.setRealname("李明");        o2.setPostcode("510000");        o2.setAddress("广州中大");        o2.setPhone("87818998");        //产品一        Product p1 = new Product();        p1.setName("笔记本电脑");        p1.setPrice(6780);        p1.setDescription("散热性能好");        //产品二        Product p2 = new Product();        p2.setName("32彩电");        p2.setPrice(3699);        p2.setDescription("性价比好");        //产品三        Product p3 = new Product();        p3.setName("39彩电");        p3.setPrice(3600);        p3.setDescription("性价比好");        //订单记录        OrderItem oi1 = new OrderItem();        OrderItem oi2 = new OrderItem();        OrderItem oi3 = new OrderItem();        OrderItem oi4 = new OrderItem();        //一个订单有多条商品记录        oi1.setOrder(o1);        oi1.setProduct(p1);        oi1.setQuantity(100);        oi1.setPurchasePrice(6000);        oi2.setOrder(o1);        oi2.setProduct(p2);        oi2.setQuantity(200);        oi2.setPurchasePrice(3000);        o1.getOrderitems().add(oi1);        o1.getOrderitems().add(oi2);        //一个商品有多条商品记录        oi3.setOrder(o2);        oi3.setProduct(p3);        oi3.setQuantity(30);        oi3.setPurchasePrice(3300);        oi4.setOrder(o2);        oi4.setProduct(p1);        oi4.setPurchasePrice(6200);        oi4.setQuantity(60);        o2.getOrderitems().add(oi3);        o2.getOrderitems().add(oi4);        //持久化        o.addOrder(o1);        o.addOrder(o2);        //查询        Order sorder = o.findOrderById(1);        if(sorder!=null) {            double fmoney = 0.0;            for(OrderItem oi:sorder.getOrderitems()) {                fmoney+=(oi.getPurchasePrice()*oi.getQuantity());            }            System.out.println("订单号:"+sorder.getId());            System.out.println("总花费:"+fmoney+"\n"+"购买了以下商品:");            for(OrderItem item:sorder.getOrderitems())            {                System.out.println("商品名:"+item.getProduct().getName());            }        }       }}

出现的问题:

1、order是个sql关键字,所以不能用order作为表名,有两种方法修改表名为默认的类名,一种是在映射文件的class中直接设置属性table为其他表名。第二种是使用注解。会报错

Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'order (total, realname, phone, address, postcode) values (0.0, '�浩然', '878' at line 1

2、当你在查询时候,要用到lazy=“false”,懒加载。默认都是为true,及查询一个主对象时,不会加载其关联的属性。而且得在双方的关联配置
中设置lazy=“false”。否则会报错。

failed to lazily initialize a collection of role: com.ljs.bean.Order.orderitems, could not initialize proxy - no Session
原创粉丝点击