`
shift8
  • 浏览: 149976 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

Hibernate实体映射关系

 
阅读更多

Hibernate的关联关系映射
 

一、一对一关联(有共享主键关联和惟一外键关联两种)

1、共享主键关联

比如课题是由教师去任教,没有教师就没有课题,这样课题就可以完全由教师来决定。

Java示例代码如下:

publicclass Course { private Long id; private String name; private Teacher teacher; // 省略setter和getter 方法 } publicclass Teacher { private Long id; private String name; private Course course; // 省略setter和getter 方法 }


配置文件

Teacher.hbm.xml <!-- cascade="all" 表明对Teacher对象CRUD的操作会级联到Course对象 --> <one-to-one name="course" class="powerwind.bean.Course" cascade="all" /> Course.hbm.xml <!-- id值参照 teacher属性而生成--> <id name="id" type="java.lang.Long" column="id"> <generator class="foreign"> <param name="property">teacher</param> </generator> </id> <!-- teacher属性参照 --> <one-to-one name="teacher" class="powerwind.bean.Teacher" constrained="true" />

2、惟一外键关联

外键关联需要一个定义外键字段,比如在教师表定义一个课题的外键course_id。

配置文件

Teacher.hbm.xml <many-to-one name="course" class="powerwind.bean.Course" column="course_id" cascade="save-update" unique="true"/> 如果同时在Coure.hbm.xml加上如下配置则为双向关联。 <one-to-one name="teacher" class="powerwind.bean.Teacher" property-ref="course" />

3、第三种

以上两种一对一关联在Hibernate中是比较常用的。但我用另外一种方法实现时,发现也可行。测试了一下,目前没有发现错误。

思想是和唯一外键关联相似,但两个表中都需要一个外键,在配置<one-to-one>的地方用了<many-to-one>,即两边对用了<many-to-one> 。

Course.hbm.xml <many-to-one name="teacher" class="powerwind.bean.Teacher" column="teacher_id" unique="true" /> Teacher.hbm.xml <many-to-one name="course" class="powerwind.bean.Course" column="course_id" unique="true" />


细看起来,应该是一对多关联的配置,只是两边都设置“一”,欺骗了hibernate。在hibernate文档中有这样一句:基于外键关联的单向一对一关联和单向多对一关联几乎是一样的。唯一的不同就是单向一对一关联中的外键字段具有唯一性约束。

二、一对多、多对一关联

一对多(多对一)的关联是现在中用得比较多的。现实中,一个教师是可以任教多个课程的,这就是典型的一对多关系。(由于关联是有方向的,一对多和多对一的单向关联是不同的,而双向的时候就一样)单向关联:

假设我们只需要从课题知道该课题的任教教师是谁?而不需要从教师那里知道该都任教哪些课程。只在Course.hbm.xml中这样设置就可以。

<many-to-one name="teacher" class="powerwind.bean.Teacher" column="teacher_id" />

如果只需要从教师那里得知他的所有课程,可把原本多对多的关联变成一对多(需要连接表Teacher_ Course)。

Teacher.hbm.xml <set name="courses" table="teacher_course" cascade="save-update"> <key column="teacher_id"/> <many-to-many column="course_id" unique="true" class="powerwind.bean.Course"/> </set>

unique="true"是它不同于多对多的地方。

双向关联:
双向关联就是在单向的基础上,再配置多一项(向)。

最常用最标准的配置是这种:

Course.hbm.xml <many-to-one name="teacher" class="powerwind.bean.Teacher" column="teacher_id" /> Teacher.hbm.xml <set name="courses" inverse="true"> <key column="course_id" not-null="true" /> <one-to-many class="powerwind.bean.Course" /> </set>

其中inverse="true" 的设置是比较常用的,设置后,当Teacher和Course对象状态均发生变化时,仅参照Course对象状态的变化来更新数据厍。

#p#

三、多对多关联

举个单向多对多关联的例子。比如远程教学,教师不知道他的学生有谁谁谁,只知道有很多学生在远程听课;而学生可以知道他的老师有哪些。这样,不就是单向多对多关联吗?实际上,单向的多对多关联是不完整的双向多对多关联。

如果单向,则只要在Student.hbm.xml配置。

<set name="teachers" inverse="true" table="student_teacher"> <key column="student_id" /> <many-to-many column="teacher_id" class="powerwind.bean.Teacher" /> </set>

如果双向,在上面的基础上,还要在Teacher.hbm.xml配置。

<set name="students" table="student_teacher"> <key column="teacher_id" /> <many-to-many column=" student_id" class="powerwind.bean.Student" /> </set>

有时候,连接表还会有其它信息的。比如学生与课程的关系表(stuent_course),里面可以加入学生的考试成绩。这样的话,我们可以把这个连接表定义成这样:

student_coures( id,student_id, course_id, score );

这样,双向多对多关联就变成两个一对多的关联。这种情况下,多对多的双方并没有直接拥有对方的集合引用。这里把student_coures表对应的实体叫Score(一时想不出,叫成绩单算了)。

Student.hbm.xml <set name="scores" inverse="true"> <key column="student_id" /> <one-to-many class="powerwind.bean.Score" /> </set> Teacher.hbm.xml <set name="scores" inverse="true"> <key column="teacher_id" /> <one-to-many class="powerwind.bean.Score" /> </set> Score.hbm.xml <many-to-one name="teacher" column="teacher_id" class="powerwind.bean.Teacher" /> <many-to-one name="student" column="student_id" class="powerwind.bean.Student" />


分享到:
评论

相关推荐

    Hibernate实体映射

    本资源“Hibernate实体映射”提供了一个深入理解这一关键概念的机会,通过实例代码和教程笔记,帮助学习者更好地掌握Hibernate的核心功能。 一、Hibernate实体映射基础 在Hibernate中,实体映射是将Java对象模型与...

    hibernate实体关联关系映射

    ### Hibernate实体关联关系映射详解 #### 一、引言 Hibernate作为一种强大的对象关系映射(Object Relational Mapping,简称ORM)框架,在Java开发领域扮演着极其重要的角色。它不仅简化了持久化层的开发工作,...

    hibernate实体映射文件字段设置默认值

    ### Hibernate实体映射文件字段设置默认值 在Hibernate框架中,实体映射文件(通常为`.hbm.xml`)用于定义Java对象与数据库表之间的映射关系。这其中包括了属性到数据库表列的映射、主键生成策略、以及一些高级特性...

    hibernate 映射关系学习入门 多对多实体映射

    本教程将带你入门Hibernate的多对多实体映射,帮助你理解如何通过源码来实现这种复杂的关系映射。 一、Hibernate概述 Hibernate是一个对象关系映射(ORM)框架,它允许我们将Java对象(实体)与数据库表进行映射,...

    Hibernate实体关系映射

    Hibernate实体关系映射

    Hibernate 实体映射实例

    注:为节省空间,程序中需要的jar包,均在HibernateManytoManyMapCascadingSave.zip\HibernateManytoManyMapCascadingSave\lib\ &lt;br&gt;Hibernate 多对多实体映射实例 &lt;br&gt;学习Hibernate 实体映射的映射的好帮手...

    Hibernate映射关系配置:XML方式和注解方式

    `hibernate实体映射关系.doc`可能包含了详细讲解Hibernate实体映射关系的文档,涵盖XML和注解两种方式的具体配置,包括但不限于: - 实体类的创建与映射 - 主键生成策略的配置 - 不同关联关系(一对一、一对多、多...

    自动生成hibernate映射文件和实体类

    "自动生成 Hibernate 映射文件和实体类" 自动生成 Hibernate 映射文件和实体类是使用 MyEclipse 工具来实现的,这可以大大提高开发效率,减少开发时间。下面将详细介绍如何使用 MyEclipse 自动生成 Hibernate 映射...

    hibernate的多种映射关系

    Hibernate 是一个流行的对象关系映射(ORM)框架,它允许开发者使用 Java 对象来操作数据库,消除了直接编写 SQL 的需要。在 Hibernate 中,映射关系是将数据库表与 Java 类之间的关联方式,使得对象模型可以与关系...

    Hibernate实体关系映射(new).ppt

    Hibernate实体关系映射 一对一关系 一对多关系 多对多关系Hibernate实体关系映射

    Hibernate实体层设计

    总结,Hibernate实体层设计是Java开发中非常重要的一环,理解并熟练掌握实体的定义、属性映射和关联映射,以及如何在实际项目中运用,能够极大地提升开发效率和代码质量。在设计实体层时,应充分考虑业务需求,合理...

    Hibernate_实体关联关系映射--学习总结

    ###Hibernate实体关联关系映射知识总结 #### 映射关系的类型 1. **一对一关联**: - **一对一外键关联**:一个实体的外键指向另一个实体的主键。 - **一对一主键关联**:两个实体共享同一个主键。 - **一对一...

    Hibernate实体关联关系映射--学习总结.pdf

    Hibernate实体关联关系映射--学习总结.pdf

    Hibernate集合映射与关联关系

    在IT行业中,数据库管理和对象关系映射(ORM)框架是至关重要的部分,特别是对于Java开发者而言,Hibernate是一个广泛使用的ORM工具。本主题将深入探讨Hibernate集合映射与关联关系,包括"student与Score的Map集合...

    hibernate实体生成工具

    **hibernate实体生成工具**是开发者在使用Hibernate框架时常用的一种辅助工具,它能够自动生成与数据库表对应的Java实体类,大大节省了手动编写代码的时间,提高了开发效率。Hibernate是一个强大的对象关系映射(ORM...

    生成hibernate实体类

    总之,生成Hibernate实体类是Java开发中的常见任务,它依赖于正确的JDBC配置和映射文件。了解并熟练掌握这一过程对于有效地利用Hibernate框架至关重要。同时,保持对生成代码的审查和调整也是保证代码质量的重要环节...

    Hibernate_实体类_注解_说明

    ### Hibernate实体类注解详解 Hibernate作为Java领域中流行的ORM(对象关系映射)框架,提供了丰富的注解来简化实体类与数据库表之间的映射。本文将深入解析一系列关键注解,帮助理解Hibernate如何实现这一过程。 ...

Global site tag (gtag.js) - Google Analytics