Hibernate:表关系
来源:互联网 发布:江西广电网络好用吗 编辑:程序博客网 时间:2024/06/11 13:23
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>
- Hibernate:表关系
- Hibernate表映射关系
- Hibernate表关系
- Hibernate多表映射关系
- Hibernate表关联关系小结
- hibernate表关系注解方式
- Hibernate 关系
- hibernate关系
- hibernate 表与表之间的关系
- hibernate 根据对象关系表生成 数据库
- Hibernate 表关系描述之OneToMany
- Hibernate 表关系描述之ManyToMany
- hibernate 注释关联表关系VO demo
- hibernate中方建立表之间的关系
- Hibernate 实体类 表关系 注解 大全
- Hibernate 表关系 实体类 注解 大全
- hibernate中的多表对应关系
- Hibernate表关系映射之一对一映射
- DataDroid 刚开始接触和学习 二
- 电影《可可西里》散记
- 从VC6.0平台级到VS2008平台(之一)
- C++继承:公有,私有,保护
- Hibernate:核心API
- Hibernate:表关系
- 从VC6.0平台级到VS2008平台(之二)
- 从头开始学Java--第二课
- 从VC6.0平台级到VS2008平台(之三)
- 从VC6.0平台级到VS2008平台(之四)
- 设计&&美工
- 坎坷IT路
- Retain Cycles and Weak References
- 关于VS2008中的targetver.h文件