多对多关系映射和一对多关系映射开发步骤差不多,
例子如下:员工和项目之间的关系,一个员工可以参与多个项目;一个项目可以有多个开发人员参与。因此是多对多的关系。
1 分析数据表
1.1)员工表
CREATE TABLE employee(id INT PRIMARY KEY AUTO_INCREMENT,ename VARCHAR(50) NOT NULL);
1.2)项目表
CREATE TABLE project(id INT PRIMARY KEY AUTO_INCREMENT,pname VARCHAR(100) NOT NULL,startDate DATE);
1.3)员工和项目关系表
CREATE TABLE emp_pro_relation(eid INT,pid INT,FOREIGN KEY (eid) REFERENCES employee(id),FOREIGN KEY (pid) REFERENCES project(id));
2 编写实体类
Employee类
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
![](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
public class Employee { private int id; private String ename; private Setprojects = new HashSet (); public int getId() { return id; } public void setId(int id) { this.id = id; } public String getEname() { return ename; } public void setEname(String ename) { this.ename = ename; } public Set getProjects() { return projects; } public void setProjects(Set projects) { this.projects = projects; }}
Project类
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
![](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
public class Project { private int id; private String pname; private Date startDate = new Date(); private Setemployees = new HashSet (); public int getId() { return id; } public void setId(int id) { this.id = id; } public String getPname() { return pname; } public void setPname(String pname) { this.pname = pname; } public Date getStartDate() { return startDate; } public void setStartDate(Date startDate) { this.startDate = startDate; } public Set getEmployees() { return employees; } public void setEmployees(Set employees) { this.employees = employees; }}
3 映射配置
Employee.hbm.xml配置
Project.hbm.xml配置
4 全局配置hibernate.cfg.xml
com.mysql.jdbc.Driver jdbc:mysql:///day26?useSSL=true root root org.hibernate.dialect.MySQL5Dialect true true
二、简单测试
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
![](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
public void fun1(){ Configuration configuration = new Configuration(); configuration.configure(); SessionFactory sessionFac = configuration.buildSessionFactory(); Session session = sessionFac.openSession(); Transaction bt = session.beginTransaction(); Employee emp1 = new Employee(); emp1.setEname("good1"); Employee emp2 = new Employee(); emp2.setEname("good2"); Employee emp3 = new Employee(); emp3.setEname("nice1"); Employee emp4 = new Employee(); emp4.setEname("nice2"); Project pro1 = new Project(); pro1.setPname("OA"); Project pro2 = new Project(); pro2.setPname("电商"); pro1.getEmployees().add(emp1); pro1.getEmployees().add(emp2); pro1.getEmployees().add(emp3); pro2.getEmployees().add(emp3); pro2.getEmployees().add(emp4); session.save(pro1); session.save(pro2); bt.commit(); session.close(); sessionFac.close(); }
需要注意的是:在使用一方保存另一方时,可能会有错误。此时需要在保存方配置cascade属性。