昨天跟大家分享了Hibernate中單向的一對多、單向多對一、雙向一對多的映射關係,今天跟大家分享下在Hibernate中雙向的多對多的映射關係 這次我們以項目和員工舉個慄子,因為大家可以想象得到,在真實的環境下,一個項目肯定是對應著多個員工的,這毫無疑問, 那麼同時,一個比較牛員工也能同時參與多個 ...
昨天跟大家分享了Hibernate中單向的一對多、單向多對一、雙向一對多的映射關係,今天跟大家分享下在Hibernate中雙向的多對多的映射關係
這次我們以項目和員工舉個慄子,因為大家可以想象得到,在真實的環境下,一個項目肯定是對應著多個員工的,這毫無疑問,
那麼同時,一個比較牛員工也能同時參與多個項目的開發,這就體現了雙向多對多的關係。
首先呢,我們得弄清楚在底層資料庫中表與表之間的關係,我們創建一個員工表(Employee)和項目表(Project)毫無疑問,那麼我們要怎麼體現出多對多的關係呢?
當然有很多種方法,這裡我以單獨提出一張關係表為例,也就是說,我單獨創建一張表來保存員工和項目的關係,具體的實體類如下
Employee
package entity; import java.util.HashSet; import java.util.Set; /* * 員工表 * */ public class Employee { private Integer empid;//員工編號 private String empname;//員工名稱 //準備一個項目集合 private Set<Project> pros=new HashSet<Project>(); public Set<Project> getPros() { return pros; } public void setPros(Set<Project> pros) { this.pros = pros; } public Employee(String empname) { super(); this.empname = empname; } public Employee(Integer empid, String empname) { this.empid = empid; this.empname = empname; } public Employee() { } public Integer getEmpid() { return empid; } public void setEmpid(Integer empid) { this.empid = empid; } public String getEmpname() { return empname; } public void setEmpname(String empname) { this.empname = empname; } }
Proemp
package entity; /* * 表示員工和項目相關聯的表 * */ public class Proemp { private Integer rproid;//項目編號 private Integer rempid;//員工編號 public Proemp(Integer rproid, Integer rempid) { this.rproid = rproid; this.rempid = rempid; } public Proemp() { } public Integer getRproid() { return rproid; } public void setRproid(Integer rproid) { this.rproid = rproid; } public Integer getRempid() { return rempid; } public void setRempid(Integer rempid) { this.rempid = rempid; } }
Project
package entity; import java.util.HashSet; import java.util.Set; /* * 項目表 * */ public class Project { private Integer proid;//項目編號 private String proname;//項目名稱 //聲明員工集合 private Set<Employee> emps=new HashSet<Employee>(); public Set<Employee> getEmps() { return emps; } public void setEmps(Set<Employee> emps) { this.emps = emps; } public Project(String proname) { this.proname = proname; } public Integer getProid() { return proid; } public void setProid(Integer proid) { this.proid = proid; } public String getProname() { return proname; } public void setProname(String proname) { this.proname = proname; } public Project(Integer proid, String proname) { this.proid = proid; this.proname = proname; } public Project() { } }
這樣我們的實體類就全部創建完畢,接下來我們就可以配置映射關係文件了,既然是雙向的多對多的關係,那麼肯定少不了<set></set>標簽
Project.hbm.xml
<?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="entity"> <class name="Project" table="project"> <id name="proid" column="proid"> <generator class="increment" /> </id> <property name="proname" type="string" column="proname" /> <!-- 配置多對多的關聯關係 設置級聯屬性--> <set name="emps" table="proemp" cascade="all"> <key column="rproid"></key> <many-to-many class="entity.Employee" column="rempid"></many-to-many> </set> </class> </hibernate-mapping>
Employee.hbm.xml
<?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="entity"> <class name="Employee" table="Employee"> <id name="empid" column="empid"> <generator class="increment" /> </id> <property name="empname" type="string" column="empname" /> <!-- 配置多對多的關聯配置 設置反轉屬性,讓項目管理關係 --> <set name="pros" table="proemp" inverse="true"> <key column="rempid"></key> <many-to-many class="entity.Project" column="rproid"></many-to-many> </set> </class> </hibernate-mapping>
經過以上的步驟,整個配置過程就全部完成了,當然同學們別忘記了在Hibernate配置文件(大配置)中添加對兩個映射文件(小配置)的引用
測試類
package test; import org.hibernate.Session; import org.hibernate.Transaction; import util.HibernateUtil; import entity.Employee; import entity.Project; public class Test { public static void main(String[] args) { /* * 多對多的關聯關係配置 * 同時配置了Project和Employee之間雙向的多對多的關聯關係 * 關聯關係由Project方維護,並且在Project方設置了級聯屬性 * */ //獲取Session Session session=HibernateUtil.currentSession(); //開啟事務 Transaction tx = session.beginTransaction(); //構建兩個項目 Project pro1=new Project("項目一"); Project pro2=new Project("項目二"); //構建多個員工 Employee emp1=new Employee("巴黎的雨季"); Employee emp2=new Employee("盛夏的果實"); Employee emp3=new Employee("聽風"); Employee emp4=new Employee("黎明前的黑暗"); //將員工123加入項目一 pro1.getEmps().add(emp1); pro1.getEmps().add(emp2); pro1.getEmps().add(emp3); //將員工234加入項目二 pro2.getEmps().add(emp2); pro2.getEmps().add(emp3); pro2.getEmps().add(emp4); //保存項目一和項目二 session.save(pro1); session.save(pro2); //提交事務 tx.commit(); //關閉連接 HibernateUtil.closeSession(); } }
以上代碼,我們可以發現我們僅僅保存了項目,並沒有手動的添加保存員工的代碼,也沒有手動添加保存員工和項目之間關係的表的代碼
我們可以看到Hibernate幫我們生成的sql
Hibernate很智能的通過配置文件幫我們生成了我們需要的sql,這就是面向對象思想的體現,我們自始至終都只關註了項目這個對象就完成了我們所需要的操作
我們可以看看資料庫中的記錄
以上就是如何去配置雙向多對多的映射關係的代碼和解釋了。希望對大家有點用~~