`
德莫罗
  • 浏览: 174138 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

inverse 在 one-to-many 中所含意义的详细解释

阅读更多

初学Hibernate很多人搞不清inverse的意义在这里做一个详细的解释

首先对inverse做一个语言描述

inverse="true"即表示放弃对关系的维护权.在inverse所在的hibernate配置元素中,所有的关系改变将不被反映到数据库中.

例如,如下两个配置

1 Item类映射文件

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 2010-4-13 15:36:15 by Hibernate Tools 3.3.0.GA -->
<hibernate-mapping>
    <class name="com.hib.entity.Item" table="item" catalog="hibernate">
        <id name="itemId" type="java.lang.Integer">
            <column name="ITEM_ID" />
            <generator class="identity" />
        </id>
        <property name="sellerId" type="int">
            <column name="SELLER_ID" not-null="true" />
        </property>
        <property name="name" type="string">
            <column name="NAME" not-null="true" />
        </property>
        <set name="bids" table="bid" inverse="true" lazy="false" fetch="select">
            <key>
                <column name="ITEM_ID" not-null="true" />
            </key>
            <one-to-many class="com.hib.entity.Bid" />
        </set>
    </class>
</hibernate-mapping>

 2 Bid类映射文件

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 2010-4-13 15:36:15 by Hibernate Tools 3.3.0.GA -->
<hibernate-mapping>
    <class name="com.hib.entity.Bid" table="bid" catalog="hibernate">
        <id name="bidId" type="java.lang.Integer">
            <column name="BID_ID" />
            <generator class="identity" />
        </id>
        <many-to-one name="item" class="com.hib.entity.Item" fetch="select">
            <column name="ITEM_ID" not-null="true" />
        </many-to-one>
        <property name="bidderId" type="java.lang.Integer">
            <column name="BIDDER_ID" />
        </property>
        <property name="amount" type="java.lang.Integer">
            <column name="AMOUNT" />
        </property>
    </class>
</hibernate-mapping>

 Item类映射文件中set元素的inverse="true"表示 Item 类的 set 集合放弃对关联关系的维护权.也就是说,对于一个Item类的实例.改变set中的内容,在Item 的 update 和 insert 操作中将不被反映到数据库.这句话是什么意思.请看如下代码.

已知条件:数据库中.ITEM表和BID表数据如下

ITEM 表

--------------------------------------

ITEM_ID  |  NAME

---------------------------------------

1             | item1

--------------------------------------

2             | item2

---------------------------------------

BID表

----------------------------------------

BID_ID    | ITEM_ID | AMOUNT

------------------------------------------

1             | 1            | 3000

--------------------------------------------

2             | 1            | 3000

-------------------------------------------

 

执行如下java代码

Item item=ItemDAO.getById(2);
Bid bid=BidDAO.getById(2);
item.getBids().add(bid);
ItemDAO.update(item);
 

执行完后,数据库内容如下

ITEM 表

--------------------------------------

ITEM_ID  |  NAME

---------------------------------------

1             | item1

--------------------------------------

2             | item2

---------------------------------------

BID表

----------------------------------------

BID_ID    | ITEM_ID | AMOUNT

------------------------------------------

1             | 1            | 3000

--------------------------------------------

2             | 1            | 3000

-------------------------------------------

可以看到,数据库没有任何改变.

查看

Item item=ItemDAO.getById(2);
System.out.println(item.getBids().size());

 size

Item item=ItemDAO.getById(2);
System.out.println(item.getBids().size());

 

仍然为0.再执行如下代码

Item item=ItemDAO.getById(2);
Bid bid=BidDAO.getById(2);
bid.setItem(item)
BidDAO.update(bid);

 此时数据库为

ITEM 表

--------------------------------------

ITEM_ID  |  NAME

---------------------------------------

1             | item1

--------------------------------------

2             | item2

---------------------------------------

BID表

----------------------------------------

BID_ID    | ITEM_ID | AMOUNT

------------------------------------------

1             | 1            | 3000

--------------------------------------------

2             | 2            | 3000

-------------------------------------------

再执行

Item item=ItemDAO.getById(2);
System.out.println(item.getBids().size());

 size为1,从上面可以看出.inverse="true"标志着Item类不维护关联关系(不反映到数据库).而有Bid类进行维护(反映到数据库)

如果需要让Item类来维护关联关系(Bid类必须放弃对关联关系的维护)修改配置文件如下

Item 类配置文件,修改inverse="false"

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 2010-4-13 15:36:15 by Hibernate Tools 3.3.0.GA -->
<hibernate-mapping>
    <class name="com.hib.entity.Item" table="item" catalog="hibernate">
        <id name="itemId" type="java.lang.Integer">
            <column name="ITEM_ID" />
            <generator class="identity" />
        </id>
        <property name="sellerId" type="int">
            <column name="SELLER_ID" not-null="true" />
        </property>
        <property name="name" type="string">
            <column name="NAME" not-null="true" />
        </property>
        <set name="bids" table="bid" inverse="false" lazy="false" fetch="select">
            <key>
                <column name="ITEM_ID" not-null="true" />
            </key>
            <one-to-many class="com.hib.entity.Bid" />
        </set>
    </class>
</hibernate-mapping>

 Bid 类映射文件,修改<many-to-one>元素,添加update="false",insert="false"属性,其意义为,在Bid类的update与insert操作中,忽略<many-to-one>所映射的item字段,不将其反映到数据库中

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 2010-4-13 15:36:15 by Hibernate Tools 3.3.0.GA -->
<hibernate-mapping>
    <class name="com.hib.entity.Bid" table="bid" catalog="hibernate">
        <id name="bidId" type="java.lang.Integer">
            <column name="BID_ID" />
            <generator class="identity" />
        </id>
        <many-to-one name="item" class="com.hib.entity.Item" fetch="select" insert="false" update="false">
            <column name="ITEM_ID" not-null="true" />
        </many-to-one>
        <property name="bidderId" type="java.lang.Integer">
            <column name="BIDDER_ID" />
        </property>
        <property name="amount" type="java.lang.Integer">
            <column name="AMOUNT" />
        </property>
    </class>
</hibernate-mapping>
 

 

 

 

0
0
分享到:
评论

相关推荐

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

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

    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属性的应用场景。 #### 一对多关系概念 一对多关系在数据库设计中非常常见,它指的是一个实体可以与多个其他实体关联...

    NHibernate One-to-Many一对多映射-xxlinux_com

    在数据库世界中,一对多(One-to-Many)关系是一种常见的关联类型,其中一个表(父表)可以与多个其他表(子表)相关联。在NHibernate中,配置这种映射关系对于理解和使用ORM至关重要。 一对多关系意味着一个实体...

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

    本实例将详细讲解如何在Hibernate中实现Many-to-One关系映射,这是一种常见的数据库关联,表示一个实体可以与多个其他实体相关联。 在Many-to-One关系中,通常一个实体(如部门)可以有多个相关实体(如员工),而...

    nhibernate one-to-meny

    在传统的数据库设计中,one-to-many关系通常体现在一个表的一条记录对应另一表的多条记录。例如,一个部门可以有多个员工,这就是部门与员工之间的一对多关系。在NHibernate中,我们需要通过配置映射文件或者使用...

    hibernate inverse和cascade的详细讲解

    - 在`one-to-many`关系中,推荐设置`inverse="true"`,由“many”方来进行关联关系的维护。 - 在`many-to-many`关系中,只设置其中一方`inverse="false"`,或双方都不设置,以避免不必要的更新操作。 通过以上内容...

    Hibernate中cascade与inverse属性详解

    在深入讲解这两个属性之前,我们首先需要理解 Hibernate 中的一些基本概念,如 one-to-many 和 many-to-one 关系、对象的状态以及 Session 缓存。 一、one-to-many 和 many-to-one 关系 在示例中,`class` 表(班级...

    hibernate中one2many映射

    在Java的持久化框架Hibernate中,One-to-Many映射是一种常见的关系映射方式,它表示一个实体(比如一个用户)可以与多个其他实体(比如用户的订单)进行关联。在这个场景下,"用户"是一方,称为"One","订单"是另...

    Deep-Convolutional-Neural-Network-for-Inverse-Problems-in-Imagin

    标题中的"Deep-Convolutional-Neural-Network-for-Inverse-Problems-in-Imaging"指的是一种深度卷积神经网络(Deep Convolutional Neural Network, DCNN)在成像领域的逆问题解决方法。逆问题是图像处理中的一个关键...

    ACTIVITY3-Inverse-Laplace-Transforms_transform_

    在压缩包中的“ACTIVITY3-Inverse-Laplace-Transforms.pdf”文件很可能包含一系列练习题、解答示例以及相关概念的深入解释,帮助学习者掌握逆拉普拉斯变换的技巧和应用。通过这个活动,学生将有机会加深对逆拉普拉斯...

    The-Forward-and-Inverse-Kinematics-of-a-Delta-Robo

    为了验证理论分析的正确性,作者们在Python中实现了运动学算法,并在Unity 3D游戏引擎中构建了一个物理模型来进行仿真。这些实验结果为后续开发更复杂的控制算法提供了测试平台。 #### 结论 本文通过使用共形几何...

    sgowris2-inverse-optimal-control.zip

    标题 "sgowris2-inverse-optimal-control.zip" 暗示了这个压缩包可能包含一个与逆向优化控制相关的MATLAB项目。逆向优化控制是一种在控制理论中常用的方法,它涉及从一个已知的目标状态或性能指标出发,反向设计控制...

    NHibernate三种关系配置示例

    在这个示例中,我们将深入探讨 NHibernate 支持的三种主要关系映射:一对一(One-to-One)、一对多(One-to-Many)和多对多(Many-to-Many),并了解如何通过配置实现它们。 1. 一对一关系(One-to-One) 在一对一...

    Hibernate性能调优

    关联通常包括以下几种类型:单向`one-to-many`关联、双向`one-to-many`关联、`many-to-one`关联以及`one-to-one`关联。 ##### 单向`one-to-many`关联 - **定义**:单向`one-to-many`关联是指一个实体可以拥有多个...

    Inverse-perspective-transformation.rar_perspective_道路边缘检测

    在给定的“Inverse-perspective-transformation.rar”压缩包中,包含了一个用于实现这一变换的工程,对于道路边缘检测具有显著的辅助价值。 首先,我们要理解什么是道路边缘检测。在自动驾驶、交通监控等应用场景中...

    hibernate-one-to-many

    &lt;one-to-many class="com.example.Employee" /&gt; ``` **Employee.hbm.xml** ```xml &lt;many-to-one name="department" class="com.example.Department" column="DEPARTMENT_ID" /&gt; ``` 如果使用注解,上述关系已经...

    Inverse heat conduction ill-posed problems

    Inverse heat conduction ill-posed problems

Global site tag (gtag.js) - Google Analytics