hibernate映射文件one-to-many元素属性

单向1——N关联关系的持久化类发生了改变,持久化类里需要使用集合,因为1的一端需要访问N的一端,而N的一端降一级和的形式出现:它只是将前边的用于集合映射的<element.../>元素改为<one-to-many.../>

 

属性:

  1. class:指定关联的实体类
  2. not-found:改属性只能是exception或ignore,指定当从记录参照的主表记录不存在时,hibernate如何处理;默认exception

 

单向的1——N关联关系:

只需要在1的实体类一端增加Set属性的setter,getter;

 

无连接表的单向1——N:

eg:

<!-- 映射集合属性,集合元素是其他持久化实体
   没有指定cascade属性 -->

  <set name="addresses">
   <!-- 指定关联的外键列 -->
   <key column="personId"/>
   <!-- 用以映射到关联类属性 -->
   <one-to-many class="Address"/>

  </set>

 

有连接表的单向一对多:

对于有连接表的1——N,不是使用哪个one-to-many 而是使用many-to-many 为了保证当前实体的是 1 的一端,因此要用unique=“true”

     关于many-to-many 属性请参照连接

 

eg:

<!-- 映射集合属性,集合元素是其他持久化实体
   指定连接表的表名-->
  <set name="addresses" table="person_address">
   <!-- 指定连接表中参照本表记录的外键列名 -->
   <key column="person_id" />
    <!-- 使用many-to-many来映射1-N关联,
    增加unique="true" -->

   <many-to-many class="Address"
    unique="true"/>
  </set>

 

双向1——N关联:

 

对于1——N关联,hibernate推荐使用双向关联,而且不要让1的一端控制关联,使用N的一端控制关联关系;

双向的1——N和N——1是完全相同的两种形式;

 

两端都需要增加对关联属性的访问:

  • N的一端增加引用到关联实体的属性;
  • 1的一端增加集合属性;集合元素为关联实体;

eg:

Preson.java

 

//1-N关联关系,使用Set来保存关联实体
 private Set<Address> addresses
  = new HashSet<Address>();

 

Address.java

 

//保留关联实体的person属性

private Person person;

 

Preson.hbm.xml

<!-- 映射集合属性,集合元素是其他持久化实体
   没有指定cascade属性 -->
  <set name="addresses" inverse="true">
   <!-- 指定关联的外键列 -->
   <key column="person_id"/>
   <!-- 用以映射到关联类属性 -->
   <one-to-many class="Address"/>
  </set>

 

Address.hbm.xml

<!-- 使用many-to-one映射N-1关联实体 -->
  <many-to-one name="person"
   column="person_id" not-null="true"/>

 

 

无连接表的双向1——N关联:

  1. N:的一端要增加<many-to-one......./>元素来影射关联属性;
  2. 1:的一端则需要使用<set../>或<bag../>元素来影射关联属性;在<set.../>或<bag.../>元素里需要增加<key.../>子元素映射外键列,并使用<one-to-many.../>子元素影射关联属性;

底层数据库记录了这种1——N关联关系,实际上只需要在N的一端的数据表里增加一个外键列即可,

这里存在一个问题:

     双向映射时<many-to-one.../>元素将用到外键列,

    <set.../>元素里的<key.../>子元素也用来映射外键列;

    其他的都映射在同一列,所以映射文件应该为这两个元素指定的column属性,并让两个column属性值相同;

   通常在多的一端控制关联关系,我们在<set.../>元素中设置  inverse=”true“

 

eg:

Preson.hbm.xml:
<!-- 映射集合属性,集合元素是其他持久化实体
   没有指定cascade属性 -->
  <set name="addresses" inverse="true">
   <!-- 指定关联的外键列 -->
   <key column="person_id"/>
   <!-- 用以映射到关联类属性 -->
   <one-to-many class="Address"/>
  </set>

Address.hbm.xml:
<!-- 使用many-to-one映射N-1关联实体 -->
  <many-to-one name="person"
   column="person_id" not-null="true"/>

 

有连接表的双向1——N关联:

 

有连接表的1——N关联类似于N——N关联

  1. 1:的一端使用集合元素,然后在集合元素中添加<many-to-many../>子元素,盖子元素映射到关联表在<many-to-many../>中使用unique=”true“ ,在set元素里使用key和many-to-many两个元素,他们也映射连接表的两个列;
  2. N:的一端则使用<join ../>元素来强制使用连接表,使用key子元素来影射连接表中的外键,使用many-to-one来映射连接表中的关联实体的外键列;

      保证join中的key子元素的column属性和set里many-to-many元素的column属性相同;

      join里的many-to-one子元素的column属性和set里的key元素的column属性相同;

    两端指定的连接表的Table属性不能省略,且属性值必须相同

 

eg:

Preson.hbm.xml:

<!-- 映射集合属性,集合元素是其他持久化实体
   没有指定cascade属性 -->

  <set name="addresses" inverse="true"
   table="person_address">
   <!-- 指定关联的外键列 -->
   <key column="person_id"/>
   <!-- 用以映射到关联类属性 -->
   <many-to-many class="Address"
    column="address_id" unique="true"/>

  </set>

 

 

Address.hbm.xml:

<!-- 显式使用join元素确定连接表 -->
  <join table="person_address">
   <!-- key映射外键列 -->
   <key column="address_id"/>
   <!-- 使用many-to-one映射N-1关联实体 -->
   <many-to-one name="person"
    column="person_id" not-null="true"/>

  </join>

 

你可能感兴趣的:(xml,Hibernate)