在关联映射中,一对多和多对一关系是相对而言的,以用户分组为例(如上图),从用户的角度来看是多对一的关系,多个用户对应一个组;从组的角度来看是一对多关系,一个组对应多个用户。
原理
一对多和多对一映射的原理是一样的,都是在多的一端加入一个外键指向一的一端
区别
多对一关联映射维护的关系:多指向一的关系,如果维护了多指向一的关系,那么加载多的时候会把一加载上来。即加载用户可以知道这个用户属于哪个组
一对多关联映射维护的关系:一指向多的关系,如果维护了一指向多的关系,那么加载一的时候会把多加载上来。即加载组可以知道这个组下的所有用户
实体
多对一
Group类
public class Group {
private int id;
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
User
public class User {
private int id;
private String name;
private Group group;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Group getGroup() {
return group;
}
public void setGroup(Group group) {
this.group = group;
}
}
一对多
Group
public class Group {
private int id;
private String name;
private Set user;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
User
public class User {
private int id;
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
映射文件
多对一
<hibernate-mapping>
<class name="cn.itcast.oa.domain.Group" table="t_group">
<id name="id">
<generator class="native"></generator>
</id>
<property name="name"/>
</class>
</hibernate-mapping>
<hibernate-mapping>
<class name="cn.itcast.oa.domain.User" table="t_user">
<id name="id">
<generator class="native"/>
</id>
<property name="name"/>
<many-to-one name="group"/>
</class>
</hibernate-mapping>
一对多
<hibernate-mapping>
<class name="cn.itcast.oa.domain.User" table="t_user">
<id name="id">
<generator class="native"/>
</id>
<property name="name"/>
</class>
</hibernate-mapping>
<hibernate-mapping>
<class name="cn.itcast.oa.domain.Group" table="t_group">
<id name="id">
<generator class="native"></generator>
</id>
<property name="name"/>
<set name="user">
<key column="groupId"/>
<one-to-many class="cn.itcast.oa.domain.User"/>
</set>
</class>
</hibernate-mapping>
效果展示
虽然一对多和多对一在配置上边是不一样的,但是最终形成的表还是相同的