需求:
学生与课程
一个学生可以有多门课程
一个课程可以有多个学生
代码:
public class Developer {
private int d_id;
private Stringd_name;
// 开发人员,参数的多个项目
private Set<Project>projects = new HashSet<Project>();
}
public class Project {
private int prj_id;
private Stringprj_name;
// 项目下的多个员工
private Set<Developer>developers = new HashSet<Developer>();
}
<?xmlversion="1.0"?>
<!DOCTYPEhibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mappingpackage="cn.itcast.c_many2many">
<classname="Project"table="t_project">
<idname="prj_id">
<generatorclass="native"></generator>
</id>
<propertyname="prj_name"length="20"></property>
<!--
多对多映射:
1. 映射的集合属性: “developers”
2. 集合属性,对应的中间表: “t_relation”
3. 外键字段: prjId
4. 外键字段,对应的中间表字段: did
5. 集合属性元素的类型
-->
<setname="developers"table="t_relation"cascade="save-update">
<keycolumn="prjId"></key>
<many-to-manycolumn="did"class="Developer"></many-to-many>
</set>
</class>
</hibernate-mapping>
<?xmlversion="1.0"?>
<!DOCTYPEhibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mappingpackage="cn.itcast.c_many2many">
<classname="Developer"table="t_developer">
<idname="d_id">
<generatorclass="native"></generator>
</id>
<propertyname="d_name"length="20"></property>
<!--
多对多映射配置:员工方
name 指定映射的集合属性
table 集合属性对应的中间表
key 指定中间表的外键字段(引用当前表t_developer主键的外键字段)
many-to-many
column 指定外键字段对应的项目字段
class 集合元素的类型
-->
<setname="projects"table="t_relation">
<keycolumn="did"></key>
<many-to-manycolumn="prjId"class="Project"></many-to-many>
</set>
</class>
</hibernate-mapping>
维护关联关系
设置inverse属性,在多对多种维护关联关系的影响?
1) 保存数据
有影响。
inverse=false ,有控制权,可以维护关联关系;保存数据的时候会把对象关系插入中间表;
inverse=true, 没有控制权,不会往中间表插入数据。
2) 获取数据
无。
3) 解除关系
// 有影响。
// inverse=false ,有控制权,解除关系就是删除中间表的数据。
// inverse=true, 没有控制权,不能解除关系。
4) 删除数据
有影响。
// inverse=false, 有控制权。先删除中间表数据,再删除自身。
// inverse=true, 没有控制权。如果删除的数据有被引用,会报错!否则,才可以删除