多对多关系并不是两张表的关系,而是三张表的关系,而且要求必须有一个中间表,中间表必须只有两个字段,必须为复合主键,必须包含外键。
如果以上条件都满足,MyEclipse在三张表一起选择时,就可以生成多对多关系映射。
类一般只生成两个类,例如:学生选课中,只生成学生和课程类,关系使用以下方式描述:
1) 学生类中保存着该学生选择的所有课程对象,使用Set集合来保存。
2) 课程类中保存着所有选择此课程的学生对象,使用Set集合来保存。
建立数据表
CREATE TABLE user_course (
userid varchar2(40) ,
course_id number(8) ,
primary key (userid,course_id) ,
foreign key (userid) references t_user (userid) on delete cascade ,
foreign key (course_id) references course (id) on delete cascade
);
使用t_user,course和user_course表,完成映射:
many to many 前面打勾:
由于t_user使用assigned,course使用increment,因此,这里不统一选择方式。
而是在后面单独选择。
同时,注意将允许使用多对多的多选框选中。
可以在这里单独选择方式。
public class TUser implements java.io.Serializable {
private String userid;
private String realName;
private String password;
private Date registDate;
private Date lastLoginDate;
private Set courses = new HashSet(0);
public class Course implements java.io.Serializable {
private Integer id;
private String title;
private Set TUsers = new HashSet(0);
类中确定了集合关系
映射文件里也描述了多对多关系:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
<hibernate-mapping>
<class name="org.liky.pojo.TUser" table="T_USER" schema="SUNXUN">
<id name="userid" type="java.lang.String">
<column name="USERID" length="40" />
<generator class="assigned"></generator>
</id>
<property name="realName" type="java.lang.String">
<column name="REAL_NAME" length="20" not-null="true" />
</property>
<property name="password" type="java.lang.String">
<column name="PASSWORD" length="32" not-null="true" />
</property>
<property name="registDate" type="java.util.Date">
<column name="REGIST_DATE" length="7" />
</property>
<property name="lastLoginDate" type="java.util.Date">
<column name="LAST_LOGIN_DATE" length="7" />
</property>
<!--
在User中包含一个名称为courses的Set集合,数据是根据中间表USER_COURSE来关联取得的。
-->
<set name="courses" table="USER_COURSE" schema="SUNXUN">
<!--
中间表中通过USERID与当前类(User)关联
-->
<key>
<column name="USERID" length="40" not-null="true" />
</key>
<!--
中间表还通过COURSE_ID与Course对象关联,联系起来出现的是多对多关系。
-->
<many-to-many entity-name="org.liky.pojo.Course">
<column name="COURSE_ID" precision="8" scale="0" not-null="true" />
</many-to-many>
</set>
</class>
</hibernate-mapping>
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
<!--
Mapping file autogenerated by MyEclipse Persistence Tools
-->
<hibernate-mapping>
<class name="org.liky.pojo.Course" table="COURSE" schema="SUNXUN">
<id name="id" type="java.lang.Integer">
<column name="ID" precision="8" scale="0" />
<generator class="increment"></generator>
</id>
<property name="title" type="java.lang.String">
<column name="TITLE" length="50" not-null="true" />
</property>
<set name="TUsers" inverse="true" table="USER_COURSE" schema="SUNXUN">
<key>
<column name="COURSE_ID" precision="8" scale="0" not-null="true" />
</key>
<many-to-many entity-name="org.liky.pojo.TUser">
<column name="USERID" length="40" not-null="true" />
</many-to-many>
</set>
</class>
</hibernate-mapping>
可以发现有一边的配置中出现了inverse="true",这个配置表示关联关系由对方进行维护。