有这样一个多对多关系,一个老师任多门课程,一个课程有多门老师
我的课程hbm文件定义如下
<
hibernate-mapping
>
< class table ="class" name ="cn.hxex.exam.model.Classes" >
< id name ="id" column ="id" >
< generator class ="uuid.hex" ></ generator >
</ id >
< property name ="title" column ="title" />
< set name ="teachers" table ="teacher_class" lazy ="true" cascade ="all" >
< key column ="class_id" ></ key >
< many-to-many class ="cn.hxex.exam.model.Teacher" column ="teacher_id" ></ many-to-many >
</ set >
< set name ="students" inverse ="true" >
< key column ="class_id" ></ key >
< one-to-many class ="cn.hxex.exam.model.Student" ></ one-to-many >
</ set >
</ class >
< query name ="getTeacherNotInClasses" >
<![CDATA[ from Classes where id not in (select t.classes.id from Teacher t where t.id=:teacherid) ]]>
</ query >
< query name ="getClassesByTitle" > <![CDATA[ from Classes where title=:title ]]> </ query >
</ hibernate-mapping >
< class table ="class" name ="cn.hxex.exam.model.Classes" >
< id name ="id" column ="id" >
< generator class ="uuid.hex" ></ generator >
</ id >
< property name ="title" column ="title" />
< set name ="teachers" table ="teacher_class" lazy ="true" cascade ="all" >
< key column ="class_id" ></ key >
< many-to-many class ="cn.hxex.exam.model.Teacher" column ="teacher_id" ></ many-to-many >
</ set >
< set name ="students" inverse ="true" >
< key column ="class_id" ></ key >
< one-to-many class ="cn.hxex.exam.model.Student" ></ one-to-many >
</ set >
</ class >
< query name ="getTeacherNotInClasses" >
<![CDATA[ from Classes where id not in (select t.classes.id from Teacher t where t.id=:teacherid) ]]>
</ query >
< query name ="getClassesByTitle" > <![CDATA[ from Classes where title=:title ]]> </ query >
</ hibernate-mapping >
我在维护课程的老师的时候,采用的是过去持久话的Classes对象,更新其中Set Teacher实现,代码如下:
public
ActionForward saveteacher(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) throws IOException,ServletException ... {
ClassesForm classes=(ClassesForm)form;
ClassesDAO dao=(ClassesDAO)DAOFactory.getDao(ClassesDAO.class);
Classes c=(Classes)dao.findById(classes.getId(), false);
if(c!=null)...{
c.getTeachers().clear();
String[] tids=request.getParameterValues("inteachers");
if(tids!=null&&tids.length>0)...{
TeacherDAO teacherDao=(TeacherDAO)DAOFactory.getDao(TeacherDAO.class);
for(int i=0;i<tids.length;i++)...{
Teacher t=(Teacher)teacherDao.findById(tids[i], false);
c.getTeachers().add(t);
}
}
addMessage(request,"classes.msg.teacher.success");
}
return l
HttpServletRequest request, HttpServletResponse response) throws IOException,ServletException ... {
ClassesForm classes=(ClassesForm)form;
ClassesDAO dao=(ClassesDAO)DAOFactory.getDao(ClassesDAO.class);
Classes c=(Classes)dao.findById(classes.getId(), false);
if(c!=null)...{
c.getTeachers().clear();
String[] tids=request.getParameterValues("inteachers");
if(tids!=null&&tids.length>0)...{
TeacherDAO teacherDao=(TeacherDAO)DAOFactory.getDao(TeacherDAO.class);
for(int i=0;i<tids.length;i++)...{
Teacher t=(Teacher)teacherDao.findById(tids[i], false);
c.getTeachers().add(t);
}
}
addMessage(request,"classes.msg.teacher.success");
}
return l
也就是说,从Classes这一方去维护Teacher-classes的关系,结果中间表teacher-class不能保存关系数据,这是为什么呢?仔细检查,原拉在HBM文件中
<set name="teachers" table="teacher_class" lazy="true" cascade="all">
<key column="class_id"></key>
<many-to-many class="cn.hxex.exam.model.Teacher" column="teacher_id"></many-to-many>
</set>
多写了,inverse="true" 这说明Classes不去维护Classes和Teacher关系,所以,我通过c.getTeachers().add(t);
等方式去增加课程和教师的关系数据,就不起作用了
我曾经有一个文章,说在1对多关系中,维护关系的一方应该是多方,这样会提高效率,避免插入空值
多对多,我建议是在双方都进行维护,业务上也应该提供这样的功能