- 学生实体
- <set
- name="selectclasses"
- lazy="false"
- inverse="true"
- cascade="all"
- sort="unsorted"
- >
- <key
- column="studentid"
- >
- </key>
- <one-to-many
- class="hemis.dao.model.hibernate.StudentCourse"
- />
- </set>
- 选课实体
- <many-to-one
- name="student"
- class="hemis.dao.model.hibernate.Student"
- cascade="none"
- outer-join="auto"
- update="true"
- insert="true"
- access="property"
- column="studentid"
- />
在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)语句就完成相同的工作。
我现在的代码如下:
- DAO dao= (DAO); BeanFactory.getBean("dao");;
- Teacher teacher = dao.getTeacherById(teacherId);;
- Object[] studentSet = teacher.getStudentSet();.toArray();;
- for(int i=0;i<studentSet.length;i++);{
- dao.remove(studentSet[i]);;
- }
- teacher.getStudentSet();.clear();;
- Set newStudentSet = new HashSet();;
- //将新学生加入newStudentSet中
- teacher.setStudentSet(newStudentSet);;
- dao.update(teacher);;
这样的话能够达到效果,可是我把for循环去掉:
- DAO dao= (DAO); BeanFactory.getBean("dao");;
- Teacher teacher = dao.getTeacherById(teacherId);;
- Object[] studentSet = teacher.getStudentSet();.toArray();;
- teacher.getStudentSet();.clear();;
- Set newStudentSet = new HashSet();;
- //将新学生加入newStudentSet中
- teacher.setStudentSet(newStudentSet);;
- dao.update(teacher);;
这样以前的旧班级删不掉!后面的方法有什么问题吗?难道必须用一个循环显示的删除旧信息吗?