Java 框架之Hibernate (三、Hibernate一对多及多对多的关系分析)

上一篇博客中我们讲了一对一的关系,那么这篇博客我们来讲一讲一对多和多对多的关系,我们现在都是在建立关系,具体怎么使用,我会在下面的博客中提到,所以不要急。我们先把关系分析清楚,建立好关系。好,废话不多说,今天我们来说一说一对多的关系。

举个例子,省份和城市。这就是很典型的一对多,一个省份可以有多个城市,但一个城市只会有一个省份。那么,这如何在我们Hibernate中体现呢??

老规矩,首先是数据库设计,这里的设计和一对一就有点不一样了

我们来连两个表Province(省份)和 city(城市)
那么他们的字段如下
Province (主表) city(从表)
pid cid
pname cname
pid
这样我们可以很清楚的看到,在从表中有主表的主键列,但我们不需要设置外键,他们的关系依旧是在实体类与映射文件中体现出来

那么首先是实体类的设计

package com.zking.entity;

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

public class Province {
    private int pid;
    private String pname;

    private Set cities=new HashSet();

    public Set getCities() {
        return cities;
    }
    public void setCities(Set cities) {
        this.cities = cities;
    }
    public Province() {
        super();
    }
    public Province(String pname) {
        super();
        this.pname = pname;
    }
    public int getPid() {
        return pid;
    }
    public void setPid(int pid) {
        this.pid = pid;
    }
    public String getPname() {
        return pname;
    }
    public void setPname(String pname) {
        this.pname = pname;
    }
}

j`package com.zking.entity;

public class City {
private int cid;
private String cname;
// private int pid;

private Province province;

public Province getProvince() {
    return province;
}
public void setProvince(Province province) {
    this.province = province;
}
public City() {
    super();
    // TODO Auto-generated constructor stub
}
public City(String cname) {
    super();
    this.cname = cname;
}
public int getCid() {
    return cid;
}
public void setCid(int cid) {
    this.cid = cid;
}
public String getCname() {
    return cname;
}
public void setCname(String cname) {
    this.cname = cname;
}

// public int getPid() {
// return pid;
// }
// public void setPid(int pid) {
// this.pid = pid;
// }
}
`
因为一个省份对应多个城市,所以不能使用城市对象,我们需要用一个Set集合(不会有重复值)

然后就是配置文件




<hibernate-mapping>
    <class name="com.zking.entity.Province" table="PROVINCE">
        <id name="pid" type="int">
            <column name="PID" />
            <generator class="native" />
        id>
        <property name="pname" type="java.lang.String">
            <column name="PNAME" />
        property>

        <set name="cities" table="city" cascade="save-update">
            <key column="pid">key>
            <one-to-many class="com.zking.entity.City"/>
        set>


    class>
hibernate-mapping>



<hibernate-mapping>
    <class name="com.zking.entity.City" table="CITY">
        <id name="cid" type="int">
            <column name="CID" />
            <generator class="native" />
        id>
        <property name="cname" type="java.lang.String">
            <column name="CNAME" />
        property>
       
        <many-to-one name="province" class="com.zking.entity.Province" column="pid">many-to-one>
    class>
hibernate-mapping>

这样,我们一对多的关系就已经建立了,至于怎么去使用,不要着急,我会在接下来的几篇博客中讲,好,我们现在来建立多对多的关系

举个例子 用户和角色 这就是典型的多对多,一个用户可以有多个角色,一个角色可以赋给多个用户

还是一样的首先是数据库的设计,这里的设计有点不一样,这里需要一张中间表

users roles
uid rid
unamd rname

然后这里我们需要一张中间表u_r
字段就是
uid
rid
这样我们数据库就已经设置好了

然后就是实体类的设计

package com.zking.entity;

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

public class Users {
    private int uid;
    private String uname;

    private Set roles=new HashSet();

    public Set getRoles() {
        return roles;
    }
    public void setRoles(Set roles) {
        this.roles = roles;
    }
    public Users() {
        super();
        // TODO Auto-generated constructor stub
    }
    public Users(String uname) {
        super();
        this.uname = uname;
    }
    public int getUid() {
        return uid;
    }
    public void setUid(int uid) {
        this.uid = uid;
    }
    public String getUname() {
        return uname;
    }
    public void setUname(String uname) {
        this.uname = uname;
    }

}
package com.zking.entity;

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

public class Roles {
    private int rid;
    private String rname;

    private Set users=new HashSet();

    public Set getUsers() {
        return users;
    }
    public void setUsers(Set users) {
        this.users = users;
    }
    public Roles() {
        super();
    }
    public Roles(String rname) {
        super();
        this.rname = rname;
    }
    public int getRid() {
        return rid;
    }
    public void setRid(int rid) {
        this.rid = rid;
    }
    public String getRname() {
        return rname;
    }
    public void setRname(String rname) {
        this.rname = rname;
    }
}

然后我们的连接表是不需要实体类的,他们关系以及连接表的作用主要在映射文件中体现出来




<hibernate-mapping>
    <class name="com.zking.entity.Users" table="USERS">
        <id name="uid" type="int">
            <column name="UID" />
            <generator class="native" />
        id>
        <property name="uname" type="java.lang.String">
            <column name="UNAME" />
        property>

        <set name="roles" table="u_r" cascade="save-update">
            <key column="uid">key>
            <many-to-many class="com.zking.entity.Roles" column="rid">many-to-many>
        set>


    class>
hibernate-mapping>



<hibernate-mapping>
    <class name="com.zking.entity.Roles" table="ROLES">
        <id name="rid" type="int">
            <column name="RID" />
            <generator class="native" />
        id>
        <property name="rname" type="java.lang.String">
            <column name="RNAME" />
        property>

        <set name="users" table="u_r">
            <key column="rid">key>
            <many-to-many class="com.zking.entity.Users" column="uid">many-to-many>
        set>

    class>
hibernate-mapping>

我们配置了两个集合,在映射文件中配置了两个set使用中间表将他们连接起来了,到这里我们关系就建立好了。

那么现在,我们的关系建立基本就讲完了,下一篇博客我会讲一下如何在项目中去使用

你可能感兴趣的:(JAVA,hibernate,java,框架)