Hibernate中的集合映射

我们可以在Hibernate中映射Persistent类的集合元素。你需要从以下类型之一声明Persistent类中的集合类型:

  • 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.srcmini; 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.srcmini.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> 元素用于标识类型。 List和Map是索引集合。
  • < element> 用于定义集合的元素。
如果collection存储字符串对象, 则这是collection的映射。但是, 如果集合存储实体引用(另一个类对象), 则需要定义< one-to-many> 或< many-to-many> 元素。现在, Persistent类将如下所示:
package com.srcmini; 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 com.srcmini; import java.util.List; public class Answer { private int id; private String answer; private String posterName; //getters and setters }

现在, 映射文件将是:
< class name="com.srcmini.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.srcmini.Answer" /> < /list> < /class>

【Hibernate中的集合映射】在此, 列表是通过一对多关系映射的。在这种情况下, 一个问题可能有很多答案。
了解关键要素
key元素用于根据原始身份在联接表中定义外键。默认情况下, 外键元素可以为空。因此, 对于不可为空的外键, 我们需要指定不可为空的属性, 例如:
< key column="qid" not-null="true" > < /key>

关键元素的属性为列, 删除, 属性引用, 非空, 更新和唯一。
< 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个元素之一
  • 元件
  • 组成元素
  • 一对多, 或
  • 多对多
元素和组件元素用于正常值, 例如字符串, 整数等, 而一对多和多对多用于映射实体引用。

    推荐阅读