`

HIBERNATE一对多配置实例

阅读更多
HIBERNATE一对多配置实例
1. 环境:假定班级和学生是一对多的关系,班级是一,学生是多,对应表格分别是:zlass ,student
2. 创建Zlass和Student对象
//Zlass对象---------------------------------------------------------
    public class Zlass{
 
 private String class_id;
 private String class_name;
 private java.util.Set students;
 
 public void setId(String id){
    this.class_id = id;
 }
 
 public void setClassName(String className){
    this.class_name = className;
 }
 
 public void setStudents(java.util.Set students){
    this.students = students;
 }
 
 public String getId(){
    return class_id;
 }
 
 public String getClassName(){
    return class_name;
 }
 
 public java.util.Set getStudents(){
    return students;
 }
 
}
 
//学生对象
public class Student{
       private String student_id;
       private String name;
       private Address address;
       private java.util.Set events;
       private java.util.Set lessons;
       private Zlass zlass;
      
       public Zlass getZlass(){
              return zlass;
       }
 
       public String getStudentId(){
              return student_id;
       }
      
       public String getName(){
              return name;
       }
      
       public Address getAddress(){
              return address;
       }
      
       public java.util.Set getEvents(){
              return events;
       }
      
       public java.util.Set getLessons(){
              return lessons;
       }
 
       public void setZlass(Zlass zlass){
              this.zlass = zlass;
       }
      
       public void setStudentId(String studentId){
              this.student_id = studentId;
       }
      
       public void setName(String name){
              this.name = name;
       }
      
       public void setAddress(Address address){
              this.address = address;
       }
      
       public void setEvents(java.util.Set events){
              this.events =events;
       }
      
       public void setLessons(java.util.Set lessons){
              this.lessons = lessons;
       }
      
}
 
 
//配置文件
//----------Zlass.hbm.xml---------------
<hibernate-mapping package="com.softWork.school">
 <class name="Zlass" table="class">
    <id name="id" column="id" type="string" length="20">
      <generator class="assigned"/>
    </id>
    <property name="className" column="class_name" type="string" length="200"/>
   
    <set name="students" inverse="false" cascade="all">
      <key column="class_id"/>
      <one-to-many class="Student"/>
    </set>
 </class>
</hibernate-mapping>
//-------------Student.hbm.xml---------------
<hibernate-mapping package="com.softWork.school">
 <class name="Student" table="student">
    <id name="studentId" column="student_id" type="string" length="20">
      <generator class="assigned"/>
    </id>
    <property name="name" type="string" length="20"/>
    <component name="address" class="Address">
      <property name="state" column="state" type="string"></property>
      <property name="city" column="city" type="string"></property>
      <property name="street" column="street" type="string"></property>
    </component>
    <set name="events" inverse="false" cascade="all">
      <key column="student_id"></key>
      <one-to-many class="Event"></one-to-many>
    </set>
   
    <set name="lessons" table="student_lesson">
      <key column="student_id"/>
      <many-to-many class="Lesson" column="lesson_id" />
    </set>
    <many-to-one name="zlass" column="class_id" class="Zlass"/>
 </class>
</hibernate-mapping>
 
以上使用的是班级一端维护关系,并级连操作
 
3. 使用级连操作数据
1) 新增班级
       Zlass zlass = new Zlass();
       zlass.setId("971002");
       zlass.setClassName("机制97-1班");
session.saveOrUpdate(zlass);
2) 为班级新增学生
主动端操作:
      Zlass zlass = (Zlass)session.load(Zlass.class,"971002");
      Student student = new Student();
      student.setStudentId("005");
      student.setName("没名");
      zlass.getStudents().add(student);
      session.saveOrUpdate(zlass);
被动端操作:
      Zlass zlass = (Zlass)session.load(Zlass.class,"971002");
      Student student = new Student();
      student.setStudentId("006");
      student.setName("006");
      student.setZlass(zlass);
session.saveOrUpdate(student);
3) 删除学生资料
主动端操作:
主动端除非删除自己,并设置了级连才能删除子对象,否则无法完成
//-----以下代码将只删除两者之间的关系,即将学生的class_id设置为null-----
Zlass zlass = (Zlass)session.load(Zlass.class,"971001");
java.util.Iterator iterator = zlass.getStudents().iterator();
      if (iterator.hasNext())
        zlass.getStudents().remove(iterator.next());
      session.saveOrUpdate(zlass);
被动端操作:
              Student student = (Student)session.load(Student.class,"002");
session.delete(student);
4) 修改学生资料
通过班级修改学生资料
 
Zlass zlass = (Zlass)session.load(Zlass.class,"971002");
      java.util.Iterator iterator = zlass.getStudents().iterator();
      if (iterator.hasNext()){
        Student student = (Student)iterator.next();
        student.setName("名字已修改");
      }
session.saveOrUpdate(zlass);
 
读取返回的Set型数据:
java.util.Set set = student.getEvents();
java.util.Iterator iterator = set.iterator();
while(iterator.hasNext()){
evt = (Event)iterator.next();
System.out.println(evt.getContent());
System.out.println(evt.getDate().toString());
}
 
4. 注意:
如果需要从多放引导到一方,需要在一方配置文件中设置inverse=”true”参数,以设定一方到多方的设定是逆向映射,对关联的逆向端所做的修改将不会被持久化。
Inverse=”true”的表示两个实体的关系由对方去维护。
5. 推荐配置,一般的将”一”这一端设置为inverse=”false”,cascade=”all” ,这样一般的操作只需要在”一”这一端操作,此适合于标志性一对多的情况,如销售单和销售明细
如果是非标志性一对多,则一般的将inverse=”false”,cascade=”none”,这样关系永远在主动一端进行控制
示范:假如A对B是一对多,当A中原来有B1,B2,B3,当A中的集合中只包含B1,B2时,那么B中B3的外码将被设置为NULL,这个是CASCADE=“FALSE”的情况下的结果
分享到:
评论

相关推荐

    hibernate一对多实例

    标题中的“hibernate一对多实例”指的是在Java编程中使用Hibernate框架处理数据库关系时的一对多关联映射。Hibernate是Java领域中的一个流行对象关系映射(ORM)框架,它允许开发者用面向对象的方式操作数据库,从而...

    hibernate一对多、多对一、一对一、多对多配置实例

    本文将深入探讨Hibernate中的一对多、多对一、一对一以及多对多四种关系映射的配置实例,帮助开发者更好地理解和运用这些关系。 ### 一对多关系(One-to-Many) 在数据库设计中,一对多关系是最常见的一种关联,...

    Hibernate的多对一和一对多操作实例

    通过上述实例,我们可以清晰地看到在Hibernate框架中如何实现“多对一”和“一对多”的关系映射。这种映射机制不仅简化了实体类之间的关联,还提供了强大的数据持久化支持,使得开发者能够更专注于业务逻辑的实现,...

    hibernate 一对多,两个实例项目

    在Java的持久化框架Hibernate中,一对多关系是数据库中常见的关联类型,它表示一个...通过这两个实例,我们可以学习到如何配置、操作以及优化一对多关系,从而在实际开发中更有效地利用Hibernate进行数据持久化操作。

    Hibernate双向一对多经典实例

    **标题:“Hibernate双向一对多经典实例”** 在Java开发中,Hibernate是一个强大的对象关系映射(ORM)框架,它简化了数据库操作,使得开发者能够用面向对象的方式处理数据。本实例将聚焦于Hibernate中的一对多关系...

    Hibernate一对多实例

    本教程将详细讲解如何在Hibernate中实现一对多的关系实例,涵盖一对多的插入和查询操作。 首先,我们要理解一对多关系的基本概念。在数据库设计中,一对多关系意味着一个实体可以与多个其他实体相关联。例如,一个...

    Hibernate一对多关联实例

    本文将详细解析" Hibernate一对多关联实例 ",并涵盖关联的保存(save)、删除(delete)、查询(select)和更新(update)操作。 一、一对多关联概念 在数据库设计中,一对多关联表示一个表中的记录可以与另一个表中的多个...

    hibernate实例(一对多,多对一)

    在这个“hibernate实例(一对多,多对一)”的主题中,我们将深入探讨两种重要的关联关系:一对一(One-to-One)和一对多(One-to-Many)。 **一对一关联(One-to-One)** 在一对一关联中,一个实体与另一个实体之间...

    hibernate 一对多实例

    本实例将深入探讨如何使用Hibernate配置和处理一对多的关系。 首先,我们来理解一对多关系的基本概念。在数据库设计中,一对多关系表示一个表中的记录可以与另一个表中的多个记录相关联。在Hibernate中,这个关系...

    hibernate之一对多配置demo

    【hibernate之一对多配置demo】:在Java开发中,Hibernate是一个强大的对象关系映射(ORM)框架,它简化了数据库与Java对象之间的交互。本教程主要关注Hibernate中的一对多关系配置,并通过XML来实现,同时也涵盖了...

    hibernate一对多案例

    本案例主要探讨的是Hibernate中的一对多关系映射,这是一种常见的对象关系映射(ORM)配置,用于表示一个实体与多个其他实体之间的关联。 在传统的数据库设计中,一对多关系是指一个表(父表)中的记录可以与另一个...

    hibernate 多对多映射实例,学生 选课

    在这个“hibernate 多对多映射实例,学生 选课”项目中,我们将探讨如何使用Hibernate处理多对多关系,以及如何构建一个学生选课的系统。 首先,我们要理解多对多关系。在现实生活中,学生和课程之间就是一个典型的...

    hibernate中一对多配置

    在Java的持久化框架Hibernate中,一对多(One-to-Many)关系是数据库表之间非常常见的一种关联。这种关系表示一个实体(如一个用户)可以与多个其他实体(如用户的订单)相关联。相对应地,多对一(Many-to-One)...

    Hibernate一对多 多对一实例

    本实例将深入探讨“一对一”(OneToOne)、“一对多”(OneToMany)以及“多对多”(ManyToMany)这三种关系映射的实现方法。了解这些关系对于构建复杂的业务系统至关重要,因为它们帮助我们更好地理解和管理数据间...

    Hibernate多对多实例+数据库代码

    标题"Hibernate多对多实例+数据库代码"揭示了我们将在讨论一个使用Hibernate框架实现的多对多关系映射的实际案例。在这个实例中,开发人员将两个或多个实体之间的复杂关联转化为简单易懂的数据库操作。描述中提到...

    hibernate一对多,多对一,一对多双向关联

    “Hibernate 一对多,多对一,一对多双向关联”是指在Java持久化框架Hibernate中,实体间常见的三种关联关系。在数据库设计中,这种关联关系是常见的,例如一个用户可以有多个订单(一对多),一个订单对应一个用户...

    struts+hibernate一对多的管理系统

    总之,"Struts+Hibernate一对多的管理系统"是一个全面展示Java Web开发技术的实例,涵盖了MVC架构、ORM、数据库关系映射、事务管理等多个关键概念。通过学习和实践这个项目,开发者不仅可以熟练掌握Struts和...

Global site tag (gtag.js) - Google Analytics