1、创建三张表,工程表 、 员工表 、 关系表
一个工程对应多个员工,一个员工也可能参与多个工程开发,即为多对多
create table t_project(
pro_Id int primary key auto_increment,
proName varchar(20)
)DEFAULT charset=utf8;
create table t_developer(
dev_Id int primary key auto_increment,
dev_Name varchar(20)
)DEFAULT charset=utf8;
create table t_relations(
dev_Id int ,
pro_Id int
)DEFAULT charset=utf8;
2、创建实体类
员工实体类:
public class developer {
private int dev_Id;
private String dev_Name;
private Set<project> pros = new HashSet<project>();
public int getDev_Id() {
return dev_Id;
}
public void setDev_Id(int dev_Id) {
this.dev_Id = dev_Id;
}
public String getDev_Name() {
return dev_Name;
}
public void setDev_Name(String dev_Name) {
this.dev_Name = dev_Name;
}
public Set<project> getPros() {
return pros;
}
public void setPros(Set<project> pros) {
this.pros = pros;
}
}
员工配置文件:develop.hbm.xml
<hibernate-mapping package="manytomany">
<class name="developer" table="t_developer">
<id name="dev_Id">
<generator class="native"></generator>
</id>
<property name="dev_Name" length="20"></property>
<!--
多对多关联映射配置 员工方
developer 映射关键点:
name 指定映射的集合属性
table 集合属性对应的中间表
key 中间表的外键字段
many-to-many
column 指定外键字段对应的项目字段
class 集合元素的类型
-->
<set name="pros" table="t_relations" >
<key column="dev_Id"></key>
<many-to-many column="pro_Id" class="project"/>
</set>
</class>
</hibernate-mapping>
工程实体类:
public class project {
private int pro_Id;
private String proName;
private Set<developer> devs = new HashSet<developer>();
public int getPro_Id() {
return pro_Id;
}
public void setPro_Id(int pro_Id) {
this.pro_Id = pro_Id;
}
public String getProName() {
return proName;
}
public void setProName(String proName) {
this.proName = proName;
}
public Set<developer> getDevs() {
return devs;
}
public void setDevs(Set<developer> devs) {
this.devs = devs;
}
}
工程对象配置文件:project.hbm.xml
<hibernate-mapping package="manytomany">
<class name="project" table="t_project">
<id name="pro_Id">
<generator class="native"></generator>
</id>
<property name="proName" length="20"></property>
<!--
多对多关联映射:
映射的集合属性
集合属性对应的中间表
外键字段
外键字段对应的中间表
集合属性元素类型
-->
<set name="devs" table="t_relations" cascade="save-update" inverse="false" >
<key column="pro_Id"></key>
<many-to-many column="dev_Id" class="developer"/>
</set>
</class>
</hibernate-mapping>
3、进行测试:
public class testManyToMany {
private static SessionFactory sf ;
static{
sf = new Configuration()
.configure()
.addClass(project.class)
.addClass(developer.class)
.buildSessionFactory();
}
// 多对多
//1. 设置inverse属性,对保存数据影响?
// 有影响。
// inverse=false ,有控制权,可以维护关联关系; 保存数据的时候会把对象关系插入中间表;
// inverse=true, 没有控制权, 不会往中间表插入数据。
@Test
public void testSaveMany() throws Exception {
developer dev1 = new developer();
dev1.setDev_Name("wangwu");
developer dev2 = new developer();
dev2.setDev_Name("lisi");
developer dev3 = new developer();
dev3.setDev_Name("zhangsan");
project pro1 = new project();
pro1.setProName("wushui");
pro1.getDevs().add(dev1);
pro1.getDevs().add(dev2);
project pro2 = new project();
pro2.setProName("zhangbozhi");
pro2.getDevs().add(dev1);
pro2.getDevs().add(dev3);
Session ss = sf.openSession();
ss.beginTransaction();
// ss.save(dev1);
// ss.save(dev2);
// ss.save(dev3);
ss.save(pro1);
ss.save(pro2);//需要设置级联,如果inverse=true,级联失效
ss.getTransaction().commit();
ss.close();
}
//2 .设置inverse属性, 对获取数据影响? 无
@Test
public void testGetMany() throws Exception {
Session ss = sf.openSession();
ss.beginTransaction();
project project = (project)ss.get(project.class, 3);
System.out.println(project.getProName()+project.getDevs());
ss.getTransaction().commit();
ss.close();
}
//3. 设置inverse属性, 对解除关系影响?
// 有影响。
// inverse=false ,有控制权, 解除关系就是删除中间表的数据。
// inverse=true, 没有控制权,不能解除关系。
@Test
public void testclearMany() throws Exception {
Session ss = sf.openSession();
ss.beginTransaction();
project project = (project)ss.get(project.class, 3);
project.getDevs().clear();
ss.getTransaction().commit();
ss.close();
}
//3. 设置inverse属性,对删除数据的影响?
// inverse=false, 有控制权。 先删除中间表数据,再删除自身。
// inverse=true, 没有控制权。 如果删除的数据有被引用,会报错! 否则,才可以删除
@Test
public void testdeleteMany() throws Exception {
Session ss = sf.openSession();
ss.beginTransaction();
project project = (project)ss.get(project.class, 2);
ss.delete(project);
ss.getTransaction().commit();
ss.close();
}
}