Hibernate关联映射

本文讲解Hibernate关联映射的例子,以订单和客户之间的关联关系来说明。我们知道,在一个电商网站中,一个客户可以有多个订单,反过来多个订单可以属于同一个客户。那么在Hibernate中怎样把这里面的关联关系映射好,是下面要阐述的问题。
首先我们要在数据库中创建两张表一个是客户表另一个是订单表。内容如下:
客户表:
这里写图片描述
这个表包含一个主键id以及用户名称(username)。
订单表:
这里写图片描述
这个表也有一个主键id,type(商品类型)、ordernumber(商品流水号)、customID(引用客户表主键id的一个外键),其实关联映射就是通过这个外键来实现的。
表创建好后,相当于完成了ORM中的R也就是关系表的创建,现在讲一下O的配置,也即数据库中对应的JAVABEAN(实体类)。
客户的实体类为:

package com.ev.entity.user;

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

public class User {
    private Integer id;
    private String username;
    private Set orderSet = new HashSet();
    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public Set getOrderSet() {
        return orderSet;
    }
    public void setOrderSet(Set orderSet) {
        this.orderSet = orderSet;
    }

}

在这个实体类中多了一个字段orderSet ,这个就是用来存放每个客户对应的订单,多个订单放在HashSet中,而对这个实体类所做的关联映射操作其实是针对这个属性字段的。它对应的User.hbm.xml映射文件为:

<?xml version="1.0"?>
<!--
  ~ Hibernate, Relational Persistence for Idiomatic Java
  ~
  ~ License: GNU Lesser General Public License (LGPL), version 2.1 or later.
  ~ See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
  -->
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">

<hibernate-mapping>

    <class name="com.ev.entity.user.User" table="user">
        <id name="id">
            <generator class="native" />
        </id>
        <property name="username"/>
        <set name="orderSet">
            <key column="customID"></key>
            <one-to-many  class="com.ev.entity.orders.Orders"></one-to-many>
        </set>
    </class>

</hibernate-mapping>

class里面的set子元素就是对orderSet属性做了关联映射,one-to-many元素在这里指一个客户可以有多个订单,在这个元素中classs属性值指定了存放于HashSet集合中的数据类型,即订单类型,在这里指向一个订单的实体类,接下来会讲到。key元素中的column属性值引用之前创建的订单中的外键。
接下来是订单的实体类:

package com.ev.entity.orders;

import com.ev.entity.user.User;

public class Orders {
    private Integer id;
    private String type;
    private String ordernumber;
    private User user;
    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public String getType() {
        return type;
    }
    public void setType(String type) {
        this.type = type;
    }
    public String getOrdernumber() {
        return ordernumber;
    }
    public void setOrdernumber(String ordernumber) {
        this.ordernumber = ordernumber;
    }
    public User getUser() {
        return user;
    }
    public void setUser(User user) {
        this.user = user;
    }
}

这个实体类同样与数据库中的订单表字段对应,但它也多了一个user属性,这个属性指定该订单属性哪个客户。下面就要对这个属性进行映射。
Orders.hbm.xml内容如下:

<?xml version="1.0"?>
<!--
  ~ Hibernate, Relational Persistence for Idiomatic Java
  ~
  ~ License: GNU Lesser General Public License (LGPL), version 2.1 or later.
  ~ See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
  -->
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">

<hibernate-mapping>

    <class name="com.ev.entity.orders.Orders" table="orders">
        <id name="id">
            <generator class="native" />
        </id>
        <property name="type"/>
        <property name="ordernumber"/>
        <many-to-one name="user" class="com.ev.entity.user.User">
            <column name="customID"></column>
        </many-to-one>

    </class>

</hibernate-mapping>

many-to-one元素指多个订单可以归属同个客户,它的name属性值引用订单实体类的user属性,class指定该属性的类型,column 元素的name属性引用订单表外键。
这样客户和订单的实体类就可以做关联映射了。这两个配置文件可以放在对应实体类所在的文件目录下。
最后在hibernate.cfg.xml配置文件中引用下这两个配置文件即可。
hibernate.cfg.xml:

<?xml version='1.0' encoding='utf-8'?>
<!--
  ~ Hibernate, Relational Persistence for Idiomatic Java
  ~
  ~ License: GNU Lesser General Public License (LGPL), version 2.1 or later.
  ~ See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
  -->
<!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">

<hibernate-configuration>

    <session-factory>

        <!-- Database connection settings -->
        <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="connection.url">jdbc:mysql://localhost:3306/usergood</property>
        <property name="connection.username">root</property>
        <property name="connection.password">******</property>

        <mapping resource="com/ev/entity/user/User.hbm.xml"></mapping>
        <mapping resource="com/ev/entity/orders/Orders.hbm.xml"></mapping>
    </session-factory>

</hibernate-configuration>

可以使用DAO设计模式实现Model层来处理后台逻辑,具体参考《JAVA中Hibernate基本配置》。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值