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

N-----N

column(可选): 这个元素的外键关键字段名
 
 formula (可选): 用于计算元素外键值的SQL公式.
 
 class (必需): 关联类的名称
 
 outer-join (可选 - 默认为auto): 在Hibernate系统参数中hibernate.use_outer_join被打开的情况下,该参数用来允许使用outer join来载入此集合的数据。
 
 为此关联打开外连接抓取或者后续select抓取。这是特殊情况;对于一个实体及其指向其他实体的多对多关联进全预先抓取(使用一条单独的SELECT),你不仅需要对集合自身打开join,也需要对<many-to-many>这个内嵌元素打开此属性。
 
 对外键字段允许DDL生成的时候生成一个惟一约束。这使关联变成了一个高效的一对多关联。(此句存疑:原文为This makes the association multiplicity effectively one to many.)
 
 not-found (可选 - 默认为 exception): 指明引用的外键中缺少某些行该如何处理: ignore 会把缺失的行作为一个空引用处理。
 
 entity-name (可选): 被关联的类的实体名,作为class的替代。
 
 property-ref: (可选) 被关联到此外键(foreign key)的类中的对应属性的名字。若未指定,使用被关联类的主键。

 

 

单向N——N关联:

N——N关联必须使用连接表,N——N关联与有表连接的1——N关联非常相似,只要去掉many-to-many 元素的unique=“true”属性即可;

 

eg:

<!-- 映射集合属性,集合元素是其他持久化实体
   指定连接表的表名-->

  <set name="addresses" table="person_address">
   <!-- 指定连接表中参照本表记录的外键列名 -->
   <key column="person_id" />
    <!-- 使用many-to-many来映射1-N关联,
    增加unique="true" -->

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

 

双向N——N关联:

 

双向N——N关联需要两端都使用Set集合属性,两端都增加对集合属性的访问,双向N——N关联没有太多选择只能使用连接表建立两个实体之间的关联关系;

Preson.java

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

Address.java:

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

 

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

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

  </set>

Address.hbm.xml:

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

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

  </set>

 

双向N——N关联的两边都需要指定连接表的表名,外键列的列名:

两个set元素table必须指定,并且必须相同,

set元素的两个字元素:key和many-to-many都必须指定column属性,key和many-to-many分别制定本持久化类,关联类在连接表中的外键列名,因此两边的key与many-to-many的column属性交叉相同,

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