Hibernate:表关系

来源:互联网 发布:江西广电网络好用吗 编辑:程序博客网 时间:2024/06/11 20:46

1,1对多:1表中的每一条记录都可以对应多个多表中的记录,多表中的每一条记录对应唯一一条1表中的记录,在多表中,通过建立外键来标识与1表中一条记录的唯一对应关系,通常这个外键指向1表的主键,1表称为主表,多表称为从表。

在hibernate程序中的表现:

(1),首先创建两个PO,分别为1方和多方对应的对象,比如1方为Teacher,多方位Student。那么,在1方可以对应很多多方的对象,所以可以在1方的PO类中建立一个Set集合,泛型为多方类型,用户存储多个多方的对象,并实例化这个集合。在多方建立1方的引导字段,类型为1方PO类型。

1方:

public class Teacher(){private Integer id;//主键标识private String name;private Set<Student> studentSet = new HashSet<Student>();…Getter and setter……}

多方:

public class Student{private Integer id;//主键唯一标识private String name;private Teacher teacher;…Getter and setter……}

最主要的是编写配置文件:

1方的配置文件:Teacher.hbm.xml

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE hibernate-mapping PUBLIC //约束文档    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">    <hibernate-mapping package="cn.itcast.one2many"><class name="Teacher" table="t_teacher"><id name="id" type="integer" column="id"><generator class="native"></generator></id><property name="name" type="string" column="name"></property><set name="studentSet" cascade="delete">//配置集合,靛蓝色字为级联删除操作<key column="teacher_id"></key>//配置外键,多方通过该键与1方建立唯一联系<one-to-many class="cn.itcast.one2many.Student"/>//1对多配置,通过class配置多方的全限定类名</set></class></hibernate-mapping>

多方配置文件:Student.hbm.xml

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE hibernate-mapping PUBLIC     "-//Hibernate/Hibernate Mapping DTD 3.0//EN"    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">    <hibernate-mapping package="cn.itcast.one2many"><class name="Student" table="t_student"><id name="id" type="integer" column="id"><generator class="native"></generator></id><property name="name" type="string" column="name"></property>//配置多对一映射,name指定Student类中的1方索引字段名,column指定外键列名<many-to-one name="teacher" class="cn.itcast.one2many.Teacher" column="teacher_id"/></class></hibernate-mapping>

2, 多对多:

A表中的每一条记录可以对应多条B表中的记录,B表中的每一条记录也可以对应多条A表中的记录。多对多的关系在数据库中不能直接进行描述,需要借助中间表,在中间表中,存在两列数据,一列是A表的主键索引,一列是B表的主键索引。这样,A表通过中间表可以找到对应的记录,再通过对应的B的主键就可以找到B表中对应主键的记录。

通过上图描述,A表与B表就间接建立了多对多的关系。

在hibernate程序中的描述:

A方:

Public class Student{Private Integer id;Private String name;Private Set<Course> courseSet = new HashSet<Course>();//存储很多B方对象…Getter and setter……}

B方:

Public class Course{Private Integer id;Private String content;Private Set<Student> studentSet = new HashSet<Student>();//存储很多A方对象…Getter and setter……}

A方配置文件:Student.hbm.xml

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE hibernate-mapping PUBLIC     "-//Hibernate/Hibernate Mapping DTD 3.0//EN"    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">    <hibernate-mapping package="cn.itcast.many2many"><class name="Student" table="t_student"><id name="id" type="integer" column="id"><generator class="native"></generator></id><property name="name" type="string" column="name"></property><set name="courseSet" table="t_student_course" cascade="save-update,delete">//自己在中间表中映射的列名<key column="student_id"></key>//配置对方类的全限定名称,以及对方在中间表映射的列名<many-to-many class="cn.itcast.many2many.Course" column="course_id"></many-to-many></set></class></hibernate-mapping>

B方配置文件:Course.hbm.xml

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE hibernate-mapping PUBLIC     "-//Hibernate/Hibernate Mapping DTD 3.0//EN"    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">    <hibernate-mapping package="cn.itcast.many2many"><class name="Course" table="t_course"><id name="id" type="integer" column="id"><generator class="native"></generator></id><property name="content" type="string" column="content"></property><set name="studentSet" table="t_student_course" cascade="save-update" inverse="true">//自己在中间表中映射的列名<key column="course_id"></key>//配置对方类的全限定名称,以及对方在中间表映射的列名<many-to-many class="cn.itcast.many2many.Student" column="student_id"></many-to-many></set></class></hibernate-mapping>

3,1对1

分两种情况:

(1),主表主键与从表主键

这种方式就是将从表的主键作为外键,而从表的这个外键又指向主表的主键。图示如下:

作为从表的主键的id,首先他是主键,所以他不可重复,且必须不为空,所以如果第一个值为1,则后面不可以在有id为1 的值,且这个外键指向了主表主键,而主表主键也必须是唯一且非空的,所以就达到了主表的一个记录对应从表的唯一一条记录的目的。

程序:

主表PO:

Public class Company{Private Integer id;Private String name;Private Address address;…Getter and setter..…}

从表PO:

Public class Address{Private Integer id;Private String addr;Private Company company;…Getter and setter……}

主表配置文件:Company.hbm.xml

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE hibernate-mapping PUBLIC     "-//Hibernate/Hibernate Mapping DTD 3.0//EN"    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">    <hibernate-mapping package="cn.itcast.one2one"><class name="Company" table="t_company"><id name="id" type="integer" column="id"><generator class="native"></generator></id><property name="name" type="string" column="name"></property><one-to-one class=”Address” name=”address” /></class></hibernate-mapping>

从表配置文件:Address.hbm.xml

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE hibernate-mapping PUBLIC     "-//Hibernate/Hibernate Mapping DTD 3.0//EN"    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">    <hibernate-mapping package="cn.itcast.one2one"><class name="Address" table="t_address"><id name="id" type="integer" column="id"><generator class="foreign"><param name=”property”>company</param></generator></id><property name="addr" type="string" column="addr"></property><one-to-one name=”company” class=”Company” constrained="true"/></class></hibernate-mapping>

(2),主表主键与从表外键

其实是一对多关系的一种特例,只是在从表的外键列中,多了一个必须唯一的限制,也就是说外键列中的值不可以重复。设置unique=”true”。

图示:

主表PO:

Public class Company{Private Integer id;Private String name;Private Address address;…Getter and setter..…}

从表PO:

Public class Address{Private Integer id;Private String addr;Private Company company;…Getter and setter……}

主表配置文件:Company.hbm.xml

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE hibernate-mapping PUBLIC     "-//Hibernate/Hibernate Mapping DTD 3.0//EN"    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">    <hibernate-mapping package="cn.itcast.one2one"><class name="Company" table="t_company"><id name="id" type="integer" column="id"><generator class="native"></generator></id><property name="name" type="string" column="name"></property><one-to-one class=”Address” name=”address” foreign-key="company_id"/></class></hibernate-mapping>

从表配置文件:Address.hbm.xml

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE hibernate-mapping PUBLIC     "-//Hibernate/Hibernate Mapping DTD 3.0//EN"    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">    <hibernate-mapping package="cn.itcast.one2one"><class name="Address" table="t_address"><id name="id" type="integer" column="id"><generator class="foreign"><param name=”” /></generator></id><property name="addr" type="string" column="addr"></property><one-to-one class=”Company” name=”company” column="company_id" unique="true"/></class></hibernate-mapping>

原创粉丝点击