`
hugang357
  • 浏览: 188386 次
  • 性别: Icon_minigender_2
  • 来自: 深圳
社区版块
存档分类
最新评论

一对一关联关系的使用

    博客分类:
  • ssh
阅读更多
   一对一关系在实际生活中是比较常见的,例如学生与学生证的关系,通过学生证可以找到学生。一对一关系在Hibernate中的实现有两种方式,分别是主键关联和外键关联。

1.以主键关联

主键关联的重点是,关联的两个实体共享一个主键值。例如,Student与Card是一对一关系,它们在数据库中对应的表分别是t_student 和t_card。它们共用一个主键值id,这个主键可由t_student表或t_card表生成。问题是如何让另一张表引用已经生成的主键值呢?例如,t-student表填入了主键id的值,t_card表如何引用它?这需要在Hibernate的映射文件中使用主键的foreign生成机制。
为了表示Student与Card之间的一对一关联关系,在Student和Card的映射文件Student.hbm.xml和Card.hbm.xml中都要使用<one-to-one>标记,如例程9-2所示。

例程9-2  Student.hbm.xml

--------------------------------------------------------------------
---------------------------
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >

<hibernate-mapping>
<class name="test.Student" table="T_STUDENT" lazy="true"><!-- 把类与表关联起来-->
<id name="id" column="id" type="int">
<generator class="increment" />
</id>
<property name="name" column="NAME" type="string" />
<!--property name="card_id" column="CARD_ID" type="int" /--> <!--映射学生证号-->
<property name="sex" column="SEX" type="string" />
<property name="age" column="AGE" type="int" />
<one-to-one  name="card"  class="test.Card"
fetch="join" cascade="all"  />
</class>
</hibernate-mapping>

<class>元素的lazy属性设定为true,表示延迟加载,如果lazy的值设置为false,则表示立即加载。下面对立即加载和延迟加载这两个概念进行说明。


立即加载:表示Hibernate在从数据库中取得数据,组装好一个对象(比如学生1)后,会立即再从数据库取得数据,组装此对象所关联的对象(例如学生证1)。


延迟加载:表示Hibernate在从数据库中取得数据,组装好一个对象(比如学生1)后,不会立即再从数据库取得数据,组装此对象所关联的对象(例如学生证1),而是等到需要时,才会从数据库取得数据,组装此关联对象。

<one-to-one>元素的cascade属性表明操作是否从父对象级联到被关联的对象,它的取值如下。
none:在保存、删除或修改对象时,不对其附属对象(关联对象)进行级联操作。这是默认设置。
save-update:在保存、更新当前对象时,级联保存、更新附属对象(临时对象、游离对象)。
delete:在删除当前对象时,级联删除附属对象。
all:在所有情况下均进行级联操作,即包含save-update和delete操作。
delete-orphan:删除和当前对象解除关系的附属对象。

<one-to-one>元素的fetch属性的可选值是join和select,默认值是select。当fetch属性设定为 join时,表示连接抓取(Join fetching) : Hibernate通过 在SELECT语句使用OUTER JOIN(外连接)来获得对象的关联实例或者关联集合。 当fetch属性设定为select时,表示查询抓取(Select fetching):需要另外发送一条 SELECT 语句抓取当前对象的关联实体或集合。

例程9-3中<one-to-one>元素的cascade属性设置为“all”,表示增加、删除及修改Student对象时,都会级联增加、删除和修改Card对象。


例程9-3  Card.hbm.xml

-----------------------------------------------------------------------------------------------
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >

<hibernate-mapping>
<class name="test.Card" table="t_card" lazy="true"><!-- 把类与表关联起来-->
<id name="id" column="id">
<generator class="foreign" >
<param name="property">student</param>
</generator>
</id>
<one-to-one name="student"  class="test.Student" constrained="true"/>
<property name="name" column="name" type="string" />
<!-- one-to-one name="student"  class="test.Student" constrained="true"/-->
</class>
</hibernate-mapping>

在例程9-3中,Card.hbm.xml的主键id使用外键(foreign)生成机制,引用代号为“student”对象的主键作为Card表的主键和外键。student在该映射文件的<one-to-one>元素中进行了定义,它是Student对象的代号。<one- to-one>元素的属性Constrained="true"表示Card引用了student的主键作为外键。

需要特别注意的是,Student类中要相应地加入一对get/set方法:

public Card getCard() {
return this.card;   
}
public void setCard(Card card) {
this.card = card;
}

在Card类中也要相应地加入一对get/set方法:

public Student getStudent() {
return this.stu;
}
public void setStudent(Student stu) {
this.stu = stu;
}

在客户端测试程序中操纵Student和Card对象的方法如例程9-4所示。
例程9-4  客户端测试程序

package test;

import org.hibernate.*;
import org.hibernate.cfg.*;
import java.io.File;
import java.util.List;

public class Test {
public static void main(String[] args) {

File file = new File("D:\\eclipse3.2\\workspace\\HibernateTest
\\hibernate.cfg.xml");

Configuration  conf = new Configuration().configure(file);

SessionFactory  sf = conf.buildSessionFactory();

Session session = sf.openSession();

Transaction tx = session.beginTransaction();

//新建Student对象
Student stu = new Student();
stu.setName("Walker");
stu.setSex("male");
stu.setAge(22);

            //新建Card对象
Card card = new Card();
card.setName("Walker");

//设置Student对象与Card对象之间的关联
stu.setCard(card);
card.setStudent(stu); //此句不能省略,否则card将不知从何处取得主键值

try {
session.save(stu);
tx.commit();
session.close();
System.out.println("Data have been inserted into DB.");
} catch (HibernateException e) {
e.printStackTrace();
tx.rollback();
session.close();
}   
}
}

运行以上代码后,将会在t_student表和t_card表中插入相应的数据。

2.以外键关联

以外键关联的要点是:两个实体各自有不同的主键,但其中一个实体有一个外键引用另一个实体的主键。例如,假如Student和Card是外键关联的一对一关系,它们在数据库中相应的表分别是t_student表和t_card表,t_student表有一个主键id,t_card表有一个主键id和一个外键stu_id,此外键对应student表的主键id。

Student的映射文件Student.hmb.xml见例程9-2。但Card的映射文件Card.hbm.xml要做相应变动,如例程9-5所示。
例程9-5  Card.hbm.xml

-----------------------------------------------------------------------------------------
-----------------------------
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd">

<hibernate-mapping>
<class name="test.Card"  table="T_CARD" lazy= "true"><!--把类与表关联起来-->
<id name="id" >
<generator class="increment" ><!--不再是foreign了-->
</generator>
</id>
<property name="name" column="NAME" type="string" />
<many-to-one  name="student"  class="Student" column="stu_id"
unique="true"/> <!--唯一的多对一,实际上变成一对一关系了-->
</class>
</hibernate-mapping>

在例程9-5中,<many-to-one>元素的name属性声明外键关联对象的代号,class属性声明该外键关联对象的类,column属性声明该外键在数据表中对应的字段名,unique属性表示使用DDL为外键字段生成一个唯一约束。

以外键关联对象的一对一关系,其实本质上变成了一对多的双向关联了,应直接按照一对多和多对一的要求编写它们的映射文件。当<many-to-one>元素的unique属性设定为true,多对一的关系实际上变成了一对一的关系。

在客户端程序中操纵外键关联一对一关系的对象的方法见例程9-4。
分享到:
评论

相关推荐

    hibernate一对一关联关系

    本资源主要探讨的是“hibernate一对一关联关系”。 一对一关联关系在现实世界中很常见,比如一个人只有一个身份证,或者一个公司的总部只有一个。在Hibernate中,设置一对一关联关系可以帮助我们更好地管理和操作...

    hibernate主键实现一对一单向关联关系源码

    首先,我们需要理解一对一关联关系的基本概念。在数据库中,一对一关系意味着两个表中的每一条记录都对应另一表中的唯一一条记录。在Hibernate中,这种关系可以通过共享主键或外键来实现。由于题目中提到的是“主键...

    hibernate外键实现一对一单向关联关系源码

    **一对一关联关系**在数据库设计中表示两个表之间存在唯一的对应关系,例如,一个人可能只有一个护照,或者一个员工只有一个职位。在Hibernate中,这种关系可以通过外键(Foreign Key)在一方或双方实体中实现。 **...

    hibernate外键实现一对一双向关联关系源码

    在实际应用中,确保在两个实体类间的一对一关联正确无误非常重要。在创建和更新关联时,应避免循环引用和数据不一致的问题。在保存或更新对象时,需确保在双方都进行了正确的设置。 8. **性能考虑**: 一对一双向...

    Hibernate ORM - 一对一连接表关联关系

    描述部分虽然为空,但我们可以根据标题推测,这篇内容可能涉及了如何在Hibernate中配置和使用一对一关联,包括实体类的设计、注解的使用以及数据库表的结构设计等。 **知识点详解** 1. **Hibernate ORM框架**: ...

    一对一关联

    一对一关联(OneToOne)在关系型数据库设计中是一种常见的实体关系模型,用于表示两个表之间的一种强关联,其中一张表的某条记录唯一对应另一张表的一条记录。这种关联通常通过外键(Foreign Key)来实现,确保数据...

    Hibernate ORM - 一对一主键关联关系

    - **外键约束**:在一对一关联中,如果不使用共享主键,可以创建外键约束,但这样就不再是真正的“主键关联”。 - **懒加载与立即加载**:默认情况下,关联对象会在加载主对象时一同加载,这称为“立即加载”。若...

    hibernate使用主键关联的一对一关系

    在这个场景中,“hibernate使用主键关联的一对一关系”指的是通过共享主键来实现两个实体类之间的这种一对一绑定。下面我们将深入探讨这一主题。 首先,我们需要理解一对一关系的概念。在数据库中,一对一关系意味...

    hibernate多对一单向关联关系实现源码

    对于单向多对一关联,通常是在多方(拥有多个实体)的类中添加一个对单方(拥有单一实体)的引用。 例如,我们可以创建两个实体类:`Employee`(员工)和`Department`(部门)。在`Employee`类中,我们将有一个`...

    JPA_2_一对多双向关联关系

    **JPA 2 一对多双向关联关系** Java Persistence API(JPA)是Java平台上的一个标准,用于处理对象关系映射(ORM),使得开发者可以使用面向对象的方式操作数据库。在JPA中,一对多关联关系是常见的实体间关系类型...

    Springboot中mybatis表关联映射关系(一对一)

    在 MyBatis 中,我们可以使用 `&lt;association&gt;` 元素来处理一对一关联关系。 `&lt;association&gt;` 元素的主要属性包括: * `property`:指定映射到的实体类对象属性,与表字段一一对应。 * `column`:指定表中对应的...

    Hibernate映射一对多关联关系

    - **映射策略**:使用Hibernate进行一对多关联关系的映射。 - **API操作**:利用Hibernate API进行关联对象的级联操作。 #### 一、一对多关联关系概念 一对多关联关系是指一个实体可以与多个其他类型的实体关联,但...

    Hibernate ORM - 一对一外键关联关系

    1. **一对一外键关联配置**:在Hibernate中,可以通过在映射文件中添加`&lt;one-to-one&gt;`标签或在实体类上使用`@OneToOne`注解来定义一对一关联。关联的外键通常位于被引用的实体(“一对一”关系的“一”端)中。 2. ...

    JPA中的一对一双向关联

    在Java Persistence API (JPA) 中,一对一双向关联是一种关系映射,它允许两个实体类之间存在一对一的关系,并且每个实体都能引用对方。这种关联是双向的,意味着每个实体都可以通过自己的属性访问到另一个实体。...

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

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

    hibernate一对一主键关联映射(单项关联)

    - **唯一性约束**:在数据库层面,为了确保一对一关联,通常需要添加唯一性约束。例如,`IdCard`表的`person_id`列应具有唯一性约束。 以上就是关于Hibernate中一对一主键关联映射(单项关联)的详细解释。通过这种...

    Hibernate双向一对一关联映射(注解版)

    3. **初始化关联对象**:在使用双向一对一关联时,确保在需要时正确初始化并设置双方的引用,否则可能引发空指针异常。 4. **事务管理**:由于涉及数据库操作,所以在保存或更新关联对象时,需要确保在事务中进行,...

    hibernate关联关系实例

    1. **一对一关联关系**: 在一对一关联中,一个实体对应另一个实体的唯一实例。这可以通过在实体类中定义`@OneToOne`注解来实现。配置包括指定关联字段、外键约束(optional或mappedBy)以及是否为懒加载(lazy)。...

    Hibernate一对一唯一外键关联映射(双向关联)

    在Hibernate中,一对一关联可以通过配置XML映射文件或使用注解来实现。这里我们将使用注解方式进行说明。首先,我们需要在两个实体类中分别定义对应的属性,并使用`@OneToOne`注解来指定关联关系。 1. 实体类A: ``...

    Hibernate ORM - 一对多双向关联关系

    标题“Hibernate ORM - 一对多双向关联关系”指的是在数据库建模中,Hibernate ORM(对象关系映射)框架如何处理一个实体类(如User)与多个实体类(如Article)之间的关系。在这种关系中,一个用户可以拥有多个文章...

Global site tag (gtag.js) - Google Analytics