上一篇博客中我们讲了一对一的关系,那么这篇博客我们来讲一讲一对多和多对多的关系,我们现在都是在建立关系,具体怎么使用,我会在下面的博客中提到,所以不要急。我们先把关系分析清楚,建立好关系。好,废话不多说,今天我们来说一说一对多的关系。
举个例子,省份和城市。这就是很典型的一对多,一个省份可以有多个城市,但一个城市只会有一个省份。那么,这如何在我们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使用中间表将他们连接起来了,到这里我们关系就建立好了。
那么现在,我们的关系建立基本就讲完了,下一篇博客我会讲一下如何在项目中去使用