`
younglibin
  • 浏览: 1195000 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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>

 

1
0
分享到:
评论

相关推荐

    HibernateAPI中文版.chm

    共有组合键属性的多对多(Many-to-many with shared composite key attribute) 23.4.4. Content based discrimination 23.4.5. Associations on alternate keys 24. 最佳实践(Best Practices) 表格清单 1. ...

    hibernate3.2中文文档(chm格式)

    共有组合键属性的多对多(Many-to-many with shared composite key attribute) 23.4.4. Content based discrimination 23.4.5. Associations on alternate keys 24. 最佳实践(Best Practices) 表格清单 1. ...

    Hibernate_3.2.0_符合Java习惯的关系数据库持久化

    共有组合键属性的多对多(Many-to-many with shared composite key attribute) 23.4.4. Content based discrimination 23.4.5. Associations on alternate keys 24. 最佳实践(Best Practices) 表格清单 1. ...

    Hibernate+中文文档

    共有组合键属性的多对多(Many-to-many with shared composite key attribute) 23.4.4. Content based discrimination 23.4.5. Associations on alternate keys 24. 最佳实践(Best Practices) 表格清单 1. ...

    Hibernate中文API大全

    组合元素有个特别的用法是它可以包含一个&lt;many-to-one&gt;元素。类似这样的映射允许你将一个many-to-many关联表映射为组合元素的集合。(A mapping like this allows you to map extra columns of a many-to-many ...

    Hibernate 中文 html 帮助文档

    目录 ... 共有组合键属性的多对多(Many-to-many with shared composite key attribute) 23.4.4. Content based discrimination 23.4.5. Associations on alternate keys 24. 最佳实践(Best Practices)

    Hibernate中文详细学习文档

    共有组合键属性的多对多(Many-to-many with shared composite key attribute) 23.4.4. Content based discrimination 23.4.5. Associations on alternate keys 24. 最佳实践(Best Practices) 等等。。。

    最全Hibernate 参考文档

    6.2.5. 一对多关联(One-to-many Associations) 6.3. 高级集合映射(Advanced collection mappings) 6.3.1. 有序集合(Sorted collections) 6.3.2. 双向关联(Bidirectional associations) 6.3.3. 三重关联...

    hibernate 体系结构与配置 参考文档(html)

    一对多关联(One-to-many Associations) 6.3. 高级集合映射(Advanced collection mappings) 6.3.1. 有序集合(Sorted collections) 6.3.2. 双向关联(Bidirectional associations) 6.3.3. 双向关联,涉及...

    Hibernate教程

    22.2. 双向的一对多关系(Bidirectional one-to-many) 22.3. 级联生命周期(Cascading lifecycle) 22.4. 级联与未保存值(Cascades and unsaved-value) 22.5. 结论 23. 示例:Weblog 应用程序 23.1. 持久化类 ...

    hibernate 框架详解

    一对多关联(One-to-many Associations) 7.3. 高级集合映射(Advanced collection mappings) 7.3.1. 有序集合(Sorted collections) 7.3.2. 双向关联(Bidirectional associations) 7.3.3. 三重关联...

    hibernate3.04中文文档.chm

    22.2. 双向的一对多关系(Bidirectional one-to-many) 22.3. 级联生命周期(Cascading lifecycle) 22.4. 级联与未保存值(Cascades and unsaved-value) 22.5. 结论 23. 示例:Weblog 应用程序 23.1. 持久化类 ...

    Hibernate3+中文参考文档

    6.2.5. 一对多关联(One-to-many Associations) 6.3. 高级集合映射(Advanced collection mappings) 6.3.1. 有序集合(Sorted collections) 6.3.2. 双向关联(Bidirectional associations) 6.3.3. 三重关联...

    Hibernate_Annotation关联映射

    多对一(Many-to-One) 使用@ManyToOne批注来实现多对一关联。 @ManyToOne批注有一个名为targetEntity的参数,该参数定义了目标实体名,通常不需要定义该参数,因为在大部分情况下默认值(表示关联关系的属性类型)就...

    Hibernate3的帮助文档

    7.2.5. 一对多关联(One-to-many Associations) 7.3. 高级集合映射(Advanced collection mappings) 7.3.1. 有序集合(Sorted collections) 7.3.2. 双向关联(Bidirectional associations) 7.3.3. 三重关联...

    Hibernate参考文档

    6.2.5. 一对多关联(One-to-many Associations) 6.3. 高级集合映射(Advanced collection mappings) 6.3.1. 有序集合(Sorted collections) 6.3.2. 双向关联(Bidirectional associations) 6.3.3. 双向关联,...

    hibernate 3中的缓存小结

    hibernate 3中的缓存小结 2.2. 一级缓存的管理: 当应用程序调用Session的save()、update()、savaeOrUpdate()、get()或... &lt;one-to-many class="org.qiujy.domain.cachedemo.Product"/&gt; &lt;/hibernate-mapping&gt;

    精通hibernate:对象持久化技术孙卫琴第二版part2

    7.1.1 [many-to-one]元素的not-null属性 153 7.1.2 级联保存和更新 155 7.2 映射一对多双向关联关系 156 7.2.1 [set]元素的inverse属性 161 7.2.2 级联删除 163 7.2.3 父子关系 164 7.3 映射一对多双向自身...

    精通Hibernate:对象持久化技术第二版part3

    7.1.1 [many-to-one]元素的not-null属性 153 7.1.2 级联保存和更新 155 7.2 映射一对多双向关联关系 156 7.2.1 [set]元素的inverse属性 161 7.2.2 级联删除 163 7.2.3 父子关系 164 7.3 映射一对多双向自身...

    hibernate_reference中文文档.pdf

    1.1.3. 映射文件 ........................................................ 4 1.1.4. Hibernate 配置 .................................................. 7 1.1.5. 用 Maven 构建 ................................

Global site tag (gtag.js) - Google Analytics