Hibernate(三)——框架中的关系映射

在设计数据库时我们会考虑,表与表之间的关系,例如我们前边经常提到的一对一,一对多,多对多关系,在数据库中我们通过外键,第三张表等来实现这些关系。而Hibernate时间实体类和数据库中的表进行的映射,这些关系如何映射呢?这里简单总结一下:

  一,一对多,多对一关系映射,这里拿学生和班级进行简单演示:

  1,学生的类和对应的映射文件的编写:

private int sid ;
private String sname ;  

private Classes classes ; //,引入班级对象,多对一
<class name="com.ljh.hibernate.pojo.Student" table="t_student" lazy="false">
    <id name="sid" column="sid">
        <generator class="native"/>
    </id>
    <property name="sname" column="sname" type="java.lang.String" length="20" not-null="true"/>         

    <!--
        表示对象的关系:多对一
        name 表示当前类的关系对象
        column 表示数据库中外键字段(也是描述数据关系)
        class 表示name属性值的类型
        cascade 级联
            主动方所做的操作(insert,update,delete),被动方也跟着做相同的操作。
            取值:save-update、delete 、all
            save-update : 保存或更新当前对象时,级联保存或更新关联对象
            delete : 删除当前对象时,级联删除关联对象
            all : 包含save,update,delete三种操作。
            对于多对一的场合,级联不能使用delete和all,否则会违背数据关系完整性。
        lazy : 延迟加载
            延迟初始化对象信息,等使用对象时再查询数据库。
            false : 禁用延迟加载
            proxy : 使用延迟加载(默认值),采用cglib代理完成延迟加载的扩展功能。
            no-proxy :  不使用代理,完成延迟加载 。可以使用第三方字节码增强工具。
        fetch : 数据抓取策略  :根据主动方,查询被动方时所采用的查询方式。
            fetch="select" 默认值,会采用多条语句的方式查找,往往会延迟加载数据
            fetch="join"  默认会采用左连接查询数据,不会延迟加载数据。
            not-null 如果取值为true,那么框架采用内连接查询数据。
     -->
    <many-to-one name="classes" column="cid" cascade="save-update" lazy="no-proxy" fetch="join" not-null="true" class="com.ljh.hibernate.pojo.Classes"></many-to-one>
</class>

  2,班级的实体类和对应的映射文件:

private int cid ;
private String cname ;  

private Set<Student> studentSet = new HashSet<Student>(); //引入学生类的集合,一对多
<class name="com.ljh.hibernate.pojo.Classes" table="t_classes" >
    <id name="cid" column="cid">
        <generator class="native"/>
    </id>
    <property name="cname" column="cname" type="java.lang.String" length="20" not-null="true"/>     

    <!-- 声明   一对多映射
        lazy : 延迟加载
            false : 禁用延迟加载
            true : 延迟加载(默认值)
            extra : 支持延迟加载的。(推荐)
            当获取集合自身信息时,可以发送高效的查询语句。
            例如:只希望获取集合的长度,而不需要获取集合中数据的信息,框架会通过函数执行查询进行计算集合长度。。  

        fetch : 数据抓取策略
                查询关联对象的数据时,所采用的查询方式。
            join : 通过一条连接语句进行立即查询。(延迟加载不起作用)
            select : 通过多条查询语句进行查询。
            subselect : 通过子查询语句进行立即查询。  (不推荐使用)(默认情况下和select取值结果相同)
       not-null="true" 对于一对多的查询,即使设置了not-null语句,依然采用左连接查询。
       Inverse="true",表示控制反转,由对方也就是学生方来进行管理外键。因为外键在学生
     -->
    <set name="studentSet" cascade="all" inverse="true" fetch="subselect">
        <key column="cid" not-null="true"></key>
        <one-to-many class="com.bjpowernode.hibernate.pojo.Student"/>
    </set>
</class>

  二,自关联:就是在自己的类进行关联自己,例如父菜单与子菜单的关系,对应的实体类,和映射文件

private int mid ;           

private String name ;  

private Set<Menu> menuSet = new HashSet<Menu>(); //父菜单与子菜单的关系为:一对多  

private Menu pmenu ; //子菜单和父菜单的关系为:多对一
<class name="com.ljh.hibernate.pojo.Menu" table="t_menu" >
    <id name="mid" column="mid">
        <generator class="native"/>
    </id>
    <property name="name" column="name" type="java.lang.String" length="20" not-null="true"/>   

    <many-to-one name="pmenu" column="m_id" cascade="save-update"></many-to-one>  

    <!--
        自关联表的设计:外键字段不能为非空。
     -->
    <set name="menuSet" cascade="all" inverse="true">
        <key column="m_id"></key>
        <one-to-many class="com.ljh.hibernate.pojo.Menu"/>
    </set>
</class>

  三,一对一关系映射:

  1,假如是主键一对一用来映射:也就是说被动方的主键是来自于主动方的主键,也可以将之称之为外键:

    类之间相互添加彼此的应用。

    映射文件中主动方,增加一对一标签:

<one-to-one name="userinfo" cascade="all" class="com.ljh.hibernate.pojo.UserInfo"></one-to-one>
被动方,主键又是外键,也添加一对一的映射标签:
    <id name="uid" column="uid">
        <generator class="foreign">
            <param name="property">user</param>
        </generator>
    </id>  

    <!--
        描述一对一关系关系映射
        constrained="true" : 表示强制要求一对一使用外键关联。增加外键约束。
     -->
    <one-to-one name="user" constrained="true"  class="com.ljh.hibernate.pojo.User"></one-to-one>

  2 ,使用外键约束,其实是多对一的特殊情况,例如学生对班级,

    类添加彼此的应用。

    映射文件中学生端主动端,添加外键进行约束,添加多对一标签,

<!--
    unique : 唯一约束  

        如果外键含有unique约束,那么表示主动方和被动方的关系为一对一。  

        对于一对一映射来讲,可以设置级联关系为delete 和 all  

        根据主动方查询被动方关联数据,是支持延迟加载的。
 -->
<many-to-one name="classes" column="cid" unique="true" cascade="all" class="com.ljh.hibernate.pojo.Classes"></many-to-one>
班级端的映射文件:添加一对一的标签:
<one-to-one name="student" cascade="all" property-ref="classes" class="com.ljh.hibernate.pojo.Student"></one-to-one>

   四,多对多的关系,例如学生对课程的对应,在数据库中会生成第三张表进行维护:

     在各自的类中引入对方的set集合,表示多对多。

学生端:

<set name="courseSet" table="t_student_course" cascade="save-update">
    <key column="sid"></key>
    <many-to-many class="com.ljh.hibernate.pojo.Course" column="cid"></many-to-many>  

;/set>

课程端:

<set name="courseSet" table="t_student_course" cascade="save-update">
    <key column="sid"></key>
    <many-to-many class="com.ljh.hibernate.pojo.Course" column="cid"></many-to-many>  

;/set>

   五,联合主键的映射,这种情况很少见,看一下如何吧,

    出现了这种联合键时,需要我们为其定义一个联合主键的类(实现Serializable接口),类中声明多个字段的属性,表示联合主键字段。

    在配置映射文件时,主键的配置利用联合主键的标签即可:

<composite-id name="id">
  <key-property name="title"></key-property>
  <key-property name="author"></key-property>
</composite-id>

        综上,为 Hibernate中对数据库进行关联设置映射时的几个简单例子,主要是我们根据实际情况,掌握几个对应标签的使用,还有就是里边的属性的使用。像lazy,cascade,fetch等等。注意观察其中的不同。这样进行了关联设置我们就可以很好的,根据类生成数据库,对数据库中的数据进行关联操作,更加合理化!

时间: 2025-01-05 21:04:28

Hibernate(三)——框架中的关系映射的相关文章

Hibernate框架(三)框架中的关系映射

在设计数据库时我们会考虑,表与表之间的关系,例如我们前边经常提到的一对一,一对多,多对多关系,在数据库中我们通过外键,第三张表等来实现这些关系.而Hibernate时间实体类和数据库中的表进行的映射,这些关系如何映射呢?这里简单总结一下: 一,一对多,多对一关系映射,这里拿学生和班级进行简单演示: 1,学生的类和对应的映射文件的编写: [java] view plaincopyprint? private int sid ; private String sname ; private Clas

Hibernate之配置文件以及对象关系映射文件了解

声明:CSDN不知道怎么了,有时候就是发表不了博文.本来就是一天一篇博文,最近搞的我很郁闷.有时候一天,有时候两三天都不能发.这就属于不可抗力.没办法的,啥时能发,我就发了. 一.学习案例:关于hibernate的配置文件以及对象关系映射文件的了解. 二.案例分析: a)hibernate配置文件(hibernate.cfg.xml) 1.hibernate.dialect:数据库使用的SQL方言 2.hiebrnate.connection.driver_class:数据库的驱动程序 3.hi

Hibernate One-to-Many Mappings 一对多关系映射

Hibernate One-to-Many Mappings 一对多关系映射 关键点:一对多关系使用 Set 实现, 例子:一个员工可以有多个学证书. Hibernate框架的使用步骤: 1.创建Hibernate的配置文件(hibernate.cfg.xml) 2.创建持久化类,即其实例需要保存到数据库中的类(Employee.java) 3.创建对象-关系映射文件(Employee.hbm.xml) 4.通过Hibernate API编写访问数据库的代码 创建Hibernate的配置文件(h

详解Java的MyBatis框架中SQL语句映射部分的编写

这篇文章主要介绍了Java的MyBatis框架中SQL语句映射部分的编写,文中分为resultMap和增删查改实现两个部分来讲解,需要的朋友可以参考下 1.resultMap SQL 映射XML 文件是所有sql语句放置的地方.需要定义一个workspace,一般定义为对应的接口类的路径.写好SQL语句映射文件后,需要在MyBAtis配置文件mappers标签中引用,例如: ? 1 2 3 4 5 6 <mappers>   <mapper resource="com/limi

170905-MyBatis中的关系映射

===关系映射=== 参考文档复习:1对1,1对多,多对多 1.映射(多)对一.(一)对一的关联关系 1).使用列的别名 ①.若不关联数据表,则可以得到关联对象的id属性 ②.若还希望得到关联对象的其它属性.则必须关联其它的数据表 1.创建表: 员工表: DROP TABLE IF EXISTS `tbl_employee`; CREATE TABLE `tbl_employee` ( `id` int(11) NOT NULL AUTO_INCREMENT, `user_name` varch

Hibernate基础学习(四)&mdash;对象-关系映射(上)

一.映射对象标识符      Java语言按内存地址来识别或区分同一个类的不同对象,而关系数据库按主键值来识别或区分同一个表的不同记录.Hibernate使用对象标识符(OID)来建立内存中的对象和数据库表中的记录的对应关系,对象的OID和数据库表的主键对应,为了保证OID的唯一性和不可变性,应该让Hibernate,而不是应用程序来为OID赋值.     Hibernate推荐在数据表中使用代理主键,即不具备业务含义的字段.代理主键通常为整型,因为整型比字符串要节省更多数据库空间.     在

[原创]java WEB学习笔记81:Hibernate学习之路--- 对象关系映射文件(.hbm.xml):hibernate-mapping 节点,class节点,id节点(主键生成策略),property节点

本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱好者,互联网技术发烧友 微博:伊直都在0221 QQ:951226918 -----------------------------------------------------------------------------------------------------------------

hibernate实体xml一对多关系映射

单向一对多关系映射: 一个房间对应多个使用者,也就是Room實例知道User實例的存在,而User實例則沒有意識到Room實例. 用户表: package onlyfun.caterpillar; public class User { private Long id; private String name; public User() {} public Long getId() { return id; } public void setId(Long id) { this.id = id

mybatis中一对一关系映射

一对一关系中普通的配置方式 一.多表连接查询语句: <select id="selectStudentWithAddress" parameterType="int" resultMap="StudentWithAddressResult"> select s.stud_id, s.name, s.email,s.dob,s.phone, a.addr_id, a.street, a.city, a.state, a.zip,a.co