准确理解inverse=true的含义
关系(Relationship)由两方组成,其中被定义了inverse=true的一方表示:“我是反向被控制的一方,我不负责维护关系”,而inverse=false则表示:"我是关系的控制方,拥有者,我会维护关系"。默认情况为inverse=false,即关系的两方都维护和控制关系,这中情况会造成一方重复一遍另一方已经完成的事情,比如更新外键列的值,这是不可取的,需要使用inverse=true来避免。
什么时候使用inverse=true
让我们拿Person有多个Address这一例子来阐述:
Person和Address之间的关系是一对多(one-to-many),即一个Person对应多个Address.
public class Person {
private Integer id;
private Set<Address> addresses;
// setter, getter
Set<Address> getAddresses() { return addresses; }
....
}
public class Address {
private Integer id;
private Person person;
// setter, getter
Person getPerson() { return person; }
.....
}
Person类里面有"Set<Address> getAddresses()" 方法
Address类里面有"Person getPerson()" 方法
如果从现实生活来理解Person和Address这一关系的话,看起来是人可以有多个地址,所以Person应该是关系的拥有者,而Address则是被Person拥有,也即Address应该定义inverse=true,因为Address是被控制的一方,然而实际上不是。
让我们从表结构来思考问题:
PERSON[ id, name, ...]
ADDRESS[ id, person_id, city, street,...]
Person和Address之间的关系是通过Address表中的person_id列来表达出来的,也即Address表包含了关系信息(relational information)。因此,我们很容易得出答案:Address是关系的拥有者,而Person是反向被控制的一方,所以Person需要定义inverse=true。如下所示:
<class name="Person">
<id name="id">...</id>
<set name="addresses" inverse="true">
<key column="person_id"/>
<one-to-many class="Address"/>
</set>
</class>
<class name="Address">
<id name="id">...</id>
<many-to-one name="person" class="Person" />
</class>
总结:
1)通过表结构信息来决定那一方使用inverse=true,哪一方使用inverse=false.
2)如果表包含了关系信息,则该表是关系的拥有者,使用inverse=false.
3)如果表没有包含关系信息,则使用inverse=true.
当然你可以选择记住一条简洁的规则:
总是将inverse=”true”定义在集合变量上
参考文章:
http://tadtech.blogspot.hk/2007/02/hibernate-when-is-inversetrue-and-when.html
http://www.developer.am/documentation/hibernate/?page=inverse_true__explanation
分享到:
相关推荐
<set name="emps" inverse ="true" lazy="true" cascade="none" batch-size="2" fetch="join" > <column name="deptid" /> <one-to-many class="org.wllt.www.po.Emp" /> </hibernate-mapping> ...
3) 当Hibernate根据ID访问数据对象的时候,首先从Session一级缓存中查;查不到,如果配置了二级缓存,那么从二级缓存中查;查不到,再查询数据库,把结果按照ID放入到缓存。 4) 删除、更新、增加数据的时候,同时...
如果在”一“一端维护一对多关联关系,hibernate会发出多余的udpate语句,所以我们一般在多的一端来维护关联关系。 加上inverse="true"这个属性,就可以强制在多的一端维护关系了。
上述实体映射到数据库中的时候对应 Order 实体Bean, 其具有 id, lastUpdate, lastUpdater 三个属性。如果没有@MappedSuperclass 注解,则父类中属性忽略,这是 Order 实体 Bean 只有 id 一个属性。 映射实体Bean的...
11.1.5 使用Hibernate内置映射类型 11.2 客户化映射类型 11.2.1 用客户化映射类型取代Hibernate组件 11.2.2 用UserType映射枚举类型 11.2.3 实现CompositeUserType接口 11.2.4 运行本节范例程序 11.3 ...
11.1.5 使用Hibernate内置映射类型 11.2 客户化映射类型 11.2.1 用客户化映射类型取代Hibernate组件 11.2.2 用UserType映射枚举类型 11.2.3 实现CompositeUserType接口 11.2.4 运行本节范例程序 11.3 ...
11.1.5 使用Hibernate内置映射类型 11.2 客户化映射类型 11.2.1 用客户化映射类型取代Hibernate组件 11.2.2 用UserType映射枚举类型 11.2.3 实现CompositeUserType接口 11.2.4 运行本节范例程序 11.3 ...
11.1.5 使用Hibernate内置映射类型 11.2 客户化映射类型 11.2.1 用客户化映射类型取代Hibernate组件 11.2.2 用UserType映射枚举类型 11.2.3 实现CompositeUserType接口 11.2.4 运行本节范例程序 11.3 ...
inverse="true":让其中一方放弃对关联关系的维护 一般在做双向多对一(一对多)关联关系映射的时候,一般会设置让一的一方放弃对关联关系的维护,以减少不必要的更新语句 一对一: 基于外键的一对一 Wife Husband...
9、hibernate的inverse属性的作用? 13、在DAO中如何体现DAO设计模式? 14、spring+Hibernate中委托方案怎么配置? 15、spring+Hibernate中委托方案怎么配置? 16. hibernate进行多表查询每个表中各取几个字段,也...
9、hibernate的inverse属性的作用? 122 13、在DAO中如何体现DAO设计模式? 123 14、spring+Hibernate中委托方案怎么配置? 123 15、spring+Hibernate中委托方案怎么配置? 123 16. hibernate进行多表查询每个表中各取几...
9、hibernate的inverse属性的作用? 122 13、在DAO中如何体现DAO设计模式? 123 14、spring+Hibernate中委托方案怎么配置? 123 15、spring+Hibernate中委托方案怎么配置? 123 16. hibernate进行多表查询每个表中各取几...
9、hibernate的inverse属性的作用? 122 13、在DAO中如何体现DAO设计模式? 123 14、spring+Hibernate中委托方案怎么配置? 123 15、spring+Hibernate中委托方案怎么配置? 123 16. hibernate进行多表查询每个表中各取几...
9、hibernate的inverse属性的作用? 122 13、在DAO中如何体现DAO设计模式? 123 14、spring+Hibernate中委托方案怎么配置? 123 15、spring+Hibernate中委托方案怎么配置? 123 16. hibernate进行多表查询每个表中各取几...
9、hibernate的inverse属性的作用? 122 13、在DAO中如何体现DAO设计模式? 123 14、spring+Hibernate中委托方案怎么配置? 123 15、spring+Hibernate中委托方案怎么配置? 123 16. hibernate进行多表查询每个表中各取几...
9、hibernate的inverse属性的作用? 122 13、在DAO中如何体现DAO设计模式? 123 14、spring+Hibernate中委托方案怎么配置? 123 15、spring+Hibernate中委托方案怎么配置? 123 16. hibernate进行多表查询每个表中各...
9、hibernate的inverse属性的作用? 134 13、在DAO中如何体现DAO设计模式? 134 14、spring+Hibernate中委托方案怎么配置? 134 15、spring+Hibernate中委托方案怎么配置? 134 16. hibernate进行多表查询每个表中各取几...