您的位置:首页 > 其它

Hibernate关联关系映射

2016-12-29 20:57 555 查看
一、多对一

1.多对一单向关联映射:对于多对一单向关联,Hibernate会在多的一端加入外键与一的一端建立关联关系


 


    多对一单项关联的实体                                                   
   对象映射后的数据表
关键代码:

<?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.lyq.model">
<class name="Book" table="tb_book_manytoone1">
<!-- 主键 -->
<id name="id">
<generator class="native"/>
</id>
<!-- 图书名称 -->
<property name="name" not-null="true" length="200" />
<!-- 作者 -->
<property name="author" not-null="true" length="50"/>
<!-- 多对一关联映射 -->
<many-to-one name="category" class="Category">
<!-- 映射的字段 -->
<column name="categoryId"/>
</many-to-one>
</class>
</hibernate-mapping>
<?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.lyq.model">
<class name="Category" table="tb_Category_manytoone1">
<id name="id">
<generator class="native"/>
</id>
<property name="name" not-null="true" length="200" />
</class>
</hibernate-mapping>

2.多对一双向关联



多对一双向关联的实体对象
Book的xml文件不变,为Category添加<set>

<?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.lyq.model">
<class name="Category" table="tb_Category_manytoone2">
<!-- 主键 -->
<id name="id">
<generator class="native"/>
</id>
<!-- 类别名称 -->
<property name="name" not-null="true" length="200" />
<!-- 一对多映射 -->
<set name="books">
<key column="categoryId"/>
<one-to-many class="Book"/>
</set>
</class>
</hibernate-mapping>
二、一对一

1.一对一主键关联映射:同样分为单向与双向映射,以双向为例



表关系

可以看出IdCard主键参照了User的外键,与User主键是一对一的关系。



实体关系
<?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>
<class name="com.lyq.model.User" table="tb_user_onetoone_p">
<!-- 主键id -->
<id name="id">
<generator class="native"/>
</id>
<!-- 姓名 -->
<property name="username" not-null="true" />
<!-- 年龄 -->
<property name="age"/>
<!-- 一对一映射 -->
<one-to-one name="idCard"/>
</class>
</hibernate-mapping>
<?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>
<class name="com.lyq.model.IdCard" table="tb_idCard_onetoone_p">
<!-- 主键id -->
<id name="id">
<!-- 参考User的外键 -->
<generator class="foreign">
<param name="property">user</param>
</generator>
</id>
<!-- 证件号 -->
<property name="num" not-null="true"/>
<!-- 一对一映射 -->
<one-to-one name="user" constrained="true"/>
</class>
</hibernate-mapping>

2.一对一外键关联映射:在其中一端加入一个外键指向另一端



表关系

<?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>
<class name="com.lyq.model.IdCard" table="tb_idCard_onetoone_f">
<!-- 主键id -->
<id name="id">
<generator class="native"/>
</id>
<!-- 证件号 -->
<property name="num" not-null="true"/>
</class>
</hibernate-mapping>
<?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>
<class name="com.lyq.model.User" table="tb_user_onetoone_f">
<!-- 主键id -->
<id name="id">
<generator class="native"/>
</id>
<!-- 姓名 -->
<property name="username" not-null="true" />
<!-- 年龄 -->
<property name="age"/>
<!-- 一对一映射 -->
<many-to-one name="idCard" unique="true"/>
</class>
</hibernate-mapping>
使用<many-to-one>标签进行映射,此标签用于多对一映射,但其unique属性可以限制其关联的唯一性,从而构成了一对一唯一外键映射。

三、多对多关联映射
需要借助第三张表进行实现



表关系
<?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>
<class name="com.lyq.model.Course" table="tb_course_manytomany">
<!-- 主键id -->
<id name="id">
<generator class="native"/>
</id>
<!-- 姓名 -->
<property name="name" not-null="true" />
<!-- 多对多映射 -->
<set name="students" table="tb_student_course">
<key column="courseId"/>
<many-to-many class="com.lyq.model.Student" column="studentId"/>
</set>
</class>
</hibernate-mapping>
<?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.lyq.model">
<class name="Student" table="tb_student_manytomany">
<!-- 主键id -->
<id name="id">
<generator class="native"/>
</id>
<!-- 姓名 -->
<property name="name" not-null="true" />
<!-- 年龄 -->
<property name="age"/>
<set name="course" table="tb_student_course">
<key column="studentId"/>
<many-to-many class="Course" column="courseId"/>
</set>
</class>
</hibernate-mapping>
注:Student_Course表会自动生成。

附:建立数据库表的Java语句,运行后生成数据表,如果已存在,会删除重新建表

import org.hibernate.cfg.Configuration;
import org.hibernate.tool.hbm2ddl.SchemaExport;

/**
* 导出数据表
* @author Li Yong Qiang
*/
public class ExportTables {
public static void main(String[] args) {
//加载配置信息
Configuration cfg = new Configuration().configure();
//实例化SchemaExport对象
SchemaExport export = new SchemaExport(cfg);
//导出数据表
export.create(true, true);
}
}


声明:本文整理自《学通Java Web的24堂课》陈丹丹、卢瀚等著一书中的章节
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: