`
jylovejava
  • 浏览: 2409 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

多对一 单向关联 匹配 关系数据库中的外键参照关系

阅读更多

多对一 单向关联 匹配 关系数据库中的外键参照关系
2008-09-06 12:22
映射 多对一 单向关联 [原创 2007-02-07 15:14:44]   

读完 Java对象持久化技术详解6.1节,写一下读书笔记:

    多对一 单向关联 匹配 关系数据库中的外键参照关系。

     在关系数据库中,只存在外键参照关系,而且是由many--->one,是单向关联。

    以Customer和Order为例。

 

        单向关联中,Order中包含一个customer属性。这样定义了一个Order到Customer的关联,是多对一的。Customer中未包含Order属性.

       在Order.hbm.xml中,要进行关联映射Order类与ORDERS表。

       查看更多精彩图片         查看更多精彩图片

单向关联中,Order中包含一个customer属性。这样定义了一个Order到Customer的关联,是多对一的。Customer中未包含Order属性.

       在Order.hbm.xml中,要进行关联映射Order类与ORDERS表。

       查看更多精彩图片         查看更多精彩图片

         id------ID         customer------CUSTOMER_ID

         映射 customer------CUSTOMER_ID需要 使用 many-to-one

        many-to-one用来建立customer属性和ORDERS表的外键CUSTOMER_ID之间的映射

         <many-to-one

                name = "customer"        //待映射的持久化类的属性名

               column = "CUSTOMER_ID"   //设定和该属性对应的表的外键

               class = "Customer"        //设定该属性的类型

                not-null = "true"         //表示customer属性不能为null,默认为false

               cascade = "all"          //级联更新与Order类对象相关联的对象

        />

       一个概念:

       临时对象(transient)

                刚刚通过new( )创建,并且未被持久化的对象。

               Customer customer = new Customer();   //transient

                session.save(customer); //执行完该语句后,customer成为持久化对象

 

     //------------------不同的配置出现的不同情况-----------------------

    cascade取默认值的情况

      <many-to-one

     Order order = new Order();

     order.setCustomer(customer);

     session.save(order);

      Hibernate持久化order时, 不会自动持久化与其相关联的其他对象,因为没有显示设置cascade属性的相关值。

     这样cascade取默认值none,当持久化order时,会执行类似如下语句:

     insert into ORDERS (ID,CUSTOMER_ID) values (1,null )

    这违反了数据库完整性约束,因为ORDERS表中设置的CUSTOMER_ID为 not null

   抛出异常:

      net.sf.hibernate.PropertyValueException: not-null property references a null or transient

     value: Order.customer

    删除 not-null = "true"后,

     会把order与customer一起持久化。

      insert into CUSTOMERS(ID,NAME) values( 1 , " haha")

     insert into ORDERS( ID, CUSTOMER_ID) values (1,1 )

     

 

      <many-to-one

     Order order = new Order();

     order.setCustomer(customer);

     session.save(order);

      Hibernate持久化order时,

    insert into ORDERS (ID,CUSTOMER_ID) values (3,null )

      这次成功持久化了order对象,不再抛出PropertyValueException,因为ORDERS表的CUSTOMER_ID允许null值出现

     但当Hibernate自动清理(flush)缓存中所有持久化对象时,抛出新的异常:

    net.sf.hibernate.TransientObjectException: object references an unsaved transient instance -

    save the transient instance before flushing: Customer

     flush -- Hibernate按照内存中持久化对象的状态 来同步更新数据库.

     Hibernate发现持久化对象order引用transient对象customer,而ORDERS表中相应的记录的

     CUSTOMER_ID字段为null,也就是说内存中的持久化对象的状态与数据库中的记录不一致。

     而且在这种情况下,Hibernate没办法使两者同步,因为Hibernate不会自动持久化customer对象,

     所以,Hibernate抛出 TransientObjectException异常。

    这时需要设置cascade属性来解决问题

      <many-to-one

                name = "customer"        //待映射的持久化类的属性名

               column = "CUSTOMER_ID"   //设定和该属性对应的表的外键

               class = "Customer"        //设定该属性的类型

               cascade = "save-update"           //当保存或更新当前对象时

                                                          //级联保存或更新与Order类对象相关联的对象

        />

       这样当执行

       Customer customer = new Customer();   //transient

      customer.setName("haha");

       Order order = new Order();

      order.setCustomer(customer);

      session.save(order);

 

                name = "customer"         //待映射的持久化类的属性名

               column = "CUSTOMER_ID"   //设定和该属性对应的表的外键

               class = "Customer"        //设定该属性的类型

        />

    Customer customer = new Customer();    //transient

 

                name = "customer"         //待映射的持久化类的属性名

               column = "CUSTOMER_ID"   //设定和该属性对应的表的外键

               class = "Customer"        //设定该属性的类型

                not-null = "true"         //表示customer属性不能为null,默认为false

        />

    Customer customer = new Customer();    //transient

分享到:
评论

相关推荐

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

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

    关于关系型数据库基本知识(主键、外键、一对一、一对多、多对一等).docx

    多对一关系是从一对多的另一个角度看,如员工表中的部门ID可以是部门表的外键,形成多对一的关联。 最后,多对多关系表示一个表中的记录可以对应另一表中的多个记录,反之亦然。这通常通过中间表来实现,如学生和...

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

    以上就是关于Hibernate中实现多对一单向关联关系的基本知识,包括如何在实体类中定义关联、如何进行数据库操作以及如何查询关联对象。这个源代码示例应该提供了更具体的实现细节,你可以通过查看和运行它来深入理解...

    Hibernate教程04_关系映射之一对一单向外键关联

    在数据库中,外键用于在两个表之间建立关联,而在单向一对一关联中,通常只在一个实体类中声明对另一个实体的引用,而另一个实体类并不知晓这个关联。 **详细知识点:** 1. **实体类与表的映射**:在Hibernate中,...

    java获取数据库主外键

    本文将详细介绍如何使用Eclipse和JDBC API来获取MySQL数据库中的表结构以及主外键信息。 #### 一、准备工作 在开始之前,请确保你的开发环境已经安装了Eclipse IDE,并且项目中已经配置好了MySQL的JDBC驱动。此外...

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

    在Java的持久化框架Hibernate中,一对一(One-to-One)关联映射是常见的关系数据库模型映射方式之一。本文将详细解析如何实现一对一唯一外键(Uniquely Foreign Key,UFK)关联映射,特别是在单向关联的情况下的具体...

    Hibernate基于外键的一对多单向关联

    “Hibernate基于外键的一对多单向关联”这个标题指的是在Java持久化框架Hibernate中,如何通过外键实现一个实体类(如订单)与另一个实体类(如商品)之间的一对多关系,并且这种关联是单向的,即从订单端可以访问到...

    数据库主外键详解

    数据库外键(Foreign Key)是表中的一个字段,它用于引用另一个表中的主键,用于建立表之间的关系。外键的目的是为了维护数据的一致性和完整性,避免数据中的不一致和错误。 创建外键约束时,需要指定引用哪个表的...

    Hibernate 一对多外键单向关联

    在Java持久化框架Hibernate中,一对多外键单向关联是一种常见的关系映射方式,它描述了一对多的关系,其中一个实体(例如Person)可以与多个其他实体(例如Address)相关联,而关联的方向只从多方(Address)指向...

    Hibernate 一对一外键单向关联

    总结起来,Hibernate中的一对一外键单向关联提供了方便的方式处理两个实体之间的关系。通过注解或XML配置,我们可以轻松地在Java对象和数据库表之间建立映射,使得数据操作更加简洁和高效。不过,需要注意的是,这种...

    如何处理数据库中的外键

    数据库中的外键是关联不同表的关键元素,它们用于维护数据的一致性和完整性。在复杂的数据库设计中,理解和正确处理外键至关重要。以下是一些关于如何处理数据库中外键的重要知识点: 1. **外键定义**:外键...

    Hibernate 一对一关联映射(主键关联VS唯一外键关联)

    在Java的持久化框架Hibernate中,一对一(One-to-One)关联映射是常见的关系数据库模型。本篇文章将深入探讨两种实现一对一关联的方式:主键关联(Primary Key Join)和唯一外键关联(ForeignKey Join),并结合源码...

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

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

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

    在Java的持久化框架Hibernate中,一对一(One-to-One)关联关系是常见的一种实体关系映射。本主题将深入探讨如何使用Hibernate通过主键来实现一对一的单向关联关系,并提供相关的源码分析。 首先,我们需要理解一对...

    Hibernate教程10_关系映射之多对一单向关联

    本教程主要聚焦于Hibernate中的一个关键概念——关系映射,特别是多对一单向关联的实现。这种关联类型常出现在数据库设计中,比如一个部门可以有多名员工,但一个员工只属于一个部门。 首先,我们要理解多对一关系...

    hibernate一对一之唯一外键关联(单向关联)

    在Java的持久化框架Hibernate中,一对一(One-to-One)关联是对象关系映射(ORM)中的一个重要概念,用于表示两个实体之间一对一的关系。在这个场景下,我们将讨论一种特殊的一对一关联方式——唯一外键关联(Single...

    Hibernate一对一单向外键关联 (联合主键annotation)

    在Java的持久化框架Hibernate中,一对一(One-to-One)关联是常见的关系映射类型,它用于表示两个实体之间存在唯一的对应关系。本篇将详细讲解如何使用Hibernate进行一对一单向外键关联,并且该关联涉及到联合主键的...

    hibernate基于主外键的一对多/多对一关联

    "hibernate基于主外键的一对多/多对一关联"是Hibernate中两个核心的概念,用于描述实体之间的关系。下面将详细阐述这两个关联类型及其实现方式。 一对多关联是指在数据库中,一个表的记录可以与另一个表中的多个...

    hibernate一对一之唯一外键关联(双向关联)

    本篇主要探讨的是Hibernate中的一对一(OneToOne)关系映射,特别是唯一外键关联(UniDirectional and Bidirectional Association)的情况。我们将深入理解这种关联方式的配置、实现以及它在实际应用中的价值。 1. ...

Global site tag (gtag.js) - Google Analytics