hibernate入门知识-03-对象关系映射

1.数据库表有三种关系

  a.一对一

  b.多对一/一对多

  c.多对多/单向或双向关联

2.在hibernate中把表关系的概念引用到java对象中来,以下是多对一的关系

  

  班级类是一,学生类是多

  那么在配置映射文件Student.hbm.xml文件中的配置为

  

    <hibernate-mapping>
      <!-- student类和数据库中t_user表进行对应 -->
      <class name="onetomany.Students" table="t_students">


      <!-- 主键配置 student.id属性和t_user.t_id字段对应 -->
      <id name="studentId" column="t_id">


      <!-- 主键生成器:以何种方式生成主键 -->
      <generator class="native"></generator>      </id>


      <!-- 非主键属性 -->
      <property name="studentName" column="t_name"></property>
      <many-to-one name="clazz" column="t_clazz_id" cascade="save-update"></many-to-one>
      </class>

      

      <!-- 多对一配置  以   student类的属性clazz,所对应的Clazz的类,所对应的数据库表的属性t_clazz_id为外键--有点绕,多思考下就明白了>  

      //cascade="save-update"配置是该类与Clazz类的级联关系,设置为save-update是指只在添加和修改时级联,删除时不级联

    </hibernate-mapping>

  3.一对一关系

    a.表结构,主键关联:单向,一张表的主键作为外键,参考另一张表的主键)

    

    其中,person表的id作为外键,参考的是IdCard表的主键...因此Person任何一行都参考了IdCard,并且主键本身唯一,确保了Person和IdCaed一对一的关系,

    b.在person.hbm.xml映射配置如下      

      <hibernate-mapping>
        <class name="one2one.primarykey.single.Person" table="t_person">
        

        <id name="id" column="t_id">
          <!-- Person的主键依赖于自己的成员变量idCard所表示的类型IdCard,,,所映射的表t_idcard的主键t_id -->
          <generator class="foreign">
            <param name="property">idCard</param>
          </generator>
        </id>

        //表示在生成数据表时会加上主外键约束
        <one-to-one name="idCard" constrained="true"></one-to-one>
        </class>
      </hibernate-mapping>

    c.唯一外键关联,也就是在person中设置外键+设置唯一性约束(非主键);

        其中IdCard是多的一方,该类有person集合;

      

    public class IdCard {
    private int id;
    private long number;
    private Person person;
    public Person getPerson() {
    return person;
    }
    public void setPerson(Person person) {
    this.person = person;
    }
    public int getId() {
    return id;
    }
    public void setId(int id) {
    this.id = id;
    }
    public long getNumber() {
    return number;
    }
    public void setNumber(long number) {
    this.number = number;
    }

      映射文件配置

    

    <hibernate-mapping>
    <class name="one2one.primarykey.single.IdCard" table="t_idcard">
    <id name="id" column="t_id">
    <generator class="native"></generator>
    </id>
    <property name="number" column="t_number"></property>
    <one-to-one name="person"></one-to-one>
    </class>
    </hibernate-mapping>

  

原文地址:https://www.cnblogs.com/ou134568/p/6860701.html