多对多映射

来源:互联网 发布:ubuntu分辨率800*600 编辑:程序博客网 时间:2024/04/30 18:42
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,  没有控制权, 不会往中间表插入数据。@Testpublic 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属性, 对获取数据影响?  无@Testpublic 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, 没有控制权,不能解除关系。@Testpublic 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, 没有控制权。 如果删除的数据有被引用,会报错! 否则,才可以删除@Testpublic 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();}}


原创粉丝点击