在Hibernate中,我们可以映射持久化类的集合元素。需要在持久化类中声明集合的类型,可以选择以下类型之一:

  • java.util.List
  • java.util.Set
  • java.util.SortedSet
  • java.util.Map
  • java.util.SortedMap
  • java.util.Collection
  • 或者实现org.hibernate.usertype.UserCollectionType接口

持久化类应按如下方式定义集合元素:

package cn.javatiku;  
  
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>。让我们看看如何为上述类实现list:

<class name="cn.javatiku.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>  

在list中使用了三个子元素:

  • <key>元素用于定义基于Question类标识符的此表中的外键。
  • <index>元素用于标识类型。List和Map是索引集合。
  • <element>用于定义集合的元素。

这是当集合存储字符串对象时的映射。但如果集合存储实体引用(另一个类的对象),则需要定义<one-to-many><many-to-many>元素。此时,持久化类将如下所示:

package cn.javatiku;  
  
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  
  
}  
package cn.javatiku;  
import java.util.List;  
public class Answer {  
private int id;  
private String answer;  
private String posterName;  
//getters and setters  
}  

现在的映射文件如下:

<class name="cn.javatiku.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="cn.javatiku.Answer" />  
          </list>  
            
          </class>  

在此场景中,一个问题可以有多个答案。

理解key元素

key元素用于定义基于原始标识的连接表中的外键。默认情况下,外键元素是可为空的。因此,对于非空外键,我们需要指定not-null属性,如下所示:

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

key元素的属性有column、on-delete、property-ref、not-null、update和unique。

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

索引集合

集合元素可以分为两类:

  • 索引集合
  • 非索引集合

List和Map集合是索引集合,而set和bag集合是非索引集合。这里,索引集合意味着List和Map需要一个额外的元素<index>

集合元素

集合元素可以是值或实体引用(另一个类对象)。我们可以使用以下4种元素之一:

  • element
  • component-element
  • one-to-many
  • many-to-many

element和component-element用于普通值,如string、int等,而one-to-many和many-to-many用于映射实体引用。

集合映射的后续主题

  • 映射List:在这个例子中,我们将映射List元素。
  • 映射Bag:在这个例子中,我们将使用Hibernate框架的bag集合。
  • 映射Set:这里,我们将映射集合中的set元素。

标签: Hibernate, Hibernate教程, Hibernate框架, Hibernate框架设计, Hibernate初级教程, Hibernate框架用法, Hibernate指南, Hibernate入门, Hibernate中级教程, Hibernate进阶教程, Hibernate高级教程, Hibernate下载