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<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使用中间表将他们连接起来了,到这里我们关系就建立好了。

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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Hibernate是一个Java持久化框架,它能够将Java对象映射到数据库中的表格,同时支持各种关系数据库,如MySQL、Oracle等。在Hibernate中,对于一对一、一对多多对多关系,我们可以通过以下方式进行映射。 一对一关系:在Hibernate中,可以通过主键关联和外键关联来实现一对一关系的映射。主键关联是指两个实体之间的关联通过主键来进行,可以使用@PrimaryKeyJoinColumn注解将两个实体关联起来。外键关联是指通过一个实体引用另一个实体的主键作为外键,使用@JoinColumn注解来指定外键属性。 一对多关系:在Hibernate中,一对多关系通常通过外键关联来实现。在一的一方,使用@OneToMany注解来定义一对多关系,同时使用@JoinColumn注解指定外键属性。在多的一方,使用@ManyToOne注解来定义多对一关系,并使用@JoinColumn注解指定外键属性。 多对多关系:在Hibernate中,多对多关系通常通过中间表来实现。在多对多的两个实体中,使用@ManyToMany注解来定义多对多关系。同时,需要在中间表中创建两个外键,分别与两个实体的主键关联,并使用@JoinTable注解来指定中间表的表名和两个外键的列名。 总结:通过Hibernate的注解方式,可以方便地实现一对一、一对多多对多关系的映射。通过合理地使用注解,可以减少编写映射文件的工作量,提高开发效率。同时,Hibernate还提供了在运行时自动生成表结构的功能,可以根据Java实体类来动态创建或更新对应的数据库表格,从而提高系统的可维护性和灵活性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值