现在的位置: 首页 > 综合 > 正文

无法保存中间表关系数据的解决方法

2013年11月07日 ⁄ 综合 ⁄ 共 2338字 ⁄ 字号 评论关闭

有这样一个多对多关系,一个老师任多门课程,一个课程有多门老师

我的课程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>

 我在维护课程的老师的时候,采用的是过去持久话的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

 

也就是说,从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对多关系中,维护关系的一方应该是多方,这样会提高效率,避免插入空值

多对多,我建议是在双方都进行维护,业务上也应该提供这样的功能

抱歉!评论已关闭.