`

hibernate one-to-one

阅读更多

一。

1. 完全的一对一关系,即A与B两种实体,分两个表格,一对一,A和B的关键字一样,其中一个是父,先产生,另一个是子,后产生,使用要求,就是A和B生成后,一般不再改变关系,也就是说A一般不再将C做为其子,而去除与B的关系,适用情况,比如表格某一部分太大,经常查询需要大量数据流,而将表分开以提高性能,完全一对一关系要求不能更改两者的关系,比如A对应B,一旦要将A的对应关系改成C一般是不允许的,因为C也要和A一样的ID,这样B和C的ID就冲突了,可以测试一下,看会不会冲突
2. <one-to-one
        name="propertyName"                                                       (1)
       class="ClassName"                                                            (2)
        cascade="all|none|save-update|delete"                         (3)
       constrained="true|false"                                                      (4)
        outer-join="true|false|auto"                                                (5)
        property-ref="propertyNameFromAssociatedClass"   (6)
        access="field|property|ClassName"                               (7)
       />
3. (1) name: 属性的名字

(2) class (可选 - 默认是通过反射得到的属性类型):被关联的类的名字。

(3) cascade(级联) (可选) 表明操作是否从父对象级联到被关联的对象。

(4) constrained(约束) (可选) 表明该类对应的表对应的数据库表,和被关联的对象所对应的数据库表之间,通过一个外键引用对主键进行约束。这个选项影响save()和delete()在级联执行时的先后顺序(也在schema export tool中被使用)。(constrained=true 表明addresses表id同时作为customers的外键)

(5) outer-join(外连接) (可选 - 默认为 自动): 当设置hibernate.use_outer_join的时候,对这个关联允许外连接抓取。

(6) property-ref: (可选) 指定关联类的一个属性,这个属性将会和本外键相对应。如果没有指定,会使用对方关联类的主键[POJO中POJO类的实例]。

(7) access (可选 - 默认是 property): Hibernate用来访问属性的策略。
4. One-to-one中不需要inverse,另外完全的一对一关系很严格,两个对象一定同时存在,并且存在以后一般不会再修改,如果修改也不能从主动的一端进行修改了
5. 环境:模拟共享文件系统,Appender,每个附件有个名字和一个文件组成,在此将文件放到另一个表格中(AppenderFile)
6. 配置文件
-----------------------------------------------------------主动者
   <hibernate-mapping package="com.softWork.school">
 <class name="Appender" table="appender">
    <id name="appenderId" column="appender_id" type="long">
      <generator class="native"/>
    </id>
    <property name="appenderTitle" column="appender_title" type="string" length="200"/>
   
    <one-to-one name="appenderFile" class="com.softWork.school.AppenderFile" constrained="false" cascade="all">
    </one-to-one>
 </class>
</hibernate-mapping>
 
-------------------------------------------------------------------------------------------被动着
<hibernate-mapping package="com.softWork.school">
 <class name="AppenderFile" table="appender_file">
    <id name="id" column="id" type="long">
      <generator class="foreign">
        <param name="property">appender</param>
      </generator>
    </id>
    <property name="fileContent" column="file_content" type="string" length="2000"/>
   
    <one-to-one name="appender" class="com.softWork.school.Appender" constrained="true">
    </one-to-one>
 </class>
</hibernate-mapping>
 
 
7. 几个注意
1) 个主动者的constrainted为false,被动着为true,这个关键字主要决定关键字的生成是通过别人来获得还是自己生成
2) 被动者也一定要有主动者的引用以在主动者创建成功后获得其获得的ID。程序执行时,被动者也一定要设置好主动者对象的引用,虽然也可以先不设置,这样在保存主动者的时候,被动者将不会被保存,虽然这样可以达到先创建主动者 ,而后按需要创建被动者,但是这与实际语义不符
3) 不可以通过为主动者设置新的被动者来删除原被动者的值,而增加新的被动者
4) 可以通过主动对象直接修改被动对象的内容后,保存主动对象而直接修改被动对象对应数据库的内容
5) 可以级连删除
6) 一定要先创建主动者再创建被动者
8. 操作程序示范
前提条件是’级连’
            /*
     1)可以级连保存数据
       Appender appender = new Appender();
       appender.setAppenderTitle("hello world.");
       AppenderFile appenderFile = new AppenderFile();
       appenderFile.setFileContent("good action.");
       appender.setAppenderFile(appenderFile);
       appenderFile.setAppender(appender);
      //以下一句将保存所有数据
       session.saveOrUpdate(appender);
       */
       2)可以通过父对象获取子对象后修改子对象内容,保存父对象,级连更新到子对象
       //读取appenderFile对象内容
       Appender appender = (Appender)session.load(Appender.class,new Long(4));
       /*
       appender.getAppenderFile().setFileContent("a sucess man.");
      //可以通过父对象修改子对象内容
       session.saveOrUpdate(appender);
       */
3)只删除子对象
          a.通过设appender.setAppenderFile(null);
                    session.saveOrUpdate(appender); 无效
          b. Appender appender = (Appender)session.load(Appender.class,new Long(1));
             AppenderFile appenderFile = appender.getAppenderFile();
        session.delete(appenderFile);删除失败
          c. Appender appender = (Appender)session.load(Appender.class,new Long(1));
             AppenderFile appenderFile = appender.getAppenderFile();
             appender.setAppenderFile(null);
             session.delete(appenderFile);
            session.saveOrUpdate(appender);成功
4)通过为父对象设置新的子对象来修改子对象数据库中内容,操作失败,所以一般的,一对一的操作,因为完全可以通过父对象来设置子对象内容,完全不需要通过更换子对象来更换子表内容
//以下操作失败
Appender appender = (Appender)session.load(Appender.class,new Long(1));
        AppenderFile appenderFile = appender.getAppenderFile();
        appender.setAppenderFile(null);
        AppenderFile newFile = new AppenderFile();
        newFile.setFileContent("good man");
       
        appender.setAppenderFile(newFile);
        newFile.setAppender(appender);
        session.delete(appenderFile);
        session.saveOrUpdate(appender);
 
      4)级连删除成功
       session.delete(appender); 

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/notruiyi/archive/2007/08/13/1740124.aspx

 

 

二。

 

customer.hbm.xml中有

<many-to-one name="homeAddress" class="mypack.Address" column="HOME_ADDRESS_ID"

       cascade="all" unique="true"/>



<many-to-one name="comAddress" class="mypack.Address" column="COM_ADDRESS_ID"

       cascade="all" unique="true"/>

 

address.hbm.xml 中有

 

<one-to-one name="customer" class="mypack.Customer" property-ref="homeAddress"/>

 

 

property-ref属性表明建立从 homeAddress对象到Customer对象的关联。因此只要调用 homeAddress 持久化对象的 getCustomer()方法,就能导航到 Customer对象

 

 

 

分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

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

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

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

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

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

    本话题主要探讨两种基本的关系映射类型:many-to-one(多对一)和one-to-many(一对多)。这两种关系映射是数据库中常见的关联类型,理解和掌握它们对于开发高质量的Java应用至关重要。 1. many-to-one关系 many-to...

    Hibernate one-to-many-annotation

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

    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学习5之one-to-many双向关联.docx

    而`Classes.hbm.xml`则使用了`&lt;set&gt;`和`&lt;one-to-many&gt;`元素,表示班级对象包含一个学生集合,且每个学生都有对应的`id`。 在处理这种关联关系时,需要注意的是效率问题。由于Hibernate默认会在"一"端更新关联关系,...

    Hibernate-one-to-many

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

    hibernate:one-to-one

    hibernate:one-to-one 的学习小经验

    hibernate one-to-many 单/双向关联映射配置心得

    本文主要关注Hibernate中的一个核心概念——一对一(One-to-One)、一对多(One-to-Many)和多对一(Many-to-One)关联映射,特别是关于“一到多”单向和双向关联映射的配置心得。 首先,让我们了解“一到多”关联...

    Hibernate应用例子one-to-one

    【Hibernate应用例子one-to-one】 Hibernate 是一个强大的Java对象关系映射(ORM)框架,它允许开发者以面向对象的方式操作数据库,从而简化了数据库应用程序的开发。在Hibernate中,"one-to-one"(一对一)关联是...

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

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

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

    在 `Book` 类中,我们可以添加一个指向 `Author` 的属性,并在映射文件中使用 `&lt;one-to-one&gt;` 标签。 ```xml &lt;!-- 其他属性的映射 --&gt; &lt;one-to-one name="author" class="Author" column="AUTHOR_ID" cascade=...

    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;`标签,并在...

    Hibernate one to one详细配置

    在Java的持久化框架Hibernate中,一对一(One-to-One)关联映射是常见的关系映射类型之一。它用于表示两个实体之间一对一的关联关系,即一个实体对应另一个实体的唯一实例。下面将详细介绍Hibernate中如何进行一对一...

    hibernate-one-to-one-uni

    本项目“hibernate-one-to-one-uni”专注于探讨和实现Hibernate框架中的一对一(One-to-One)关系映射,这种关系在数据库设计中比较常见,用于表示两个实体之间一对一的联系。 一对一关系映射在Hibernate中分为两种...

    Hibernate one to many(many to one) 配置

    标题"Hibernate one to many(many to one) 配置"涉及到的是关系型数据库在Java中的持久化框架Hibernate中的两种关联映射关系:一对一(One-to-One)和多对一(Many-to-One)。在数据库设计中,这种关系很常见,例如...

    Hibernate中many-to-one关系的编写_远航的水手

    Hibernate中many-to-one关系的编写_远航的水手

    hibernate中基于外键的one2one

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

Global site tag (gtag.js) - Google Analytics