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>


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM