`
gcgmh
  • 浏览: 355075 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

hibernate的关联关系

阅读更多
1、hibernate多对一关联映射
关联映射的本质:
* 将关联关系映射到数据库,所谓的关联关系是对象模型在内存中的一个或多个引用
User.java里面包含Group.java定义的group应用
User.java:
        private int id;
	private String name;
	private Group group;
-------------------------------------
Group.java:
        private int id;
	private String name;

<many-to-one>会在多的一端加入一个外键,指向一的一端,这个外键是由<many-to-one>
中的column属性定义的,如果忽略了这个属性那么默认的外键与实体的属性一致

<many-to-one>标签的定义示例:
* <many-to-one name="group" column="groupid"/>
例:User.hbm.xml配置:
<hibernate-mapping>
	<class name="com.hibernate.User" table="t_user">
		<id name="id">
			<generator class="native"/>
		</id>
		<property name="name"/>
		<!-- 理解级联的含义是对象的连锁操作
		<many-to-one name="group" column="groupid" cascade="all"/>
		 -->
		 <many-to-one name="group" column="groupid"/>
	</class>
</hibernate-mapping>

数据库里是t_user表里创建groupid 字段,并创建一个外键,groupid字段reference t_group表里的id字段。


2、hihernate一对多关联映射(单向Classes----->Student)

一对多关联映射利用了多对一关联映射原理
区别:
多对一关联映射:在多的一端加入一个外键指向一的一端,它维护的关系是多指向一
一对多关联映射:在多的一端加入一个外键指向一的一端,它维护的关系是一指向多
也就是说一对多和多对一的映射策略是一样的,只是站的角度不同
Classes.java:
       private int id;
	
	private String name;
	
	private Set students; 
-----------------------------
Student.java
        private int id;
	
	private String name;

classes.hbm.xml的配置:
<hibernate-mapping package="com.hibernate">
	<class name="Classes" table="t_classes">
		<id name="id">
			<generator class="native"/>
		</id>
		<property name="name"/>
		<set name="students">
			<key column="classesid"/>
			<one-to-many class="Student"/>
		</set>
	</class>
</hibernate-mapping>

数据库里:t_student表里创建classesid字段,并创建外键,classesid字段reference t_classes表里的id;


在一一端维护关系的缺点:
* 如果将t_student表里的classesid字段设置为非空,则无法保存
* 因为不是在student这一端维护关系,所以student不知道是哪个班的,
  所以需要发出多余的update语句来更新关系

3.hihernate一对多关联映射(双向Classes<----->Student)
一对多双向关联映射:
* 在一一端的集合上使用<key>,在对方表中加入一个外键指向一一端
* 在多一端采用<many-to-one>

注意:<key>标签指定的外键字段必须和<many-to-one>指定的外键字段一致,否则引用字段的错误

如果在”一“一端维护一对多关联关系,hibernate会发出多余的udpate语句,所以我们一般在多
的一端来维护关联关系

关于inverse属性:
inverse主要用在一对多和多对多双向关联上,inverse可以被设置到集合标签<set>上,
默认inverse为false,所以我们可以从”一“一端和”多“一端维护关联关系,
如果设置成inverse为true,则我们只能从多一端来维护关联关系

注意:inverse属性,只影响数据的存储,也就是持久化

inverse和cascade
* inverse是关联关系的控制方向
* cascade操作上的连锁反应

Classes.java
	private int id;
	private String name;
	private Set students;
------------------------------
Student.java
 	private int id;
	private String name;
	private Classes classes;
------------------------------
Classes.hbm.xml配置:
<hibernate-mapping package="com.hibernate">
	<class name="Classes" table="t_classes">
		<id name="id">
			<generator class="native"/>
		</id>
		<property name="name"/>
		<set name="students" inverse="true" cascade="all">
			<key column="classesid"/>
			<one-to-many class="Student"/>
		</set>
	</class>
</hibernate-mapping>
--------------------------------
Student.hbm.xml配置
<hibernate-mapping>
	<class name="com.hibernate.Student" table="t_student">
		<id name="id">
			<generator class="native"/>
		</id>
		<property name="name"/>
		<many-to-one name="classes" column="classesid"/>
	</class>
</hibernate-mapping>

数据库里:t_student表里创建classesid字段,并创建外键,classesid字段reference t_classes表里的id;



4、hibernate一对一主键关联映射(单向关联Person---->IdCard)
一对一主键关联映射:让两个实体对象的id保持相同,这样可以避免多余的字段被创建
Person.java
	private int id;
	private String name;
	private IdCard idCard; 
-----------------------------
Person.hbm.xml
<hibernate-mapping>
	<class name="com.hibernate.Person" table="t_person">
		<id name="id">
<!-- person的主键来源idCard,也就是共享idCard的主键 -->
			<generator class="foreign">
				<param name="property">idCard</param>
			</generator>
		</id>
		<property name="name"/>
<!-- one-to-one标签的含义,指示hibernate怎么加载它的关联对象,默认根据主键加载,
	constrained="true",	表明当前主键上存在一个约束,person的主键作为外键参照了idCard	
		<one-to-one name="idCard" constrained="true"/>
	</class>
</hibernate-mapping>
-----------------------------
IdCard.java
	private int id;
	private String cardNo;
-----------------------------
IdCard.hbm.xml
<hibernate-mapping>
	<class name="com.hibernate.IdCard" table="t_idcard">
		<id name="id">
			<generator class="native"/>
		</id>
		<property name="cardNo"/>
	</class>
</hibernate-mapping>

数据库里: t_person的主键来源t_idcard,也就是共享t_idcard的主键,数据库里不例外增加一作为外键的字段。



5、hibernate一对一主键关联映射(双向关联Person<---->IdCard)
需要在idcard映射文件中加入<one-to-one>标签指向person,指示hibernate如何加载person
默认根据主键加载
Person.java
	private int id;
	private String name;
	private IdCard idCard;
-----------------------------
Person.hbm.xml配置
<hibernate-mapping>
	<class name="com.hibernate.Person" table="t_person">
		<id name="id">
<!-- person的主键来源idCard,也就是共享idCard的主键 -->
			<generator class="foreign">
				<param name="property">idCard</param>
			</generator>
		</id>
		<property name="name"/>
<!-- one-to-one标签的含义,指示hibernate怎么加载它的关联对象,默认根据主键加载,
	constrained="true",	表明当前主键上存在一个约束,person的主键作为外键参照了idCard	
	 -->
		<one-to-one name="idCard" constrained="true"/>
	</class>
</hibernate-mapping>
-----------------------------
IdCard.java
	private int id;
	private String cardNo;
	private Person person;
-----------------------------
IdCard.hbm.xml
<hibernate-mapping>
	<class name="com.hibernate.IdCard" table="t_idcard">
		<id name="id">
			<generator class="native"/>
		</id>
		<property name="cardNo"/>
		<one-to-one name="person"/>
	</class>
</hibernate-mapping>

数据库里: t_person的主键来源t_idcard,也就是共享t_idcard的主键,数据库里不例外增加一作为外键的字段。


6.hibernate一对一唯一外键关联映射(单向关联Person---->IdCard)

一对唯一外键关联映射是多对一关联映射的特例

可以采用<many-to-one>标签,指定多的一端的unique=true,这样就限制了多的一端的多重性为一
通过这种手段映射一对一唯一外键关联
Person.xml
	private int id;
	private String name;
	private IdCard idCard;
------------------------------
Person.hbm.xml
 <hibernate-mapping>
	<class name="com.hibernate.Person" table="t_person">
		<id name="id">
			<generator class="native"/>
		</id>
		<property name="name"/>
		<[color=red]many-to-one name[/color]="idCard" [color=red]unique="true"[/color]/>
	</class>
</hibernate-mapping>
------------------------
IdCard.java
	private int id;
	private String cardNo;
------------------------
IdCard.hbm.xml
<hibernate-mapping>
	<class name="com.hibernate.IdCard" table="t_idcard">
		<id name="id">
			<generator class="native"/>
		</id>
		<property name="cardNo"/>
	</class>
</hibernate-mapping>
数据库里:t_person里产生一个idcard的外键,reference t_idcard表里的主键id。并指定这个字段为unique(核心:就是many-to-one,只不过外键被约束为唯一的。),


7、hibernate一对一唯一外键关联映射(双向关联Person<---->IdCard)

一对一唯一外键关联双向,需要在另一端(idcard),添加<one-to-one>标签,指示hibernate如何加载
其关联对象,默认根据主键加载person,外键关联映射中,因为两个实体采用的是person的外键维护的关系,
所以不能指定主键加载person,而要根据person的外键加载,所以采用如下映射方式:
<one-to-one name="person" property-ref="idCard"/>
Person.java
        private int id;
	private String name;
	private IdCard idCard;
------------------------------
 <hibernate-mapping>
	<class name="com.hibernate.Person" table="t_person">
		<id name="id">
			<generator class="native"/>
		</id>
		<property name="name"/>
		<many-to-one name="idCard" unique="true"/>
	</class>
</hibernate-mapping>
------------------------------
IdCard.java
	private int id;
	private String cardNo;
	private Person person;
------------------------------
<hibernate-mapping>
	<class name="com.hibernate.IdCard" table="t_idcard">
		<id name="id">
			<generator class="native"/>
		</id>
		<property name="cardNo"/>
		<one-to-one name="person" property-ref="idCard"/>
	</class>
</hibernate-mapping>

数据库里:


8、hibernate多对多关联映射(单向User---->Role)

具体映射方式:
<set name="roles" table="t_user_role">
<key column="userid"/>
<many-to-many class="com.hibernate.Role" column="roleid"/>
</set>
User.java
	private int id;
	private String name;
	private Set roles; 
----------------------------
User.hbm.xml
<hibernate-mapping>
	<class name="com.hibernate.User" table="t_user">
		<id name="id">
			<generator class="native"/>
		</id>
		<property name="name"/>
		<set name="roles" table="t_user_role">
			<key column="userid"/>
			<many-to-many class="com.bjsxt.hibernate.Role" column="roleid"/>
		</set>
	</class>
</hibernate-mapping>
----------------------------
Role.java
	private int id;
	private String name;
----------------------------
Role.hbm.xml
<hibernate-mapping>
	<class name="com.hibernate.Role" table="t_role">
		<id name="id">
			<generator class="native"/>
		</id>
		<property name="name"/>
	</class>
</hibernate-mapping>


数据库里:产生第三个表,t_user_role,有2个字段分别为:userid和roleid


9.hibernate多对多关联映射(双向User<---->Role)

映射方法:
<set name="roles" table="t_user_role">
<key column="userid"/>
<many-to-many class="com.hibernate.Role" column="roleid"/>
</set>
table属性值必须和单向关联中的table属性值一致
<key>中column属性值要与单向关联中的<many-to-many>标签中的column属性值一致
在<many-to-many>中的column属性值要与单向关联中<key>标签的column属性值一致
Person.java
        private int id;
	private String name;
	private Set roles; 

<hibernate-mapping>
	<class name="com.hibernate.User" table="t_user">
		<id name="id">
			<generator class="native"/>
		</id>
		<property name="name"/>
		<set name="roles" table="t_user_role">
			<key column="userid"/>
			<many-to-many class="com.bjsxt.hibernate.Role" column="roleid"/>
		</set>
	</class>
</hibernate-mapping>
---------------------------------------------
Role.java
	private int id;
	private String name;
	private Set users;

<hibernate-mapping>
	<class name="com.hibernate.Role" table="t_role">
		<id name="id">
			<generator class="native"/>
		</id>
		<property name="name"/>
		<set name="users" table="t_user_role" order-by="userid">
			<key column="roleid"/>
			<many-to-many class="com.bjsxt.hibernate.User" column="userid"/>
		</set>
	</class>
</hibernate-mapping>

数据库里:





分享到:
评论

相关推荐

    Hibernate关联关系

    ### Hibernate关联关系详解 在Java开发领域中,Hibernate作为一个强大的对象关系映射(ORM)框架,为开发者提供了方便地操作数据库的方式。通过将Java对象与数据库表进行映射,Hibernate大大简化了数据持久化层的...

    hibernate关联关系总结

    Hibernate关联关系是Java持久化框架Hibernate中的核心概念,它允许我们在数据库中建立对象之间的关系映射,以便在程序中操作对象时,可以自动处理与数据库的交互。本篇将深入探讨Hibernate的四种主要关联关系:一对...

    Hibernate 关联关系解除

    一、Hibernate关联关系介绍 在Hibernate中,关联关系主要包括以下几种: 1. 一对一(OneToOne):一个实体对应另一个实体的唯一实例。 2. 一对多(OneToMany):一个实体可以与多个其他实体相关联。 3. 多对一...

    Hibernate 关联关系映射分类

    在深入探讨Hibernate关联关系映射分类之前,我们首先简要回顾一下Hibernate框架的基本概念。Hibernate是一种持久层框架,主要用于Java应用程序中的对象关系映射(ORM),它能够将面向对象的数据模型转换为数据库中的...

    Hibernate关联关系练习【全】

    总之,Hibernate关联关系是理解其工作原理的关键,它使得Java对象和数据库记录之间的映射变得简单。通过练习,你可以掌握如何配置和使用这些关系,以及如何进行相关的查询操作,从而提升你的开发效率和代码质量。...

    hibernate关联关系实例

    在这个“hibernate关联关系实例”中,我们将深入探讨四种基本的关联关系:一对一(One-to-One)、一对多(One-to-Many)、多对一(Many-to-One)以及多对多(Many-to-Many),同时也会涉及Hibernate查询语言(HQL)...

    hibernate关联关系2

    在本项目中,"hibernate关联关系2"是一个关于使用Hibernate框架处理数据库关联关系的实战案例。Hibernate是一个流行的开源对象关系映射(ORM)工具,它允许开发人员使用Java对象来操作数据库,极大地简化了数据库...

    Hibernate关联关系映射目录

    ### Hibernate关联关系映射 #### 一、单向关联 单向关联指的是对象之间的关联关系只在一个方向上存在,也就是说这种关联关系仅在一个类中表示出来,在另一个类中不体现这种关联。 ##### 1. 一对一外键单向关联 ...

    hibernate关联关系映射

    "hibernate关联关系映射"是Hibernate的核心概念之一,它定义了如何在Java对象和数据库表之间建立关系。以下是对这个主题的详细讲解: 一、一对一关系映射(One-to-One) 一对一关系是指一个实体对应另一个实体的...

    Hibernate关联关系配置

    ### Hibernate关联关系配置详解 #### 一、一对多与多对一关系配置 在软件开发过程中,实体之间的关联关系是常见的需求之一。其中,“一对多”与“多对一”的关系尤为常见,这类关系通常用来表示实体之间的层级或...

    Hibernate关联关系疑问

    这篇博客"Hibernate关联关系疑问"可能探讨了在使用Hibernate处理对象关系映射(ORM)时遇到的一些关联问题。在ORM中,关联关系是数据库表之间的连接,如一对一、一对多、多对一和多对多关系。 1. **一对一关联...

    Hibernate关联关系映射.CHM

    Hibernate关联关系映射.CHM Hibernate文档相关

    hibernate关联关系之一对一双向关联

    这种关联关系可以是单向的,也可以是双向的,而这里的"hibernate关联关系之一对一双向关联"着重讨论的是后者。双向关联意味着两个实体类都可以直接访问对方,提供了更方便的数据操作。 在Hibernate中,一对一双向...

    Hibernate关联关系映射实例速查

    Hibernate关联关系映射实例速查,帮助初学者学习。

    hibernate关联关系

    综上所述,本教程涵盖了Hibernate关联关系的基础知识,包括1对1、一对多和多对多的实现,以及如何在关联关系中进行增删改查操作。结合MySQL数据表文件,初学者可以更好地理解这些概念并应用于实际项目中。在实践中...

    Hibernate关联关系的CRUD和集合映射(annotation)

    ### Hibernate关联关系 关联关系是指在Java对象与数据库表之间建立的连接。主要有以下几种类型: 1. **一对一(OneToOne)**:一个实体对应表中的唯一一行数据。可以通过`@OneToOne`注解来定义,可以设置`fetch`...

    HIbernate关联关系总结

    在Java的ORM(对象关系映射)框架Hibernate中,关联关系是将数据库中的表与Java对象之间建立联系的重要机制。本篇文章将详细讲解Hibernate的两种单向关联关系:单向1-N关联和单向N-1关联。 1. **单向1-N关联** 在...

    Hibernate关联关系总结

    本篇文章将深入探讨Hibernate中的三种主要关联关系:一对一、一对多和多对多。 **一对一关联(One-to-One)** 一对一关联在现实生活中很常见,例如一个人只有一个身份证。在Hibernate中,这种关联可以通过`@...

    Hibernate关联关系.doc

    在Java持久化框架Hibernate中,关联关系映射是核心特性之一,它允许对象模型与数据库中的关系模型对应。本文将详细解析三种基本的关联关系:多对一、一对多以及一对一,以及它们在Hibernate中的配置。 1. **多对一...

Global site tag (gtag.js) - Google Analytics