初学GIT,我的一点笔记(2012-8-2)
2012-08-02 11:09
363 查看
关于hibernate 的one-to-many级联更新,数据库数据遗留问题时间:2008-07-11 17:19:28 来源:论坛整理 作者: 编辑:chinaitzhe班主任和学生的关系,这二者购建成one-to-many应该没问题吧,一个班主任领导多名学生,一个学生只能从属于一个班主任。
假设:teacher代表教师实体,student代表学生实体,studentSet表示教师拥有的所有学生集合。
假如现在这个班的学生都毕业了,班主任要重新领导一个班了,此时必然要更新teacher实体的studentSet,一种办法是先显示的(用循环)把所有旧班的学生都删除,再购建一个新班的集合赋给teacher,再调用update(teacher)更新教师的信息。
我的问题是:能不能不用显示的删除旧学生的信息,直接通过改变studentSet,用一条update(teacher)语句就完成相同的工作。
我现在的代码如下:
[code:1]
Java code
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
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);
[/code:1]
这样的话能够达到效果,可是我把for循环去掉:
[code:1]
Java code
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
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);
[/code:1]
这样以前的旧班级删不掉!后面的方法有什么问题吗?难道必须用一个循环显示的删除旧信息吗?
原文地址:http://www.iteye.com/topic/14143
网友回复:此回复为自动发出,仅用于显示而已,并无任何其他非凡作用
楼主【fengsky491】截止到2008-07-11 10:01:24的历史汇总数据(不包括此帖):
发帖的总数量:46 发帖的总分数:990 每贴平均分数:21
回帖的总数量:60 得分贴总数量:4 回帖的得分率:6%
结贴的总数量:43 结贴的总分数:820
无满足结贴数:10 无满足结贴分:180
未结的帖子数:3 未结的总分数:170
结贴的百分比:93.48 % 结分的百分比:82.83 %
无满足结贴率:23.26 % 无满足结分率:21.95 %
值得尊敬
网友回复:
Java code
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
[code:1]
老师实体
<set
name="teacher"
lazy="false"
inverse="true"
cascade="all"
sort="unsorted"
>
<key
column="teacherId"
>
</key>
<one-to-many
class="hemis.dao.model.hibernate.StudentCourse"
/>
</set>
[/code:1]
[code:1]
学生实体
<many-to-one
name="student"
class="hemis.dao.model.hibernate.Student"
cascade="none"
outer-join="auto"
update="true"
insert="true"
access="property"
column="studentid"
/>[/code:1]
把原文的学生和选课实体,改为了老师和学生实体
网友回复:我现在碰到的问题,就象上述一样。
采用的解决方法是先把旧的数据(多的一方的数据)删掉,在把新的插入。
难道只能用这种方法吗?Hibernate没用更好的方案吗?
网友回复:在teacher的hbm的配置文件中cascade设置成all-delete-orphan
XML code
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
<set name="studentSet" cascade="all-delete-orphan" ......>
<one-to-many class="xxx.Student" />
</set>
之后再你的dao里面
Java code
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
DAO dao= (DAO) BeanFactory.getBean("dao");
Teacher teacher = dao.getTeacherById(teacherId);
Object[] studentSet = teacher.getStudentSet().toArray();
Set newStudentSet = new HashSet();
//将新学生加入newStudentSet中
teacher.setStudentSet(newStudentSet);
dao.update(teacher);
网友回复:引用 4 楼 Landor2004 的回复:
在teacher的hbm的配置文件中cascade设置成all-delete-orphan
XML code <set name="studentSet" cascade="all-delete-orphan" ......>
<one-to-many class="xxx.Student" />
</set>
之后再你的dao里面
Java codeDAO dao= (DAO) BeanFactory.getBean("dao");
Teacher teacher = dao.getTeacherById(teacherId);
Object[] studentSet = teacher.getStudentSet().toArray();
Set newStudentSet = new …
我也是这么改的,上面的例子很我的很相似,所以把他的代码copy过来了,
按照你的方法我早试过了,还是不行,
这样只能加入新的,旧的去不掉
网友回复:这样似乎不行,看了下面的帖子 http://hi.baidu.com/ekou/blog/item/aa89e80e8df9ece436d122b4.html 楼主修改成这样
1 在实体中把setStudentSet方法设置成私有private
2 在实体中增加如下方法
Java code
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
public void addStudentSet(Student s) {
getStudentSet().add(s);
s.setPerson(this);
}
3 设置cascade="all-delete-orphan"
4 在dao中
Java code
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
DAO dao= (DAO) BeanFactory.getBean("dao");
Teacher teacher = dao.getTeacherById(teacherId);
teacher.getStudentSet().clear();
//将新学生加入newStudentSet中
teacher.addStudentSet(student1);
teacher.addStudentSet(student2);
teacher.addStudentSet(student3);
dao.update(teacher);
网友回复:回楼上,还是解决不了问题。
网友回复:个人觉得中间少了一个班级实体,班主任老师和班级之间是一对多的关系,和现任班级是一对一的关系,班级与学生是一对多关系,一个班毕业了,班主任的现任班级就为空了,当任新班主任后,现任班级就是新的班级,所以只要改现任班级就行,原来的数据不用删除
网友回复:引用 8 楼 new_bird_0001 的回复:
个人觉得中间少了一个班级实体,班主任老师和班级之间是一对多的关系,和现任班级是一对一的关系,班级与学生是一对多关系,一个班毕业了,班主任的现任班级就为空了,当任新班主任后,现任班级就是新的班级,所以只要改现任班级就行,原来的数据不用删除
我这是用班主任和学生来举例,这里也存在退学,休学的学生是不?
网友回复:班主任和学生是一对多的,原来学生毕业了,假如你想在建立新学生同时从数据库删除毕业的学生的话
按照上面的配置,绝对没问题,假如你说不行,那是你没按照上面说的做,或者你配置错误!
网友回复:谢谢Landor2004:
是我的配置出错了。
经测试
1 在实体中把setStudentSet方法设置成私有private
不用设为private ,public也行。
非常感谢!
假设:teacher代表教师实体,student代表学生实体,studentSet表示教师拥有的所有学生集合。
假如现在这个班的学生都毕业了,班主任要重新领导一个班了,此时必然要更新teacher实体的studentSet,一种办法是先显示的(用循环)把所有旧班的学生都删除,再购建一个新班的集合赋给teacher,再调用update(teacher)更新教师的信息。
我的问题是:能不能不用显示的删除旧学生的信息,直接通过改变studentSet,用一条update(teacher)语句就完成相同的工作。
我现在的代码如下:
[code:1]
Java code
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
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);
[/code:1]
这样的话能够达到效果,可是我把for循环去掉:
[code:1]
Java code
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
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);
[/code:1]
这样以前的旧班级删不掉!后面的方法有什么问题吗?难道必须用一个循环显示的删除旧信息吗?
原文地址:http://www.iteye.com/topic/14143
网友回复:此回复为自动发出,仅用于显示而已,并无任何其他非凡作用
楼主【fengsky491】截止到2008-07-11 10:01:24的历史汇总数据(不包括此帖):
发帖的总数量:46 发帖的总分数:990 每贴平均分数:21
回帖的总数量:60 得分贴总数量:4 回帖的得分率:6%
结贴的总数量:43 结贴的总分数:820
无满足结贴数:10 无满足结贴分:180
未结的帖子数:3 未结的总分数:170
结贴的百分比:93.48 % 结分的百分比:82.83 %
无满足结贴率:23.26 % 无满足结分率:21.95 %
值得尊敬
网友回复:
Java code
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
[code:1]
老师实体
<set
name="teacher"
lazy="false"
inverse="true"
cascade="all"
sort="unsorted"
>
<key
column="teacherId"
>
</key>
<one-to-many
class="hemis.dao.model.hibernate.StudentCourse"
/>
</set>
[/code:1]
[code:1]
学生实体
<many-to-one
name="student"
class="hemis.dao.model.hibernate.Student"
cascade="none"
outer-join="auto"
update="true"
insert="true"
access="property"
column="studentid"
/>[/code:1]
把原文的学生和选课实体,改为了老师和学生实体
网友回复:我现在碰到的问题,就象上述一样。
采用的解决方法是先把旧的数据(多的一方的数据)删掉,在把新的插入。
难道只能用这种方法吗?Hibernate没用更好的方案吗?
网友回复:在teacher的hbm的配置文件中cascade设置成all-delete-orphan
XML code
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
<set name="studentSet" cascade="all-delete-orphan" ......>
<one-to-many class="xxx.Student" />
</set>
之后再你的dao里面
Java code
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
DAO dao= (DAO) BeanFactory.getBean("dao");
Teacher teacher = dao.getTeacherById(teacherId);
Object[] studentSet = teacher.getStudentSet().toArray();
Set newStudentSet = new HashSet();
//将新学生加入newStudentSet中
teacher.setStudentSet(newStudentSet);
dao.update(teacher);
网友回复:引用 4 楼 Landor2004 的回复:
在teacher的hbm的配置文件中cascade设置成all-delete-orphan
XML code <set name="studentSet" cascade="all-delete-orphan" ......>
<one-to-many class="xxx.Student" />
</set>
之后再你的dao里面
Java codeDAO dao= (DAO) BeanFactory.getBean("dao");
Teacher teacher = dao.getTeacherById(teacherId);
Object[] studentSet = teacher.getStudentSet().toArray();
Set newStudentSet = new …
我也是这么改的,上面的例子很我的很相似,所以把他的代码copy过来了,
按照你的方法我早试过了,还是不行,
这样只能加入新的,旧的去不掉
网友回复:这样似乎不行,看了下面的帖子 http://hi.baidu.com/ekou/blog/item/aa89e80e8df9ece436d122b4.html 楼主修改成这样
1 在实体中把setStudentSet方法设置成私有private
2 在实体中增加如下方法
Java code
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
public void addStudentSet(Student s) {
getStudentSet().add(s);
s.setPerson(this);
}
3 设置cascade="all-delete-orphan"
4 在dao中
Java code
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
DAO dao= (DAO) BeanFactory.getBean("dao");
Teacher teacher = dao.getTeacherById(teacherId);
teacher.getStudentSet().clear();
//将新学生加入newStudentSet中
teacher.addStudentSet(student1);
teacher.addStudentSet(student2);
teacher.addStudentSet(student3);
dao.update(teacher);
网友回复:回楼上,还是解决不了问题。
网友回复:个人觉得中间少了一个班级实体,班主任老师和班级之间是一对多的关系,和现任班级是一对一的关系,班级与学生是一对多关系,一个班毕业了,班主任的现任班级就为空了,当任新班主任后,现任班级就是新的班级,所以只要改现任班级就行,原来的数据不用删除
网友回复:引用 8 楼 new_bird_0001 的回复:
个人觉得中间少了一个班级实体,班主任老师和班级之间是一对多的关系,和现任班级是一对一的关系,班级与学生是一对多关系,一个班毕业了,班主任的现任班级就为空了,当任新班主任后,现任班级就是新的班级,所以只要改现任班级就行,原来的数据不用删除
我这是用班主任和学生来举例,这里也存在退学,休学的学生是不?
网友回复:班主任和学生是一对多的,原来学生毕业了,假如你想在建立新学生同时从数据库删除毕业的学生的话
按照上面的配置,绝对没问题,假如你说不行,那是你没按照上面说的做,或者你配置错误!
网友回复:谢谢Landor2004:
是我的配置出错了。
经测试
1 在实体中把setStudentSet方法设置成私有private
不用设为private ,public也行。
非常感谢!
相关文章推荐
- 初学map做的一点笔记,不求甚解,先会用
- Git初学笔记
- GIT 初学笔记--建立一个项目
- Git初学笔记(一)
- GIT初学的学习笔记
- Git初学 小白笔记(二)
- 每天学一点,能吃3大碗--spring初学笔记
- git初学笔记
- 初学struts2的一点笔记(struts2.1.6、struts2.2.1)
- 关于一点coding.net与git配合在AndroidStudio/Idea上的使用笔记个的
- 乱七八糟的什么都有,初学时的一点笔记类的东西
- Verilog 初学笔记--顺序操作 和 并行操作的一点思考(参考黑金教程:Verilog HDL那些事 建模篇)
- git源码管理初学笔记整理
- git源码管理初学笔记整理
- GIT初学笔记
- Git初学 小白笔记(一)
- 内存管理的一点补充笔记
- python初学笔记2
- 【Git 使用笔记】第一部分:安装git 和 使用git
- 零碎笔记——Git的简易使用