`
frank_xu
  • 浏览: 15856 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

one-to-many

阅读更多
关于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也行。

非常感谢!
分享到:
评论

相关推荐

    Hibernate one-to-many / many-to-one关系映射

    "Hibernate one-to-many / many-to-one关系映射"是两个基本的关系类型,用于表示实体间的关联。在这个主题中,我们将深入探讨这两种关系映射的原理、配置和实际应用。 一、一对一(one-to-one)与一对多(one-to-...

    (4)Hibernate中的many-to-one和one-to-many关系

    本话题主要探讨两种基本的关系映射类型:many-to-one(多对一)和one-to-many(一对多)。这两种关系映射是数据库中常见的关联类型,理解和掌握它们对于开发高质量的Java应用至关重要。 1. many-to-one关系 many-to...

    hibernate学习5之one-to-many双向关联.docx

    在配置双向一对多关联时,我们通常在"多"一端(这里是`Student`)的集合属性上使用`&lt;many-to-one&gt;`标签,将`Classes`对象映射到数据库中的外键。同时,在"一"端(`Classes`)使用`&lt;set&gt;`标签,表示班级可以包含多个...

    Hibernate-one-to-many

    同时,`Account.hbm.xml`中的`many-to-one`元素将`column`属性设置为`FID`,表示通过`FID`字段关联到`User`实体。 #### 测试场景解释 在测试场景中,我们创建了一个`User`对象和一个`Account`对象,并在`User`对象...

    Hibernate one-to-many-annotation

    在Hibernate中,`one-to-many`关系是常见的实体间关系之一,表示一个实体可以与多个其他实体相关联。本文将深入探讨`Hibernate one-to-many`注解的使用和实现细节。 ### 一、`@OneToMany`注解概述 `@OneToMany`...

    NHibernate One-to-Many一对多映射-xxlinux_com

    在数据库世界中,一对多(One-to-Many)关系是一种常见的关联类型,其中一个表(父表)可以与多个其他表(子表)相关联。在NHibernate中,配置这种映射关系对于理解和使用ORM至关重要。 一对多关系意味着一个实体...

    hibernate one-to-many 单/双向关联映射配置心得

    本文主要关注Hibernate中的一个核心概念——一对一(One-to-One)、一对多(One-to-Many)和多对一(Many-to-One)关联映射,特别是关于“一到多”单向和双向关联映射的配置心得。 首先,让我们了解“一到多”关联...

    hibernate many-to-one(多对一)及 cascade(级联).doc

    ### Hibernate Many-to-One (多对一) 及 Cascade (级联) #### 一、Many-to-One(多对一) 在数据库设计中,实体之间的关系主要包括一对一、一对多、多对多等几种类型。而在ORM(对象关系映射)框架Hibernate中,...

    Hibernate Mapping Many-to-One 实例 内附源代码及附件下载

    本实例将详细讲解如何在Hibernate中实现Many-to-One关系映射,这是一种常见的数据库关联,表示一个实体可以与多个其他实体相关联。 在Many-to-One关系中,通常一个实体(如部门)可以有多个相关实体(如员工),而...

    hb-04-one-to-many-uni

    标题“hb-04-one-to-many-uni”和描述中的信息看似简洁,但结合标签“Java”,我们可以推测这是一个关于Java编程中的一个特定主题——一对一(One-to-One)、一对多(One-to-Many)关系的统一处理(uni)的示例项目...

    Hibernate one to many(many to one) 配置

    标题"Hibernate one to many(many to one) 配置"涉及到的是关系型数据库在Java中的持久化框架Hibernate中的两种关联映射关系:一对一(One-to-One)和多对一(Many-to-One)。在数据库设计中,这种关系很常见,例如...

    nhibernate one-to-meny

    "one-to-many"是数据库关系模型中的一种关联类型,表示一个实体可以与多个其他实体相关联。在这个例子中,我们将深入探讨如何在NHibernate中实现这种关系。 在传统的数据库设计中,one-to-many关系通常体现在一个表...

    Hibernate Tutorial 04 (Many-to-one and One-to-one Association

    #### 一、多对一关联(Many-to-One) 在本章中,我们将探讨如何在 Hibernate 中处理多对一关联。这种关联类型非常常见,在许多应用中都会遇到。例如,在一个在线书店应用中,每本书都与一个出版商关联,而一个出版...

    Many-to-one关联映射

    关联映射的本质: 将关联关系映射到数据库,所谓的...&lt;many-to-one&gt;会在多的一端加入一个外键,指向一的一端,这个外键是由&lt;many-to-one&gt; 中的column属性定义的,如果忽略了这个属性那么默认的外键与实体的属性一致

    org-one-to-many:Elisp 功能将 Org 文件分成许多部分,对应于某个固定级别的标题

    标题提到的“org-one-to-many”是一个Elisp(Emacs Lisp)扩展,旨在将一个大的Org文件拆分为多个小文件,每个小文件对应于原文件中特定级别的标题。这种功能有助于更好地管理和维护大型文档,提高编辑效率。 Org...

    webrtc-one-to-many

    当你克隆或下载了“webrtc-one-to-many-master”压缩包并解压后,你可以按照以下步骤操作: 1. **安装依赖**: 在命令行中,导航到项目根目录,然后运行`npm install`或`yarn`。这会根据`package.json`文件中的...

    hibernate one-to-one 一对一唯一外键关联映射_单向 and 双向

    在上面的配置中, `&lt;many-to-one&gt;` 标签指定了Person实体与IdCard实体之间的一对一唯一外键关联关系,其中unique="true"指定了多的一端的多重性为一。 Hibernate 一对一唯一外键关联映射的应用 在实际应用中,一对...

    hibernate-one-to-many-uni

    【标题】"hibernate-one-to-many-uni" 指的是在Hibernate框架下实现的一对多单向关联关系。Hibernate是Java开发中常用的持久化框架,它简化了数据库操作,使得开发者可以更加专注于业务逻辑而不是数据库交互。在这个...

    hiberante - one to many - update

    标题中的“hibernate - one to many - update”指的是Hibernate框架中关于一对一(One-to-Many)关系映射和更新操作的知识点。在Java开发中,Hibernate是一个流行的对象关系映射(ORM)工具,它允许开发者用面向对象...

    many-to-one 配置详解

    many-to-one 配置详解 讲的很清楚 适合新手 值得下载

Global site tag (gtag.js) - Google Analytics