one-to-many关系的更新问题

基本配置如下: 
Java代码   收藏代码
  1. 学生实体  
  2. <set  
  3.             name="selectclasses"  
  4.             lazy="false"  
  5.             inverse="true"  
  6.             cascade="all"  
  7.             sort="unsorted"  
  8.         >  
  9.   
  10.               <key  
  11.                   column="studentid"  
  12.               >  
  13.               </key>  
  14.   
  15.               <one-to-many  
  16.                   class="hemis.dao.model.hibernate.StudentCourse"  
  17.               />  
  18.         </set>  

Java代码   收藏代码
  1. 选课实体  
  2. <many-to-one  
  3.             name="student"  
  4.             class="hemis.dao.model.hibernate.Student"  
  5.             cascade="none"  
  6.             outer-join="auto"  
  7.             update="true"  
  8.             insert="true"  
  9.             access="property"  
  10.             column="studentid"  
  11.         />  

在one这边来控制及联操作,在update一个学生实体时新加入的选课实体存入数据库中,但是以前的旧的选课实体还是保留在数据库中。举个例子来说:一个学生以前选了“环境学”和“生物学”两个课程,现在这两门课都通过了,又选了“数学”和“物理”,因此需要更新学生的选课信息,删除过去的选课,加入现在的选课。 

我要达到的目的是:在及联更新“学生”实体信息时,hibernate能否自动的清除在many这端的所有旧的信息,之后再存入新的“选课”实体。




首先,你这个关系没有搞清楚吧,学生和课程应该是多对多的关系,而不是一对多的关系吧。多对多的关系的这个关系表是由Hibernate来维护的,因此,你不必考虑关系的维护了。 
其次,你要明白,多对多的关系,不需要每次对都他们的关系进行操作,你可以不进行关系的操作,比如:你可以不进行student.setCourse(set)这样的类似操作,这是根据你的需要来定的。 
最后,根据你的需要,我看你可以只对关系进行维护,不必对“学生”表进行操作,你直接可以对关系进行维护。比如:你可更新一个学生对课程的关系。 
student.setCourse(null); 
student.getCourse().add(course1); 
student.getCourse().add(course2); 
session.saveOrUpdate(student);



谢谢楼上的回复。 
没错常理上大多数人都会认为学生和课程是many-to-many的关系,我的例子可能不恰当。 
其实我针对的不是学生和课程的关系,而是one-to-many的关系,假如换成班主任和学生的关系,这二者购建成one-to-many应该没问题吧,一个班主任领导多名学生,一个学生只能从属于一个班主任。 
假设:teacher代表教师实体,student代表学生实体,studentSet表示教师拥有的所有学生集合。 
假如现在这个班的学生都毕业了,班主任要重新领导一个班了,此时必然要更新teacher实体的studentSet,一种办法是先显示的(用循环)把所有旧班的学生都删除,再购建一个新班的集合赋给teacher,再调用update(teacher)更新教师的信息。 
我的问题是:能不能不用显示的删除旧学生的信息,直接通过改变studentSet,用一条update(teacher)语句就完成相同的工作。 
我现在的代码如下: 

Java代码   收藏代码
  1. DAO dao= (DAO); BeanFactory.getBean("dao");;  
  2. Teacher teacher = dao.getTeacherById(teacherId);;  
  3. Object[] studentSet = teacher.getStudentSet();.toArray();;  
  4.   
  5. for(int i=0;i<studentSet.length;i++);{  
  6.      dao.remove(studentSet[i]);;  
  7. }  
  8.   
  9. teacher.getStudentSet();.clear();;  
  10. Set newStudentSet = new HashSet();;  
  11. //将新学生加入newStudentSet中  
  12. teacher.setStudentSet(newStudentSet);;  
  13. dao.update(teacher);;  

这样的话能够达到效果,可是我把for循环去掉: 
Java代码   收藏代码
  1. DAO dao= (DAO); BeanFactory.getBean("dao");;  
  2. Teacher teacher = dao.getTeacherById(teacherId);;  
  3. Object[] studentSet = teacher.getStudentSet();.toArray();;  
  4.   
  5. teacher.getStudentSet();.clear();;  
  6. Set newStudentSet = new HashSet();;  
  7. //将新学生加入newStudentSet中  
  8. teacher.setStudentSet(newStudentSet);;  
  9. dao.update(teacher);;  

这样以前的旧班级删不掉!后面的方法有什么问题吗?难道必须用一个循环显示的删除旧信息吗?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值