ssh进阶之路hibernate映射——一对一单向关联映射

lxjshuju      2022-02-11     444

关键词:

【SSH进阶之路】Hibernate基本原理(一) ,小编介绍了Hibernate的基本原理以及它的核心,採用对象化的思维操作关系型数据库。

【SSH进阶之路】Hibernate搭建开发环境+简单实例(二),小编搭建了基本Hibernate的开发环境。并做了一个简单实例,对它的基本原理有了一个理性的认识。

【SSH进阶之路】Hibernate基本映射(三),我们介绍了Hibernate的基本映射(即对一个实体进行映射)的相关概念。并给大家实现相关实例。比較简单。

【SSH进阶之路】Hibernate映射——多对一单向关联映射(四)。我们介绍了多对一的关联映射,并具体了讲解了,映射技巧。这篇我们依然使用此映射技巧,帮助大家更好的理解。

 

      以下開始今天的愉快之旅。

 

映射原理

 

      两个实体对象之间是一对一的关联映射,即一个对象仅仅能与另外唯一的一个对象相相应

比如:一个人(Person)仅仅有一张身份证(IdCard)。我们看一下这个样例的对象模型,例如以下图所看到的:

 

对象模型

 

       技术分享

        从上图中能够看出:

        1、一个人仅仅有一张身份证,唯一的一个身份证号。对象之间是一对一的关系。

        2、人(Person)持有身份证(IdCard)的引用,所以,两个对象关系维护由person端决定。

        从对象模型映射成关系模型,有两种方式:主键关联和唯一外键关联,我们继续看以下的内容。

 

分类: 

 

 主键关联:

 

        1、两个实体对象的主键一样,以表明它们之间的一一相应关系。

        2、不须要多余的外键字段来维护关系,仅通过主键来关联,即Person的主键要依赖IdCard的主键,他们共用一个主键值。

        以上两点恰与唯一外键关联相反。

 

 主键关联的关系模型

技术分享

 Person.hbm.xml

<?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.liang.hibernate">
	<class name="Person" table="t_person">
		<id name="id">
		<!-- 採用foreign生成策略。forgeign会取得另外一个关联对象的标识 -->
			<generator class="foreign" >
				<param name="property">idCard</param>
			</generator>
		</id>
		<property name="name"></property>
		<!-- 
			one-to-one指示hibernate怎样载入其关联对象,默认依据主键载入
			也就是拿到关系字段值,依据对端的主键来载入关联对象
			
			constrained="true"表示约束,当前主键(person的主键)还是一个外键
			參照了对端的主键(IdCard的主键),也就是会生成外键约束语句
		 -->
		 <!-- idCard属性。表达的是本对象与IdCard的一对一关系。 -->
		<one-to-one name="idCard" class="IdCard"  constrained="true"></one-to-one>
	</class>
</hibernate-mapping>

生成的表结构以及測试数据:

技术分享技术分享

 

唯一外键关联:

 

       1、两个实体对象用一个外键来关联。以表表明对象之间的关系。

       2、事实上它是多对一关联映射的特例,多的一端加上唯一的限制之后,用来表示一对一的关联关系

       所以它採用多对一的标签来映射。例如以下所看到的:

<!-- 採用<mang-to-one>标签来映射,指定多的一端unique为true,
	这样就限制了多的一端的多重性为一,就是这样来映射的。

--> <many-to-one name="" unique="true"></many-to-one>

唯一外键的关系模型

技术分享

Person.hbm.xml

<?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.liang.hibernate">
	<class name="Person" table="t_person">
		<id name="id">
			<generator class="native" ></generator>
		</id>
		<property name="name"></property>
		<!-- 因为它是一对一的唯一外键关联,它是多对一关联的特例,凝视能够直接写成多对一关联-->
		<!-- idCard属性,表达的是本对象与IdCard的多对一关系。 -->
		<many-to-one name="idCard" class="IdCard" column="idCardId" unique="true"></many-to-one>	
	</class>
</hibernate-mapping>

生成的表结构以及測试数据:

 技术分享技术分享

 

其它同样代码例如以下:

Person

public class Person {
	private int id;
	private String name;
	private IdCard idCard;
	
	public IdCard getIdCard() {
		return idCard;
	}
	public void setIdCard(IdCard idCard) {
		this.idCard = idCard;
	}
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
}

IdCard

public class IdCard {
	private int id;
	private String cardNo;
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getCardNo() {
		return cardNo;
	}
	public void setCardNo(String cardNo) {
		this.cardNo = cardNo;
	}
}

IdCard.hbm.xml

<?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.liang.hibernate"> <class name="IdCard" table="t_idCard"> <id name="id"> <generator class="native"></generator> </id> <property name="cardNo"></property> </class> </hibernate-mapping>

建议

 

因为一对一主键关联映射具有下面两个缺点:

      1、灵活性差。没有办法改成多对一关联映射,不能应变多变的需求;

      2、必须先保存关联对象IdCard,之后才干保持Person。

所以,在映射一对一单向关联映射时,我们採用唯一外键关联映射。


     下篇博文。我们介绍一对一双向关联映射,谢谢关注。


ssh进阶之路hibernate基本映射

【SSH进阶之路】Hibernate基本原理(一),小编介绍了Hibernate的基本原理以及它的核心。採用对象化的思维操作关系型数据库。【SSH进阶之路】Hibernate搭建开发环境+简单实例(二),小编搭建了基本Hibernate的开发环境。并做了一... 查看详情

hibernate学习之路

简诉 单向多对一、单向一对多、双向一对多关系映射一:单向多对一  1、学生表student和年级表Grade                2、类Student和类GradepublicclassStudent{privateintid;privat 查看详情

hibernate一对多单向(双向)关联映射

(1)、编写配置文件  Hibernate通过读写默认的XML配置文件hibernate.cfg.xml加载数据库配置信息、代码如下: <hibernate-configuration> <session-factory> <!--数据库驱动--> <propertyname="connection.driver_class">com.mysql 查看详情

hibernate关联映射

...马士兵hibernate课程的学习笔记。hibernate的映射,主要分为一对一,一对多,多对一,多对多,同一时候还要单向与双向的差别。OK,不要纠结于名字,我们開始看样例。一对一单向老公是一个实体,老婆也是一个实体。一个老公仅仅有一个... 查看详情

Hibernate 一对多单向映射列表

】Hibernate一对多单向映射列表【英文标题】:HibernateOneToManyUnidirectionalMappingList【发布时间】:2011-04-2420:57:09【问题描述】:我在父子Java对象之间有one-to-many关系。父对象使用存储多个子对象的java.util.List。我遇到的问题是在将一... 查看详情

hibernate单向多对一映射关系

单向n-1单向n-1关联只需从n的一端可以访问1的一端域模型:从Order到Customer的多对一单向关联需要在Order类中定义一个Customer属性,而在Customer类中无需定义存放Order对象的集合属性关系数据模型:ORDERS表中的CUSTOMER_ID参照CUSTOMER表的主键... 查看详情

hibernate学习之单向多对一映射

?版权声明:本文为博主原创文章,转载请注明出处说明:该实例是通过映射文件和注解两种方式实现的。可根据自己的需要选择合适的方式实例:1.项目结构2.pom.xml<projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/200... 查看详情

hibernate5(10)注解映射[2]一对多单向关联

在上一篇文章里。我们从端方向一端建立关联关系,完毕了从文章到作者的关联关系建立。但在实际的博客站点中,用户肯定还须要获取自己所写的文章,这时能够建立用户(一)对文章(多)的单向关联映射。先来看我们的一... 查看详情

ssh进阶之路

 【SSH进阶之路】Hibernate基本原理(一)      在开始学Hibernate之前,一直就有人说:Hibernate并不难,无非是对JDBC进一步封装。一句不难,难道是真的不难还是眼高手低?   如果只是停留在使... 查看详情

hibernate关联映射

https://www.cnblogs.com/whgk/p/6128395.html一、一对一关系的概述      一对一关系看起来简单,其实也挺复杂的。其中关系就包含了四种,单向双向和主键关联外键关联。什么意思呢,也就是包含了单向一对一主键关联、双向一... 查看详情

1-7hibernate关联关系映射

1.关联关系分为单向关联(一对一,一对多,多对一,多对多),多向关联(一对一,一对多,多对多)。2.单向一对一主键关联实例需要为one-to-one元素指定constrained属性值为true.3.单向一对一外键关联4.一对多关联建立一对多关联时,... 查看详情

hibernate课程初探一对多映射3-3单向多对一的测试

publicstaticvoidtestManyToOne(){Studentstu1=newStudent("小明","男");Studentstu2=newStudent("小红","女");Gradegrad1=newGrade("java三班","java三班");stu1.setGrade(grad1);stu2.setGrade(grad1);Sessionses1=Hibernate 查看详情

ssh进阶之路hibernate基本原理

在开始学Hibernate之前,一直就有人说:Hibernate并不难,无非是对JDBC进一步封装。一句不难,难道是真的不难还是眼高手低?   如果只是停留在使用的层面上,我相信什么技术都不难,看看别人怎么做的,你也可以很... 查看详情

ssh进阶之路hibernate基本原理

   在开始学Hibernate之前,一直就有人说:Hibernate并不难,无非是对JDBC进一步封装。一句不难,难道是真的不难还是眼高手低?   如果只是停留在使用的层面上,我相信什么技术都不难,看看别人怎么做的... 查看详情

Hibernate 更新一对一的单向

】Hibernate更新一对一的单向【英文标题】:HibernateUpdatingaone-oneunidirectional【发布时间】:2017-03-0413:36:56【问题描述】:您好,我目前正在花费大量时间来弄清楚为什么我的一对一休眠映射没有更新,你们能帮帮我吗?顺便说一下... 查看详情

hibernate学习四(关系映射一对一)

...ate后,为面向对象的编程,对象与对象的关系多样化;如一对一,一对多,多对多,并具有单向和双向之分。  开始练习前,复制上一次项目,并更名为二、一对一单向外键关联  例如:一个老师只教一个学生,一个学生只... 查看详情

hibernate,关系映射的多对一单向关联多对一双向关联一对一主键关联一对一外键关联多对多关系关联

2018-11-10  22:27:02开始写 下图内容ORM、Hibernate介绍、hibername.cfg.xml结构:  下图内容hibernate映射文件结构介绍 下图内容hibernate映射文件中主键自增规则、Hibernate实例状态(瞬时状态、持久化状态、托管状态)... 查看详情

hibernate——一对多和多对多关联关系映射(xml和注解)总结(转载)

OnetoMany映射关系多对一单向外键关联(XML/Annotation)一对多单向外键关联(XML/Annotation)懒加载和积极加载一对多双向外键关联(XML/Annotation)ManytoMany映射关系多对多单向外键关联(XML/Annotation)多对多双向外键关联(XML/Annotation)set的inverse元... 查看详情