`

Hibernate 一对多配置实例(inverse)

 
阅读更多
HIBERNATE一对多配置实例
1.环境:假定班级和学生是一对多的关系,班级是一,学生是多,对应表格分别是:zlass ,student
2.创建Zlass和Student对象
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"/><1--class_id 是学生表中的班级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>

对班级和学生进行维护
// 使用级连操作数据
//新增班级
Zlass zlass = new Zlass();
zlass.setId("971002");
zlass.setClassName("机制97-1班");
session.saveOrUpdate(zlass);
//为班级新增学生
//主动端操作:
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);
//删除学生资料
//主动端操作:
//主动端除非删除自己,并设置了级连才能删除子对象,否则无法完成
//以下代码将只删除两者之间的关系,即将学生的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);
//修改学生资料
//通过班级修改学生资料
 
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());
}

注意:
inverse属性默认是false,若为false,则对应的属性由自己(一方)控制,若为true,则关联由对方(多方)控制。
inverse属性只能在set、list、map等几个标签中设置。
如果需要从多方引导到一方,需要在一方配置文件中设置inverse=”true”参数,以设定一方到多方的设定是逆向映射,对关联的逆向端所做的修改将不会被持久化。
inverse=”true”的表示关系维护的权力交给对方。
推荐配置,一般的将”一”这一端设置为inverse=”false”,cascade=”all”。这样一般的操作只需要在”一”这一端操作,此适合于标志性一对多的情况,如销售单和销售明细
如果是非标志性一对多,则一般的将inverse=”true”,cascade=”none”,这样关系永远在主动一端进行控制。
示范:假如A对B是一对多,当A中原来有B1,B2,B3,当A中的集合中只包含B1,B2时,那么B中B3的外码将被设置为NULL,这个是inverse=“FALSE”的情况下的结果。

如果我们将Class类映射文件的<set>元素中的inverse属性修改为true,这就是告诉Hibernate:Class类不维护主外键关系了,这个任务就交给了Student类。于是,我们再执行上面的代码,Hibernate就会只执行三条insert语句,而不会执行任何update语句。因为Hibernate会通过Student类的s1.getClass().getID()和s2.getClass().getID()来确定CLASS_ID字段的值。
故,为了节省数据库资源,省却不必要的update语句,我们一般建议在一对多双向关联关系中,将一方的inverse属性设置为true,即将主外键的关系交由多方来维护。

例子:http://www.cnblogs.com/otomedaybreak/archive/2012/01/17/2324772.html


分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

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

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

    hibernate一对多案例

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

    hibernate之一对多配置demo

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

    hibernate中一对多配置

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

    hibernate一对多双向

    在探讨“Hibernate一对多双向”这一主题时,我们首先需要理解Hibernate框架以及它在Java开发中的重要性。Hibernate是一个开放源代码的对象关系映射(ORM)框架,它为Java应用程序提供了一种将对象模型与数据库模型相...

    Hibernate双向一对多

    标题"Hibernate双向一对多"指的是Hibernate框架中的一个重要关系映射概念,即在一个实体类中,一个实例可以与多个另一个实体类的实例相关联,而在另一个实体类中,每个实例也可以关联到该实体类的一个实例。...

    hibernate如何实现一对多的关联源代码

    Hibernate一对多关联配置 #### XML配置方式: 在Hibernate的映射文件中,我们通常会在一方(拥有端)的实体类映射文件中添加`&lt;set&gt;`或`&lt;list&gt;`标签来表示一对多关系。以下是一个简单的例子: ```xml &lt;!-- "一"端...

    hibernate自身关联一对多实例(树形结构)

    本文将深入探讨“Hibernate自身关联一对多实例(树形结构)”这一主题,这在构建具有层次结构的数据模型时尤其常见,例如组织结构、地区树或者商品分类等。 首先,我们需要理解Hibernate的核心概念。Hibernate允许...

    Hibernate一对多映射

    在Java的持久化框架Hibernate中,一对多映射(One-to-Many Mapping)是一种常见的关系映射类型,它反映了数据库中...对于学校等教育机构的信息系统,掌握并灵活运用Hibernate一对多映射将极大地提升数据库管理的效率。

    hibernate双向一对多关联映射(XML)

    在Java的持久化框架Hibernate中,双向一对多关联映射是一种常见的关系数据库模型与对象模型之间的映射方式。这种映射允许在一个实体类中存在多个另一个实体类的实例,而在另一个实体类中也可能存在对第一个实体类的...

    12 Hibernate 一对多.doc

    本文将深入探讨Hibernate框架中的一对多关系映射,并以MyEclipse 6为开发环境,通过一个实战案例来展示如何配置和使用。在数据库设计中,一对多关系表示一个实体可以与多个其他实体相关联,例如一个家庭可以有多名...

    hibernate 一对多关联

    **标题:“Hibernate 一对多关联”** 在Java的持久化框架Hibernate中,一对多关联是一种常见的关系映射,它模拟了数据库中的外键关联。这种关联类型表示一个实体(如用户)可以拥有多个关联的实体(如订单)。下面...

    hibernate单向多对多映射(XML版)

    本主题聚焦于"hibernate单向多对多映射",特别是在XML配置文件中的实现。在这个过程中,我们将探讨多对多关系的原理,以及如何在Hibernate中通过XML配置文件来定义这种关系。 首先,我们需要理解多对多关系的概念。...

    hibernate配置文件详解

    * `set`:定义一对多关联关系 这些配置项是 Hibernate 建立对象关系映射所需的基本信息。 Hibernate 配置文件是其核心组件之一,用于定义 Hibernate 的运行期参数。通过 hibernate.cfg.xml 和 .hbm.xml 文件,我们...

    Hibernate一对多关系的处理.doc

    以下是一个简化的一对多关系配置实例: ```xml &lt;hibernate-mapping package="entity.test"&gt; &lt;!-- 一对多关系配置 --&gt; &lt;set name="computers" inverse="true" lazy="true" cascade="save-update"&gt; ...

    hibernate一对多映射

    在Hibernate中,我们可以通过以下方式配置一对多映射: 1. **配置XML映射文件**: 在Hibernate中,映射通常通过`hbm.xml`文件进行。对于"一"端(例如,User类),我们将在其映射文件中定义一个`&lt;set&gt;`或`&lt;list&gt;`...

    hibernate的多对多配置

    在Java的持久化框架Hibernate中,多对多(Many-to-Many)关系是数据库中常见的关联类型,允许一个实体实例对应多个其他实体实例,反之亦然。本篇将深入探讨如何在Hibernate中配置多对多关系,特别是通过hibernate....

    Hibernate之一对多关联

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

    Hibernate关联关系配置

    下面展示了一对多关系在Hibernate中的具体配置方式: **消费者类(Customer)的配置**: ```xml &lt;!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" ...

Global site tag (gtag.js) - Google Analytics