![](https://i-blog.csdnimg.cn/blog_migrate/1e759a6fa7b6b5efb09f8e2e71799733.png)
com.cx.entity.Developer
package com.cx.entity; import java.util.HashSet; import java.util.Set; /** * Created by cxspace on 16-8-2. */ public class Developer { private int d_id; private String d_name; private Set<Project> projects = new HashSet<Project>(); public int getD_id() { return d_id; } public void setD_id(int d_id) { this.d_id = d_id; } public String getD_name() { return d_name; } public void setD_name(String d_name) { this.d_name = d_name; } public Set<Project> getProjects() { return projects; } public void setProjects(Set<Project> projects) { this.projects = projects; } }
com.cx.entity.Project
package com.cx.entity; import java.util.HashSet; import java.util.Set; /** * Created by cxspace on 16-8-2. */ public class Project { private int pri_id; private String prj_name; // 一个项目对应多个员工 private Set<Developer> developers = new HashSet<Developer>(); public Set<Developer> getDevelopers() { return developers; } public void setDevelopers(Set<Developer> developers) { this.developers = developers; } public int getPri_id() { return pri_id; } public void setPri_id(int pri_id) { this.pri_id = pri_id; } public String getPrj_name() { return prj_name; } public void setPrj_name(String prj_name) { this.prj_name = prj_name; } }
映射配置
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="com.cx.entity"> <class name="Developer" table="t_developer"> <id name="d_id"> <generator class="native"></generator> </id> <property name="d_name" length="20"></property> <!-- 多对多映射关键 1.映射的集合属性 2.集合属性对应的中间表 3.外键字段 4.外键字段对应的中间表字段 5.集合属性元素的类型 --> <set name="projects" table="t_relation" cascade="save-update" > <key column="did"></key> <many-to-many column="prjId" class="Project"></many-to-many> </set> </class> </hibernate-mapping> ---------------------------------------------------------------------------------- <?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="com.cx.entity"> <class name="Project" table="t_project"> <id name="pri_id"> <generator class="native"></generator> </id> <property name="prj_name" length="20"></property> <!-- 多对多映射关键 1.映射的集合属性 2.集合属性对应的中间表 3.外键字段 4.外键字段对应的中间表字段 5.集合属性元素的类型 --> <set name="developers" table="t_relation" cascade="save-update" inverse="false" > <key column="prjId"></key> <many-to-many column="did" class="Developer"></many-to-many> </set> </class> </hibernate-mapping>
测试类
package com.cx.test; import com.cx.entity.Developer; import com.cx.entity.Project; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; import org.junit.Test; /** * Created by cxspace on 16-8-2. */ public class ManyToMany { private static SessionFactory sf; static { sf = new Configuration() .configure() .addClass(Project.class) .addClass(Developer.class) // 测试时候使用 .buildSessionFactory(); } // 多对多 //1. 设置inverse属性,对保存数据影响? // 有影响。 // inverse=false ,有控制权,可以维护关联关系; 保存数据的时候会把对象关系插入中间表; // inverse=true, 没有控制权, 不会往中间表插入数据。 public void save(){ Session session = sf.openSession(); session.beginTransaction(); Project prj_ds = new Project(); prj_ds.setPrj_name("电商系统"); Project prj_tx = new Project(); prj_tx.setPrj_name("通讯软件"); Developer dev_my = new Developer(); dev_my.setD_name("马云"); Developer dev_qd = new Developer(); dev_qd.setD_name("强东"); Developer dev_ht = new Developer(); dev_ht.setD_name("化腾"); //关系维护 prj_ds.getDevelopers().add(dev_my); prj_ds.getDevelopers().add(dev_qd); prj_tx.getDevelopers().add(dev_ht); prj_tx.getDevelopers().add(dev_my); session.save(prj_ds); session.save(prj_tx); session.getTransaction().commit(); session.close(); /* * * Hibernate: insert into t_project (prj_name) values (?) Hibernate: insert into t_developer (d_name) values (?) Hibernate: insert into t_developer (d_name) values (?) Hibernate: insert into t_project (prj_name) values (?) Hibernate: insert into t_developer (d_name) values (?) Hibernate: insert into t_relation (prjId, did) values (?, ?) Hibernate: insert into t_relation (prjId, did) values (?, ?) Hibernate: insert into t_relation (prjId, did) values (?, ?) Hibernate: insert into t_relation (prjId, did) values (?, ?) * * */ } //2 .设置inverse属性, 对获取数据影响? 无 public void get(){ Session session = sf.openSession(); session.beginTransaction(); Project prj = (Project)session.get(Project.class,1); System.out.println(prj.getPrj_name()); System.out.println(prj.getDevelopers()); session.getTransaction().commit(); session.close(); } //3. 设置inverse属性, 对解除关系影响? // 有影响。 // inverse=false ,有控制权, 解除关系就是删除中间表的数据。 // inverse=true, 没有控制权,不能解除关系。 public void removeRelation() { Session session = sf.openSession(); session.beginTransaction(); Project prj = (Project) session.get(Project.class, 2); prj.getDevelopers().clear(); session.getTransaction().commit(); session.close(); } //3. 设置inverse属性,对删除数据的影响? // inverse=false, 有控制权。 先删除中间表数据,再删除自身。 // inverse=true, 没有控制权。 如果删除的数据有被引用,会报错! 否则,才可以删除 @Test public void deleteData() { Session session = sf.openSession(); session.beginTransaction(); Project prj = (Project) session.get(Project.class, 1); session.delete(prj); session.getTransaction().commit(); session.close(); } }