有这样一个多对多关系,一个老师任多门课程,一个课程有多门老师
我的课程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对多关系中,维护关系的一方应该是多方,这样会提高效率,避免插入空值
多对多,我建议是在双方都进行维护,业务上也应该提供这样的功能