hibernate进阶之路之一对一映射(二)

原创 2016年05月31日 14:55:20

        上篇博客简单介绍了hibernate,并实现了一个基本映射,本篇博客将更加详细介绍映射相关内容。本文介绍一对一映射。一对一关联有两种策略:1、主键和主键关联;2、唯一外键关联,其实是多对一关联,但是把多的一端的外键设置成唯一;

        1、主键主键关联:明确需求,创建实体:

        一个用户只能有一个身份证号,那么user和idCard就是一对一关联,

        首先看主键和主键关联,在user端维护关系,创建两个实体:

        user:

public class User{

	private int id;
	
	private String name;
	
	private IdCard idCard;//idCard的引用
       
         //省略getter、setter

}
       idCard:

public class IdCard {
	
	private int id;
	
	private String cardNo;

        //省略getter、setter
}

        2、创建实体映射文件(全局配置文件在上篇博客已经介绍到,实体映射文件写好之后,加到全局配置文件的mapping标签中):

         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>
	<class name="com.tgb.hibernate.IdCard" table="t_idCard">
		<id name="id">
			<generator class="native"/>
		</id>
		<property name="cardNo"/>
	</class>
</hibernate-mapping>
        User.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>
	<class name="com.tgb.hibernate.User" table="t_user">
		<id name="id">
			<!-- foreign表示一对一共享主键,两个id值一样, -->
			<generator class="foreign">
				<param name="property">idCard</param>
			</generator>
		</id>
		<property name="name"/>
		<!-- 
			constrained=true,则表明存在外键与关联表对应,并且关联表中肯定存在对应的键与其对应
		 -->
		<one-to-one name="idCard" constrained="true"/>
	</class>
</hibernate-mapping>

constrained="true",表示User的主键同时是个外键,会生成外键约束语句,这样的单项关联时,如果是false不会使用lazy,会采用left join的方式查出来,true则是延迟加载。而且true的时候save和delete的顺序也是固定的了。save时先增加关联表,delete相反。

        如果是双向关联,则需要在idCard的映射文件中,添加<one-to-one/>标签,关联User。

3、生成数据库表:

         t_idcard:

               

        t_user:

        

t_user表中没有外键约束。

4、测试类:

(简写,只写了逻辑代码):

</pre><p><pre name="code" class="java">	session.beginTransaction();
			
	IdCard idCard = new IdCard();
	idCard.setCardNo("1304545453453");
			
	User user = new Person();
        
        user.setName("张三");
	
 	//建立关联user.setIdCard(idCard);
	session.save(user);
	session.getTransaction().commit();


这样就在t_user和t_idCard表分别保存了一条记录,而且两个id是一样的。

        二、唯一外键关联方法:

        单向关联:

User.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>
	<class name="com.tgb.hibernate.User" table="t_user">
		<id name="id">
			<generator class="native"/>
		</id>
		<property name="name"/>
		<many-to-one name="idCard" unique="true"/>
	</class>
</hibernate-mapping>
注意使用的是many-to-one标签,而且必须使用unique="true"来限制,表示唯一性。

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>
	<class name="com.tgb.hibernate.IdCard" table="t_idCard">
		<id name="id">
			<generator class="native"/>
		</id>
		<property name="cardNo"/>
	</class>
</hibernate-mapping>
生成的数据库表(有了外键约束):

t_user:


测试就不再写了,要注意的是重点关注映射文件。

       

        双向关联:

        必须在上面的idCard.hbm.xml中添加:<one-to-one name="person" property-ref="idCard"/>

property-ref="idCard"指定了关系字段的名称。

  

版权声明:本文为博主原创文章,未经博主允许不得转载。

【SSH进阶之路】【十二】hibernate5 注解映射【4】一对一外键关联

在实际博客网站中,文章内容的数据量非常多,它会影响我们检索文章其它数据的时间,如查询发布时间、标题、类别的等。这个时候,我们可以尝试将文章内容存在另一张表中,然后建立起文章——文章内容的一对一映射一对...

【SSH进阶之路】【十二】hibernate5 注解映射【5】一对一共享主键关联

一对一共享主键下面我们直接通过实例来讲解共享主键配置: 主键主控方:Articlepackage com.chenhao.model;@Table(name = "t_article2") @En...

【SSH进阶之路】Hibernate映射——一对一单向关联映射(五)

两个实体对象之间是一对一的关联映射,即一个对象只能与另外唯一的一个对象相对应。例如:一个人(Person)只有一张身份证(IdCard)。...

【SSH进阶之路】Hibernate映射——一对一双向关联映射(六)

上篇博文【SSH进阶之路】Hibernate映射——一对一单向关联映射(五),我们介绍了一对一的单向关联映射,单向是指只能从人(Person)这端加载身份证端(IdCard),但是反过来,不能从身份证...
  • gpfwcx
  • gpfwcx
  • 2015年11月17日 20:51
  • 172

【SSH进阶之路】Hibernate映射——一对一双向关联映射(六)

上篇博文【SSH进阶之路】Hibernate映射——一对一单向关联映射(五),我们介绍了一对一的单向关联映射,单向是指只能从人(Person)这端加载身份证端(IdCard),但是反过来,不能从身份证...

【SSH进阶之路】Hibernate映射——一对一单向关联映射(五)

映射原理         两个实体对象之间是一对一的关联映射,即一个对象只能与另外唯一的一个对象相对应。例如:一个人(Person)只有一张身份证(IdCard)。我们看一下这个例子的对象...
  • gpfwcx
  • gpfwcx
  • 2015年11月17日 20:50
  • 279

【SSH进阶之路】Hibernate映射——一对一单向关联映射(五)

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

【SSH进阶之路】Hibernate基本映射(三)

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

【SSH进阶之路】【十】hibernate5 注解映射【2】 一对多单向关联

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

【SSH进阶之路】【十一】hibernate5 注解映射【3】一对多多对一双向关联

在上两篇文章里,我们详细地分别讲解了一对多和多对一的单向关联配置的具体属性含义,在这一篇文章里,我们完成两者的的整合建立双向关联。 在实际的博客网站中,我们可能需要根据文章读取作者(用户)信息,但肯定...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:hibernate进阶之路之一对一映射(二)
举报原因:
原因补充:

(最多只允许输入30个字)