今天学习了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>