hibernate对象关系

来源:互联网 发布:什么是淘宝实体店 编辑:程序博客网 时间:2024/06/10 17:28

 

hibernate学习第二天总结

 昨天我们学到了处理单个对象的hibernateAPI,已经配置mapping,今天我们来学习,对象和对象之间有关系的,hibernate是怎么处理的
对象和对象之间的关系有关联关系,关联关系又分为一对一的关联,一对多的关联,多对多的关联

 一对一的关系有 共享主键见表方式  唯一外键见表方式

 共享主键建表方式 即一张表的主键,做了主键又做了外键

 下面我做了一个列子,一个是类是人,一个类是护照
 一个人对应一本护照
 
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "
http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >
//hibernate的DTD
<hibernate-mapping package="day2">//为了在类前面少写类名,所以可以再hibernate-mapping可以加上packae属性
   <class name="Person" table="t_person">//person这个类对应数据库里面的t_person
      <id name="id" column="t_id" type="java.lang.Integer">//t_person的主键生成器是自增长
        <generator class="increment"></generator>
      </id>
      <property name="name" type="java.lang.String" column="t_name"/>
      <property name="age" type="java.lang.Integer" column="t_age"/>
      <property name="birthday" type="java.util.Date" column="t_birthday"/>
      <one-to-one name="passport" class="Passport" cascade="all"></one-to-one>
 //Person类里面有一个Passport类的关联属性,名字叫做passport,根据传递性持久化,要保存person对象的时候,同时要保存
 passport对象,所以关联属性passport里面的 passport对象存放到 Passport类所对应的表里面 ,即是t_passport表
 对于 one-to-one标签默认的外键是 t_passport的主键,级联为all,意思就是当t_person表添加删除修改,查询的时候都带上
 t_passport的内容
   </class>
   <class name="Passport" table="t_passport">//Passport类对应数据库里面的t_passport数据表
      <id name="id" column="t_id" type="java.lang.Integer">//t_passport表的主键生成器
         <generator class="foreign">//这个主键生成器,我理解为是外键
            <param name="property">person</param>
  //这个外键来自哪里呢,来自一个属性,属性的名字是自己的关联属性person所对应的那个对象的主键
         </generator>
      </id>
      <property name="serial" type="java.lang.String" column="t_serial"/>
      <property name="expire" type="java.lang.Integer" column="t_expire"/>
      <one-to-one name="person" class="Person" cascade="all" constrained="true"></one-to-one>

 //在passport类里面有一个person关联属性,根据传递性可持久化,在查询passport所对应的表的时候要把person对象所对应的表
 也要查询出来,所以保存这个person对象 到Person类所对应的表里面,级联为all,外键为t_person的主键 constrained="true"
  意思是申明这t_passport是子表
   </class>
</hibernate-mapping>


下面是唯一外键,我也举个列子


举得列子是每个公司都有相应的地址

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "
http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >
<hibernate-mapping package="day2">
  <class name="Company" table="t_company">
    <id name="id" column="t_id" type="java.lang.Integer">
      <generator class="increment">
      </generator>
    </id>
    <property name="name" type="java.lang.String" column="t_name"/>
    <property name="openDate" type="java.util.Date" column="t_open_date"/>
    <one-to-one name="a" class="Address" property-ref="c" cascade="save-update"></one-to-one>
     //Company类里面有一个关系属性名字叫a类型是Address,当保存更新查询的时候,这个关系属性,就会去参考Address的c属性

因为现在不是去参考另一张表的主键了,而去参考另一张表的 私自的字段,在t_address表里面有一个c_id列,

比如举个列子当查询的时候,查询条件是查询公司id为1 的地址,那么因为有onetoone标签,所以他有一个引用,这个应用的名字叫做a,引用的类型是Address,当读到property-ref="c" 这句话的时候他就去读取Address类里面的c属性,又因为c属性是个company对象的引用,这个company对象里面有主键id的信息,所以在t_address表里面有用,根据这个主键信息,把相关 的记录查出来,查出来又是一个Address对象,所以信息是这么查出来的
  </class>
  <class name="Address" table="t_address">
    <id name="id" column="t_id" type="java.lang.Integer">
       <generator class="increment">
       </generator>
    </id>
    <property name="city" column="t_city" type="java.lang.String"/>
    <property name="street" column="t_street" type="java.lang.String"/>
    <property name="zipCode" column="t_zip_code" type="java.lang.String"/
    <many-to-one unique="true" name="c" class="Company" column="c_id" cascade="save-update" ></many-to-one>

// 这边为什么用many to one 标签呢,因为这个一对一的关系,这个字表有一个列是外键列,外键列,本来是可以重复的,这么就是

一个公司可以有多个地址。所以在原意上就是用many to one 不过我们可以加上unique属性等于true,就可以保证这个外键列是不重负的,这个关系属性名字叫做c,对应的表示Company所对应的表,在数据库里面所对应的字段是c_id,这个就是在数据库中的这个外键列的名字,级联样式为,保存和更新,
  </class>
  
</hibernate-mapping>

 

 

 

下面是一个一对多的样例

 

举得例子就是一个部门下游多个员工

这是一个单向关系,就是部门能找到员工,而员工不能找到部门

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "
http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >
<hibernate-mapping package="day2">
  <class name="Dept" table="t_dept">
    <id name="id" column="t_id" type="java.lang.Integer">
      <generator class="increment">//主键的增长模式是自己在原有的基础上增加1
      </generator>
    </id>
    <property name="dname" column="t_dname" type="java.lang.String"></property>//普通属性
    <property name="dno" column="t_dno" type="java.lang.String"></property>
    <set name="employees" cascade="save-update">

      <key column="d_id"/>
      <one-to-many class="Employee"/>
    </set>

//因为在Dept类里面有一个set的Emplyee对象的集合,用来表示一个部门有多个员工,name=employees意思是这个属性的名字叫

employees,级联为保存,修改,查询,column=d_id意思是对应Employee类所对应的表的d_id外键

  </class>
  <class name="Employee" table="t_employee">
    <id name="id" column="t_id" type="java.lang.Integer">
      <generator class="increment">
      </generator>
    </id>
    <property name="name" column="t_name" type="java.lang.String"></property>
    <property name="email" column="t_email" type="java.lang.String"></property>
    <property name="birthday" column="t_birthday" type="java.util.Date"></property>
    <property name="salary" column="t_salary" type="java.lang.Double"></property>
   
  </class>
</hibernate-mapping>