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

来源:互联网 发布:qq三国js技能名 编辑:程序博客网 时间:2024/05/29 10:12

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

举个例子,省份和城市。这就是很典型的一对多,一个省份可以有多个城市,但一个城市只会有一个省份。那么,这如何在我们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<City> cities=new HashSet<City>();    public Set<City> getCities() {        return cities;    }    public void setCities(Set<City> 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集合(不会有重复值)

然后就是配置文件

<?xml version="1.0"?><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN""http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"><!-- Generated 2017-8-22 15:14:11 by Hibernate Tools 3.5.0.Final --><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>
<?xml version="1.0"?><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN""http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"><!-- Generated 2017-8-22 15:14:11 by Hibernate Tools 3.5.0.Final --><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>       <!--  <property name="pid" type="int">            <column name="PID" />        </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> roles=new HashSet<Roles>();    public Set<Roles> getRoles() {        return roles;    }    public void setRoles(Set<Roles> 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> users=new HashSet<Users>();    public Set<Users> getUsers() {        return users;    }    public void setUsers(Set<Users> 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;    }}

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

<?xml version="1.0"?><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN""http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"><!-- Generated 2017-8-22 15:41:45 by Hibernate Tools 3.5.0.Final --><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>
<?xml version="1.0"?><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN""http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"><!-- Generated 2017-8-22 15:41:45 by Hibernate Tools 3.5.0.Final --><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使用中间表将他们连接起来了,到这里我们关系就建立好了。

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

阅读全文
0 0
原创粉丝点击