hibernate学习之路(hibernate的关联关系)

今天学习了hibernate的三种关联关系,分别是多对一,一对多,一对一关联关系

首先,是多对一的关联关系,要想实现多对一的关联关系,首先得在两个实体类中申明。比如多个员工对应一个部门,这就能构成多对一的关联关系。通过外键进行关联

1 . 在员工类中应该申明一个对象,Dep dep;然后提供get ()和set()方法。

2. 在Emp.hbm.xml中配置相应的属性

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.hgs.po">
<!--通过class 属性 和数据库映射起来 class中有一个属性table 如果不填 默认关联到数据库是用类名来命名 -->
<class name="Emp" table="Emp">
<!-- 专门用来映射主键 name代表属性名字 column 可以指定列名 不写的话默认为name的名字 -->
<!-- unsaved-value="" 这个属性用来对应对象状态,如果是空对应为瞬时状态 -->
<id name="id">
<!-- 通过内置的 生成主键 native是其中的一种 -->
<generator class="native" />
</id>
<!-- 不同性质的属性用property指定 主键和普通属性 -->
<property name="name" />
<!----------------这个属性用于申明当调用这个映射文件的时候会找到关联的dep属性,并且这里的column代表emp中的一个字段,外键关联dep中的主键--------------->
<many-to-one name="Dep" column="depart_id" not-null="true"/>
</class>
</hibernate-mapping>

3.Dep.hbm.xml中的配置

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.hgs.po">
<!--通过class 属性 和数据库映射起来 class中有一个属性table 如果不填 默认关联到数据库是用类名来命名 -->
<class name="Dep" table="Dep">
<!-- 专门用来映射主键 name代表属性名字 column 可以指定列名 不写的话默认为name的名字 -->
<!-- unsaved-value="" 这个属性用来对应对象状态,如果是空对应为瞬时状态 -->
<id name="id">
<!-- 通过内置的 生成主键 native是其中的一种 -->
<generator class="native" />
</id>
<!-- 不同性质的属性用property指定 主键和普通属性 -->
<property name="name" />
</class>
</hibernate-mapping>


然后是一对多,其实就是多对一反过来,不过配置以及申明的对象都不一样

1.还是同上的Emp(员工)和Dep(部门),一个部门能拥有多个员工

2.在部门中申明一个集合对象,存储员工

 private Set<Emp> emps;

3.Dep.hbm.xml中的配置

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.hgs.po">
<!--通过class 属性 和数据库映射起来 class中有一个属性table 如果不填 默认关联到数据库是用类名来命名 -->
<class name="Dep" table="Dep">
<!-- 专门用来映射主键 name代表属性名字 column 可以指定列名 不写的话默认为name的名字 -->
<!-- unsaved-value="" 这个属性用来对应对象状态,如果是空对应为瞬时状态 -->
<id name="id">
<!-- 通过内置的 生成主键 native是其中的一种 -->
<generator class="native" />
</id>
<!-- 不同性质的属性用property指定 主键和普通属性 -->
<property name="name" />

<!---------------------用与申明dep中set属性的------------------------------------------->
<set name="emps">
<key column="depart_id" />

<!-------------------指明一对多对的对象--------------------------------------------------->
<one-to-many class="Emp"  />
</set>
</class>
</hibernate-mapping>


一对一关联关系的实现有两种方法,一种是通过主键关联,一个主键是另外一个表中主键的数据,另外一种是通过外键关联,并且外键是唯一的。其实就是多对一中的外键设置属性为unique。例如一个人和一个人的身份证是一一对应的。

第一种实现方式:

1.  在person 和idcard 中申明各自的对象

在person中申明private IdCard idCard;

在IDcard中申明private Person person;

2.配置Idcard.hbm.xml文件

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.hgs.po">
<!--通过class 属性 和数据库映射起来 class中有一个属性table 如果不填 默认关联到数据库是用类名来命名 -->
<class name="IdCard" table="IdCard">
<id name="id">
<!-- 听过外键的方式关联person中的主键-->
<generator class="foreign">
<param name="property">person</param>
</generator>
</id>
<!-- 不同性质的属性用property指定 主键和普通属性 -->
<property name="name" />
<one-to-one name="person" constrained="true"></one-to-one>
<!-- 多对一的时候将外键限定为唯一就能实现一对一 -->
</class>
</hibernate-mapping>




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值