`

Hibernate表关联-one-to-one

 
阅读更多

三种实现方式,已顾客与房间的关系为例:

0. DB代码:

    DROP TABLE IF EXISTS 'Customer'; 

    CREATE TABLE 'Customer' (

    'id int ( 11 ) NOT NULL auto_increment,

    'name' varchar(255 ) NOT NULL,

    PRIMARY KEY  (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8;

 

    DROP TABLE IF EXISTS 'Room'; 

    CREATE TABLE 'Room' (

    'id' int ( 11 ) NOT NULL auto_increment,  

    'name' varchar(255 ) NOT NULL,  

    'customer_id' int ( 11 ) ,

    foreign key (' customer _id') references customer('id'), 

    PRIMARY KEY  ('id') ) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

1. 实体代码:

    public   class Customer implements  java.io.Serializable { 

              private  Integer id;  

              private  String name;  

              private Room room;

              //省略构造函数,get/set方法

    }

    public   class Room implements  java.io.Serializable { 

              private  Integer id;  

              private  String name;  

              private Customer customer ;

              //省略构造函数,get/set方法

    }

2. 通过外键方式实现:

    Room.hbm.xml:

    <hibernate-mapping> 

             <class  name= "com.domain.Customer"  table= "Customer"  catalog= "Temp" >

                      < id name="id"  type= "java.lang.Integer"

                            <column name="id"  />

                            <generator class = "native"  />

                      </id>  

                      <property name="name"  type= "java.lang.String>

                                 <column name="name"  not- null = "true"  />

                      </property>

                      <!-- class 可以不写,因为根据name的值computer(属性),会通过反射自动找到属于哪个类的 -->

                      <one-to-one cascade="all"  name= "customer"   class = "com.domain.Customer"  

                               property-ref= " customer " >

                      </one-to-one>

                </class >

     </hibernate-mapping> 

     Customer.hbm.xml:

     <hibernate-mapping>

           <class  name= "com.domain.Customer"  table= "Customer"  catalog= "Temp" >

                <id name="id"  type= "java.lang.Integer" >

                      <column name="id"  />

                      <generator class = "native"  />

                </id>

                <property name="name"  type= "java.lang.String" >

                      <column name="name"  not- null = "true"  />

                </property>

                <!-- many开头的是代表该表持有外键 -->

                <many-to-one  name="rom"   class = "com.domain.Room"   unique= "true">

                      <column name=" customer _id"  />

                </many-to-one> 

             </class >

      </hibernate-mapping> 

3. 通过主键方式,即一个表的主键有另一个表的主键决定,本例中Customer表的主键由Room表决定:

    Room.hbm.xml:

    <hibernate-mapping> 

             <class  name= "com.domain.Customer"  table= "Customer"  catalog= "Temp" >

                      < id name="id"  type= "java.lang.Integer"

                            <column name="id"  />

                            <generator class = "native"  />

                      </id>  

                      <property name="name"  type= "java.lang.String>

                                 <column name="name"  not- null = "true"  />

                      </property>

                      <!-- class 可以不写,因为根据name的值computer(属性),会通过反射自动找到属于哪个类的 -->

                      <!--

                      <one-to-one cascade="all"  name= "customer"   class = "com.domain.Customer"  

                               property-ref= " customer " >

                      </one-to-one>

                      -->

                      <one-to-one name="customer" class = "com.domain.Customer" cascade="all" >

                </class >

     </hibernate-mapping> 

     Customer.hbm.xml:

     <hibernate-mapping>

           <class  name= "com.domain.Customer"  table= "Customer"  catalog= "Temp" >

                <id name="id"  type= "java.lang.Integer" >

                      <column name="id"  />

                      <!--

                      <generator class = "native" cascade="all"   />

                       -->

                      <!--Customer的主键由Room的主键决定,可以看成是外键-->      

                      <generator class = "foreign" >

                              <param name="property" >room</param>

                      </generator>

                      <!--或者使用下面的方式-->

                      <generator class="increment"></generator>

                </id>                

 

                <property name="name"  type= "java.lang.String" >

                      <column name="name"  not- null = "true"  />

                </property>

                <!-- many开头的是代表该表持有外键 -->

                <!--

                <many-to-one  name="rom"   class = "com.domain.Room"   unique= "true">

                      <column name=" customer _id"  />

                </many-to-one> 

                -->

                <one-to-one name="rom"   class = "com.domain.Room" />

                <!--或者使用下面的方式-->

                <one-to-one name="rom"   class = "com.domain.Room" constrained="true" />

             </class >

      </hibernate-mapping> 

4. 通过关系表实现:

    create table room_cust( 

              room_id int  not  null ,  

              cust_id int  not  null

    )ENGINE=InnoDB DEFAULT CHARSET=utf8; 

    配置文件:

    <!--optional= "true" 的意思是只有当room_id 和 cust_id 都不为空时才在关系表里插入。这样也会插入 2 遍,

       所以需要inverse= "true" 把一方设置为虚的。即不让插入到关系表中-->

    <join table=" room_cus t"  optional= "true"  inverse= "true" >

              <key column="cust_id" />

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

    </join> 

 

 

分享到:
评论

相关推荐

    (4)Hibernate中的many-to-one和one-to-many关系

    在双向关联中,一方(通常是one-to-many的一方)需要通过`@OneToMany(mappedBy="")`来指定关联的另一方的属性,而另一方(many-to-one)则无需指定`mappedBy`,直接使用`@ManyToOne`即可。 4. 外键的处理 在one-to-...

    Hibernate one-to-many / many-to-one关系映射

    "Hibernate one-to-many / many-to-one关系映射"是两个基本的关系类型,用于表示实体间的关联。在这个主题中,我们将深入探讨这两种关系映射的原理、配置和实际应用。 一、一对一(one-to-one)与一对多(one-to-...

    hibernate one-to-one 一对一唯一外键关联映射_单向 and 双向

    在Hibernate中,一对一唯一外键关联映射可以通过 `&lt;many-to-one&gt;` 标签来配置。例如,以下是Person实体与IdCard实体的一对一唯一外键关联映射配置: ```xml &lt;many-to-one name="idCard" column="card_id...

    hibernate many-to-one(多对一)及 cascade(级联).doc

    在Hibernate中,可以通过 `&lt;many-to-one&gt;` 或者 `&lt;one-to-many&gt;` 标签中的 `cascade` 属性来指定这种行为。 #### 代码示例解析 在提供的代码示例中,`&lt;many-to-one&gt;` 标签中包含了 `cascade` 属性的注释示例,但是...

    Hibernate关联映射-one to one单向外键关联

    本话题主要探讨的是Hibernate中的一种关联映射方式——一对一(One-to-One)单向外键关联。这种关联模式通常用于两个实体之间存在唯一对应的关系,例如一个用户对应一个唯一的账户。 在Hibernate中,一对一关联可以...

    Hibernate-one-to-many

    本文将深入探讨Hibernate中一对多(One-to-Many)关系的处理方式,特别是通过外键映射和inverse属性的应用场景。 #### 一对多关系概念 一对多关系在数据库设计中非常常见,它指的是一个实体可以与多个其他实体关联...

    Hibernate Mapping Many-to-One 实例 内附源代码及附件下载

    对于`Department`,映射文件中会有一个`&lt;class&gt;`标签,其中包含`&lt;set&gt;`标签来定义员工集合,并且使用`&lt;many-to-many&gt;`或`&lt;one-to-many&gt;`标签来映射与`Employee`的关系。对于`Employee`,我们使用`&lt;class&gt;`标签,并在...

    (3)Hibernate3.2 中的 one-to-one关系

    在Java的持久化框架Hibernate中,一对一(One-to-One)关联是对象关系映射(ORM)中的一个重要概念,它用于表示两个实体之间一对一的映射关系。本篇将深入探讨Hibernate 3.2中的一对一关系,以及如何在实际项目中...

    Hibernate应用例子one-to-one

    在Hibernate中,"one-to-one"(一对一)关联是一种常见的关系映射类型,表示两个实体之间存在一对一的对应关系,就像一个人只能有一个护照,或者一辆车只能属于一个人一样。 一、一对一关系的配置 1. **注解配置**...

    hibernate学习5之one-to-many双向关联.docx

    `&lt;set&gt;`标签里的`&lt;one-to-many&gt;`子标签指定了与之关联的类。 在XML映射文件中,`Student.hbm.xml`包含了`&lt;many-to-one&gt;`元素,表示学生对象引用了一个班级对象,通过`classesid`列连接。而`Classes.hbm.xml`则使用...

    Hibernate Tutorial 04 (Many-to-one and One-to-one Association

    一对一关联可以通过 `&lt;one-to-one&gt;` 标签实现。假设我们有 `Book` 和 `Author` 两个实体类,每个 `Book` 只有一个 `Author`。 ```java public class Author { private Long id; private String name; private ...

    hibernate 全面学习->hibernate 关联映射学习

    本篇文章将全面探讨Hibernate的关联映射学习,包括一对一(One-to-One)、一对多(One-to-Many)、多对一(Many-to-One)以及多对多(Many-to-Many)四种关系映射。 首先,一对一关联映射(One-to-One)是两个实体...

    Hibernate one-to-many-annotation

    在Hibernate中,`one-to-many`关系是常见的实体间关系之一,表示一个实体可以与多个其他实体相关联。本文将深入探讨`Hibernate one-to-many`注解的使用和实现细节。 ### 一、`@OneToMany`注解概述 `@OneToMany`...

    Hibernate-One-To-One

    本主题主要关注的是Hibernate中的一个关键概念——一对一(One-To-One)关联映射。一对一关联是两个实体之间的一种关系,其中每个实体最多只能与另一个实体的单个实例相关联。 ### 一对一关联的基本概念 一对一关联...

    hibernate表关联关系

    ### Hibernate表关联关系详解 ...综上所述,无论是`many-to-many`还是`one-to-one`关联关系,在Hibernate中都可以通过相应的配置文件来实现。正确地理解和配置这些关联关系对于构建高效、可扩展的应用程序至关重要。

    hibernate-release-5.0.7.Final.zip官方

    &lt;one-to-many class="Order"/&gt; ``` ```java @Entity public class User { @Id private Long id; private String name; @Fetch(FetchMode.JOIN) @OneToMany(mappedBy = "user") private List&lt;Order&gt;...

    hibernate 关联映射(二) one to one(单向)

    本篇文章将深入探讨Hibernate中的关联映射,特别是One-to-One(一对一)关联,这是一种表示两个实体之间一对一关系的映射方式。我们将通过源码分析和实际例子来理解其工作原理。 ### 一、One-to-One关联概述 在...

    hibernate 关联映射(一) many to one

    在数据库中,这通常表现为一对多(One-to-Many)的关系,但在对象模型中,由于我们是从一个对象的角度出发,所以称为Many-to-One。 在Hibernate中实现Many-to-One关联,我们需要在实体类中定义对应的属性,并通过...

    hibernate中基于外键的one2one

    在Java的持久化框架Hibernate中,一对一(One-to-One)关系映射是一种常见的实体关联方式。基于外键的One-to-One映射是其中的一种实现方式,它通过在一方或双方实体的表中添加外键来建立关联。接下来,我们将深入...

Global site tag (gtag.js) - Google Analytics