6.3.3. 双向关联,涉及有序集合类

对于有一端是<list>或者<map>的双向关联,需要加以特别考虑。假若子类中的一个属性映射到索引字段,没问题,我们仍然可以在集合类映射上使用inverse="true"

  1. <class name="Parent">
  2. <id name="id" column="parent_id"/>
  3. ....
  4. <map name="children" inverse="true">
  5. <key column="parent_id"/>
  6. <map-key column="name"
  7. type="string"/>
  8. <one-to-many class="Child"/>
  9. </map>
  10. </class>
  11. <class name="Child">
  12. <id name="id" column="child_id"/>
  13. ....
  14. <property name="name"
  15. not-null="true"/>
  16. <many-to-one name="parent"
  17. class="Parent"
  18. column="parent_id"
  19. not-null="true"/>
  20. </class>

但是,假若子类中没有这样的属性存在,我们不能认为这个关联是真正的双向关联(信息不对称,在关联的一端有一些另外一端没有的信息)。在这种情况下,我们不能使用inverse="true"。我们需要这样用:

  1. <class name="Parent">
  2. <id name="id" column="parent_id"/>
  3. ....
  4. <map name="children">
  5. <key column="parent_id"
  6. not-null="true"/>
  7. <map-key column="name"
  8. type="string"/>
  9. <one-to-many class="Child"/>
  10. </map>
  11. </class>
  12. <class name="Child">
  13. <id name="id" column="child_id"/>
  14. ....
  15. <many-to-one name="parent"
  16. class="Parent"
  17. column="parent_id"
  18. insert="false"
  19. update="false"
  20. not-null="true"/>
  21. </class>

注意在这个映射中,关联中集合类"值"一端负责来更新外键.TODO: Does this really result in some unnecessary update statements?