7.4.1. 一对多(one to many) / 多对一(many to one)

双向多对一关联 是最常见的关联关系。(这也是标准的父/子关联关系。)

  1. <class name="Person">
  2. <id name="id" column="personId">
  3. <generator class="native"/>
  4. </id>
  5. <many-to-one name="address"
  6. column="addressId"
  7. not-null="true"/>
  8. </class>
  9. <class name="Address">
  10. <id name="id" column="addressId">
  11. <generator class="native"/>
  12. </id>
  13. <set name="people" inverse="true">
  14. <key column="addressId"/>
  15. <one-to-many class="Person"/>
  16. </set>
  17. </class>
  1. create table Person ( personId bigint not null primary key, addressId bigint not null )
  2. create table Address ( addressId bigint not null primary key )

如果你使用List(或者其他有序集合类),你需要设置外键对应的key列为 not null,让Hibernate来从集合端管理关联,维护每个元素的索引(通过设置update="false" and insert="false"来对另一端反向操作)。

  1. <class name="Person">
  2. <id name="id"/>
  3. ...
  4. <many-to-one name="address"
  5. column="addressId"
  6. not-null="true"
  7. insert="false"
  8. update="false"/>
  9. </class>
  10. <class name="Address">
  11. <id name="id"/>
  12. ...
  13. <list name="people">
  14. <key column="addressId" not-null="true"/>
  15. <list-index column="peopleIdx"/>
  16. <one-to-many class="Person"/>
  17. </list>
  18. </class>

假若集合映射的&lt;key&gt;元素对应的底层外键字段是NOT NULL的,那么为这一key元素定义not-null="true"是很重要的。不要仅仅为可能的嵌套&lt;column&gt;元素定义not-null="true"&lt;key&gt;元素也是需要的。