初学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>
分享到:
相关推荐
"Hibernate one-to-many / many-to-one关系映射"是两个基本的关系类型,用于表示实体间的关联。在这个主题中,我们将深入探讨这两种关系映射的原理、配置和实际应用。 一、一对一(one-to-one)与一对多(one-to-...
而`Classes.hbm.xml`则使用了`<set>`和`<one-to-many>`元素,表示班级对象包含一个学生集合,且每个学生都有对应的`id`。 在处理这种关联关系时,需要注意的是效率问题。由于Hibernate默认会在"一"端更新关联关系,...
本文将深入探讨Hibernate中一对多(One-to-Many)关系的处理方式,特别是通过外键映射和inverse属性的应用场景。 #### 一对多关系概念 一对多关系在数据库设计中非常常见,它指的是一个实体可以与多个其他实体关联...
在数据库世界中,一对多(One-to-Many)关系是一种常见的关联类型,其中一个表(父表)可以与多个其他表(子表)相关联。在NHibernate中,配置这种映射关系对于理解和使用ORM至关重要。 一对多关系意味着一个实体...
本实例将详细讲解如何在Hibernate中实现Many-to-One关系映射,这是一种常见的数据库关联,表示一个实体可以与多个其他实体相关联。 在Many-to-One关系中,通常一个实体(如部门)可以有多个相关实体(如员工),而...
在传统的数据库设计中,one-to-many关系通常体现在一个表的一条记录对应另一表的多条记录。例如,一个部门可以有多个员工,这就是部门与员工之间的一对多关系。在NHibernate中,我们需要通过配置映射文件或者使用...
- 在`one-to-many`关系中,推荐设置`inverse="true"`,由“many”方来进行关联关系的维护。 - 在`many-to-many`关系中,只设置其中一方`inverse="false"`,或双方都不设置,以避免不必要的更新操作。 通过以上内容...
在深入讲解这两个属性之前,我们首先需要理解 Hibernate 中的一些基本概念,如 one-to-many 和 many-to-one 关系、对象的状态以及 Session 缓存。 一、one-to-many 和 many-to-one 关系 在示例中,`class` 表(班级...
在Java的持久化框架Hibernate中,One-to-Many映射是一种常见的关系映射方式,它表示一个实体(比如一个用户)可以与多个其他实体(比如用户的订单)进行关联。在这个场景下,"用户"是一方,称为"One","订单"是另...
标题中的"Deep-Convolutional-Neural-Network-for-Inverse-Problems-in-Imaging"指的是一种深度卷积神经网络(Deep Convolutional Neural Network, DCNN)在成像领域的逆问题解决方法。逆问题是图像处理中的一个关键...
在压缩包中的“ACTIVITY3-Inverse-Laplace-Transforms.pdf”文件很可能包含一系列练习题、解答示例以及相关概念的深入解释,帮助学习者掌握逆拉普拉斯变换的技巧和应用。通过这个活动,学生将有机会加深对逆拉普拉斯...
为了验证理论分析的正确性,作者们在Python中实现了运动学算法,并在Unity 3D游戏引擎中构建了一个物理模型来进行仿真。这些实验结果为后续开发更复杂的控制算法提供了测试平台。 #### 结论 本文通过使用共形几何...
标题 "sgowris2-inverse-optimal-control.zip" 暗示了这个压缩包可能包含一个与逆向优化控制相关的MATLAB项目。逆向优化控制是一种在控制理论中常用的方法,它涉及从一个已知的目标状态或性能指标出发,反向设计控制...
在这个示例中,我们将深入探讨 NHibernate 支持的三种主要关系映射:一对一(One-to-One)、一对多(One-to-Many)和多对多(Many-to-Many),并了解如何通过配置实现它们。 1. 一对一关系(One-to-One) 在一对一...
关联通常包括以下几种类型:单向`one-to-many`关联、双向`one-to-many`关联、`many-to-one`关联以及`one-to-one`关联。 ##### 单向`one-to-many`关联 - **定义**:单向`one-to-many`关联是指一个实体可以拥有多个...
在给定的“Inverse-perspective-transformation.rar”压缩包中,包含了一个用于实现这一变换的工程,对于道路边缘检测具有显著的辅助价值。 首先,我们要理解什么是道路边缘检测。在自动驾驶、交通监控等应用场景中...
<one-to-many class="com.example.Employee" /> ``` **Employee.hbm.xml** ```xml <many-to-one name="department" class="com.example.Department" column="DEPARTMENT_ID" /> ``` 如果使用注解,上述关系已经...
Inverse heat conduction ill-posed problems