多对多案例实践
老师与学生信息管理
第一步:设计表
学生信息表

老师信息表

关联表(这个表没有单独主键,就是个联合主键) 这里有一个问题就是如何设置联合主键?

注意观察下面的两个外键

第二步:生成实体和映射文件
Idea插件不完善,这里只选中student_info,teacher_info生成,不勾选双向关联表stu_tea_info,生成的映射还是one-to-many的组合,需要手手动添加many-to-many(Eclipse不需要手动添加,可以自动生成;开发项目一般使用单表多,做关联少):

也就是这里使用单表生成ORM映射文件,然后手动添加多对多。
学生实体类StudentInfoEntity添加:
private Set teacherInfos = new HashSet(0);
public Set getTeacherInfos() {
return teacherInfos;
}
public void setTeacherInfos(Set teacherInfos) {
this.teacherInfos = teacherInfos;
}
学生映射文件StudentInfoEntity.hbm.xml添加:
主键:

many-to-many:
<set name="teacherInfos" table="stu_tea_info" inverse="false" cascade="all" lazy="true" fetch="select">
<key>
<column name="r_stu_id" not-null="true" />
</key>
<many-to-many entity-name="com.qf.pojo.TeacherInfoEntity">
<column name="r_tea_id" not-null="true" />
</many-to-many>
</set>
</class>
整体表达:一个学生可以有多个老师。
注意:关联不能修改inverse=“false”,本表维护,关联表映射没生成。
老师实体类TeacherInfoEntity添加:
private Set studentInfos = new HashSet(0);
public Set getStudentInfos() {
return studentInfos;
}
public void setStudentInfos(Set studentInfos) {
this.studentInfos = studentInfos;
}
老师实体映射文件TeacherInfoEntity.hbm.xml添加
主键:

多对多关系:
<set name="studentInfos" table="stu_tea_info" inverse="false" cascade="all" lazy="true" fetch="select">
<key>
<column name="r_tea_id" not-null="true" />
</key>
<many-to-many entity-name="com.qf.pojo.StudentInfoEntity">
<column name="r_stu_id" not-null="true" />
</many-to-many>
</set>
表达意识:一个老师可以有多个学生。
第三步:开发DAO
TeacherInfoDAO
public void addTeacher(TeacherInfoEntity pojo){
Session session = HibernateSessionFactory.getSession();
Transaction transaction = session.beginTransaction();
session.save(pojo);
transaction.commit();
HibernateSessionFactory.close(session);
}
public TeacherInfoEntity getTeacher(Long id){
Session session = HibernateSessionFactory.getSession();
return session.get(TeacherInfoEntity.class, id);
}
StudentInfoDAO:
public void addStu(StudentInfoEntity pojo){
Session session = HibernateSessionFactory.getSession();
Transaction transaction = session.beginTransaction();
session.save(pojo);
transaction.commit();
HibernateSessionFactory.close(session);
}
public StudentInfoEntity getStu(Long id){
Session session = HibernateSessionFactory.getSession();
return session.get(StudentInfoEntity.class, id);
}
第四步:单元测试
测试分支中:
public class ManyToManyTest {
@Test //添加老师
public void testAddTeacher(){
TeacherInfoDAO dao = new TeacherInfoDAO();
TeacherInfoEntity pojo = new TeacherInfoEntity();
pojo.setTeaName("王老师1");
dao.addTeacher(pojo);
}
@Test //添加学生
public void testAddStuOnly(){
StudentInfoEntity stu = new StudentInfoEntity();
stu.setStuName("小欣1");
StudentInfoDAO stuDAO = new StudentInfoDAO();
stuDAO.addStu(stu);
}
@Test //添加老师同时添加关联学生
public void testAddTeacherAndStu(){
TeacherInfoDAO dao = new TeacherInfoDAO();
TeacherInfoEntity pojo = new TeacherInfoEntity();
pojo.setTeaName("付老师");
StudentInfoDAO stuDAO = new StudentInfoDAO();
pojo.getStudentInfos().add(stuDAO.getStu(1L));
pojo.getStudentInfos().add(stuDAO.getStu(16L));
dao.addTeacher(pojo);
}
@Test //添加学生 关联老师
public void testAddStu(){
StudentInfoEntity stu = new StudentInfoEntity();
stu.setStuName("小欣3");
TeacherInfoDAO dao = new TeacherInfoDAO();
TeacherInfoEntity tea = dao.getTeacher(2L);
TeacherInfoEntity tea2 = dao.getTeacher(15L);
stu.getTeacherInfos().add(tea);
stu.getTeacherInfos().add(tea2);
StudentInfoDAO stuDAO = new StudentInfoDAO();
stuDAO.addStu(stu);
}
@Test //查看老师下面对应的学生
public void findTeaAndStu(){
TeacherInfoDAO dao = new TeacherInfoDAO();
TeacherInfoEntity tea = dao.getTeacher(11L);
Iterator itr = tea.getStudentInfos().iterator();
System.out.println(tea.getTeaName()+"对应的学生有:");
while(itr.hasNext()){
StudentInfoEntity stu = (StudentInfoEntity) itr.next();
System.out.println(stu.getStuName());
}
}
@Test //查询学生对应的老师
public void findStuForTea(){
StudentInfoDAO dao = new StudentInfoDAO();
StudentInfoEntity stu = dao.getStu(1L);
Iterator itr = stu.getTeacherInfos().iterator();
System.out.println(stu.getStuName()+"对应的老师有:");
while(itr.hasNext()){
TeacherInfoEntity tea = (TeacherInfoEntity) itr.next();
System.out.println(tea.getTeaName());
}
}
}
网友评论