hibernate中对象与对象的关系(一):一对多,多对一

对象和对象之间所谓的一对多就是

   建立一对多关系关系的表的原则是将一的一方的主键加入到多的一方的表作为外键。这里以学生和班级为例子来演示。使用hibernate时,需要在“一”的一方类(Clazz)中加入一个set集合,里面存放 “多”(Student)的对象。也就是说在Clazz类中需要加入一个set集合,存放Student对象,因为一个班级里面对应多个学生,所以用一个集合来表示。班级和学生类的代码如下:一般情况下,都是双向的,所谓双向,也就是可以通过学生找到他在哪个班,也可以通过班级找到班里有哪些学生;

单向:一对多例子-->

Student类:

public class Student {
    private Long id;
    private String name;
}
根据javaBean规范生成setter和getter方法,以下的对象类都需要根据javaBean规范

Clazz类:

public class Clazz {
    private Long id;
    private String name;
    private Set<Student> stus = new HashSet<>();
}

映射文件-->

Clazz.hbm.xml;

<hibernate-mapping package="objectn.exus.s1_one2many">
    <class name="Clazz">
        <id name="id" column="c_id">
            <generator class="native"/>
        </id>
      <property name="name" />
      <!-- set中的name属性为Clazz类中Set<Student>集合的对象  -->

      <set name="stus">
          <!-- 在学生表中生成c_id这一列,和id成主外键关系 -->
          <key column="c_id"/>
          <!-- 一对多:一个班级对多个学生 -->
          <one-to-many class="Student" />
      </set>

    </class>
</hibernate-mapping>

Student.hbm.xml;

<hibernate-mapping package="objectn.exus.s1_one2many">
    <class name="Student">
        <id name="id">
            <generator class="native"/>
        </id>
      <property name="name" />
    </class>
</hibernate-mapping>

单向:多对一例子-->(即多个学生对应一个班级)

Clazz类:

public class Clazz {
    private Long id;
    private String name;
}

Student类:

public class Student {
    private Long id;
    private String name;
    private Clazz clz;//Clazz类为Student的字段
}

Clazz.hbm.xml;

<hibernate-mapping package="objectn.exus.s2_many2one">
    <class name="Clazz">
        <id name="id" column="c_id">
            <generator class="native"/>
        </id>
      <property name="name" />
    </class>
</hibernate-mapping>

Student.hbm.xml;

<hibernate-mapping package="objectn.exus.s2_many2one">
    <class name="Student">
        <id name="id">
            <generator class="native"/>
        </id>
      <property name="name" />
      <!-- 多对一,name为类中的变量 ,column为生成的列名-->

      <many-to-one name="clz" column="c_id"></many-to-one>

    </class>
</hibernate-mapping>

我们会发现.当一对多的时候,我们并不能通过学生找到班级,只能知道班级里有哪些学生,当多对一的时候,我们只能知道学生在哪个班,而不能知道班里都有哪些学生,下面为双向的列子:也就是既可以通过学生找到班级,也可以通过班级找到学生;

双向:

Clazz类:

public class Clazz {
    private Long id;
    private String name;
    private Set<Student> stus = new HashSet<>();
}

Student类:

public class Student {
    private Long id;
    private String name;
    private Clazz clz;//Clazz类为Student的字段
}

Clazz.hbm.xml;

<hibernate-mapping package="objectn.exus.s2_many2one">
    <class name="Clazz">
        <id name="id" column="c_id">
            <generator class="native"/>
        </id>
      <property name="name" />
      <!-- set中的name属性为Clazz类中Set<Student>集合的对象  -->
      <set name="stus">
          <!-- 在学生表中生成c_id这一列,和id成主外键关系 -->
          <key column="c_id"/>
          <!-- 一对多:一个班级对多个学生 -->
          <one-to-many class="Student" />
      </set>
    </class>
</hibernate-mapping>

Student.hbm.xml;

<hibernate-mapping package="objectn.exus.s2_many2one">
    <class name="Student">
        <id name="id">
            <generator class="native"/>
        </id>
      <property name="name" />
      <!-- 多对一,name为类中的变量 ,column为生成的列名-->
      <many-to-one name="clz" column="c_id"></many-to-one>
    </class>
</hibernate-mapping>
原文地址:https://www.cnblogs.com/zhang-bo/p/6575889.html