Hibernate集合對映


可以在Hibernate中對映持久類的集合元素。 您需要從以下型別之一宣告持久類中的集合型別:

  • java.util.List
  • java.util.Set
  • java.util.SortedSet
  • java.util.Map
  • java.util.SortedMap
  • java.util.Collection
  • 或寫入org.hibernate.usertype.UserCollectionType的實現

持久化類應該像這樣定義為collection元素,如下程式碼範例 -

package com.yiibai;  

import java.util.List;  

public class Question {  
private int id;  
private String qname;  
private List<String> answers;//List can be of any type  

//getters and setters  

}

對映檔案中的對映集合

有很多<class>元素的子元素用來對映集合。 它們是<list><bag><set><map>。 下面來看看看如何實現上述類的列表:

<class name="com.yiibai.Question" table="q100">  
<id name="id">  
<generator class="increment"></generator>  
</id>  
<property name="qname"></property>  

<list name="answers" table="ans100">  
<key column="qid"></key>  
<index column="type"></index>  
<element column="answer" type="string"></element>  
</list>  

</class>

列表中使用了三個子元素:

  • <key>元素用於根據Question類識別符號定義該表中的外來鍵。
  • <index>元素用於標識型別。ListMap是索引集合。
  • <element>用於定義集合的元素。

這是集合儲存字串物件的對映。 但是如果集合儲存實體參照(另一個類物件),我們需要定義<one-to-many><many-to-many>元素。 現在,持久化類將如下所示:

package com.yiibai;  

import java.util.List;  

public class Question {  
private int id;  
private String qname;  
private List<Answer> answers;//Here, List stores the objects of Answer class  

//getters and setters  

}

Answer類程式碼範例如下 -

package com.yiibai;  
import java.util.List;  
public class Answer {  
private int id;  
private String answer;  
private String posterName;  
//getters and setters  
}

現在對映檔案將是:

<class name="com.yiibai.Question" table="q100">  
    <id name="id">  
        <generator class="increment"></generator>  
    </id>  
    <property name="qname"></property>  

    <list name="answers" >  
        <key column="qid"></key>  
        <index column="type"></index>  
        <one-to-many class="com.yiibai.Answer" />  
    </list>  

</class>

這裡,列表被一對多關係對映。 在這種情況下,一個問題可以有很多答案。

key元素

key元素用於根據原始身份在連線的表中定義外來鍵。 外來鍵元素預設為空。 所以對於不可空的外來鍵,需要指定not-null屬性,如:

<key column="qid" not-null="true" ></key>

key元素的屬性是columnon-deleteproperty-refnot-nullupdateunique

<key  
    column="columnname"  
    on-delete="noaction|cascade"  
    not-null="true|false"  
    property-ref="propertyName"  
    update="true|false"  
    unique="true|false"  
/>

索引集合

集合元素可以分為兩種形式:

  • 索引,和
  • 非索引

ListMap集合都可被索引,而集合和行集合是非索引的。 這裡,索引收集 ListMap需要一個額外的元素<index>

集合元素

集合元素可以具有值或實體參照(另一個類物件)。可以使用4個元素之一。

  • element
  • component-element
  • one-to-many, 或
  • many-to-many

elementcomponent-element 用於正常值,例如stringint等,而一對多和多對多用於對映實體參照。

在接下來的文章,我們將學習集合對映。

對映列表(List)
在這個例子中,我們將對映List元素。

對映Bag
在這個例子中,我們將使用Hibernate框架的包集合。

對映集合(Set)
在這裡,我們將對映Set的集合元素。