📄 collections.html
字号:
<html><head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <title>Chapter 6. 集合类(Collections)</title><link rel="stylesheet" href="../styles/html.css" type="text/css"><meta name="generator" content="DocBook XSL Stylesheets V1.60.1"><link rel="home" href="index.html" title="HIBERNATE - 符合Java习惯的关系数据库持久化"><link rel="up" href="index.html" title="HIBERNATE - 符合Java习惯的关系数据库持久化"><link rel="previous" href="or-mapping.html" title="Chapter 5. O/R Mapping基础"><link rel="next" href="components.html" title="Chapter 7. 组件(Components)"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">Chapter 6. 集合类(Collections)</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="or-mapping.html">Prev</a> </td><th width="60%" align="center"> </th><td width="20%" align="right"> <a accesskey="n" href="components.html">Next</a></td></tr></table><hr></div><div class="chapter" lang="en"><div class="titlepage"><div><div><h2 class="title"><a name="collections"></a>Chapter 6. 集合类(Collections)</h2></div></div><div></div></div><div class="sect1" lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="collections-s1-1"></a>6.1. 持久化集合类(Persistent Collections)</h2></div></div><div></div></div><p> (译者注:在阅读本章的时候,以后整个手册的阅读过程中,我们都会面临一个名词方面的问题,那就是“集合”。"Collections"和"Set"在中文里对应都被翻译为“集合”,但是他们的含义很不一样。Collections是一个超集,Set是其中的一种。大部分情况下,本译稿中泛指的未加英文注明的“集合”,都应当理解为“Collections”。在有些二者同时出现,可能造成混淆的地方,我们用“集合类”来特指“Collecions”,“集合(Set)”来指"Set",一般都会在后面的括号中给出英文。希望大家在阅读时联系上下文理解,不要造成误解。 与此同时,“元素”一词对应的英文“element”,也有两个不同的含义。其一为集合的元素,是内存中的一个变量;另一含义则是XML文档中的一个标签所代表的元素。也请注意区别。 本章中,特别是后半部分是需要反复阅读才能理解清楚的。如果遇到任何疑问,请记住,英文版本的reference是惟一标准的参考资料。) </p><p> 这部分不包含大量的Java代码例子。我们假定你已经了解如何使用Java自身的集合类框架(Java's collections framework)。 其实如果是这样, 这里就真的没有什么东西需要学习了... 用一句话来做个总结,你就用你已经掌握的知识来使用它们吧,不用为了适应Hibernate而作出改变. </p><p> Hibernate可以持久化以下java集合的实例, 包括<tt class="literal">java.util.Map</tt>, <tt class="literal">java.util.Set</tt>, <tt class="literal">java.util.SortedMap</tt>, <tt class="literal">java.util.SortedSet</tt>, <tt class="literal">java.util.List</tt>, 和任何持久实体或值的数组。类型为<tt class="literal">java.util.Collection</tt>或者<tt class="literal">java.util.List</tt>的属性还可以使用"bag"语义来持久。 </p><p> 警告:用于持久化的集合,除了集合接口外,不能保留任何实现这些接口的类所附加的语义(例如:<tt class="literal">LinkedHashSet</tt>带来的迭代顺序)。所有的持久化集合,实际上都各自按照 <tt class="literal">HashMap</tt>, <tt class="literal">HashSet</tt>, <tt class="literal">TreeMap</tt>, <tt class="literal">TreeSet</tt> 和 <tt class="literal">ArrayList</tt> 的语义直接工作。更深入地说,对于一个包含集合的属性来说,必须把Java类型定义为接口(也就是<tt class="literal">Map</tt>, <tt class="literal">Set</tt> 或者<tt class="literal">List</tt>等),而绝不能是<tt class="literal">HashMap</tt>, <tt class="literal">TreeSet</tt> 或者 <tt class="literal">ArrayList</tt>。存在这个限制的原因是,在你不知道的时候,Hibernate暗中把你的<tt class="literal">Map</tt>, <tt class="literal">Set</tt> 和 <tt class="literal">List</tt> 的实例替换成了它自己的关于<tt class="literal">Map</tt>, <tt class="literal">Set</tt> 或者 <tt class="literal">List</tt> 的实现。(所以在你的程序中,谨慎使用<tt class="literal">==</tt>操作符。)(译者说明: 为了提高性能等方面的原因,在Hibernate中实现了几乎所有的Java集合的接口 。) </p><pre class="programlisting">Cat cat = new DomesticCat();Cat kitten = new DomesticCat();....Set kittens = new HashSet();kittens.add(kitten);cat.setKittens(kittens);session.save(cat);kittens = cat.getKittens(); //Okay, kittens collection is a Set(HashSet) cat.getKittens(); //Error!</pre><p> 集合遵从对值类型的通常规则:不能共享引用, 与其包含的实体共存亡。由于存在底层的关联模型,集合不支持空值语义;并且hibernate不会区分一个null的集合引用和一个不存在元素的空集合。 </p><p> 集合实例在数据库中根据指向对应实体的外键而得到区别。这个外键被称为<span class="emphasis"><em>集合的关键字</em></span>。在Hibernate配置文件中使用<tt class="literal"><key></tt> 元素来映射这个集合的关键字。 </p><p> 集合可以包含几乎所有的Hibernate类型, 包括所有的基本类型, 自定义类型,实体类型和组件。集合不能包含其他集合。这些被包含的元素的类型被称为<span class="emphasis"><em>集合元素类型</em></span>。集合的元素在Hibernate中被映射为<tt class="literal"><element></tt>, <tt class="literal"><composite-element></tt>, <tt class="literal"><one-to-many></tt>, <tt class="literal"><many-to-many></tt> 或者 <tt class="literal"><many-to-any></tt>。 </p><p> 除了<tt class="literal">Set</tt>和<tt class="literal">Bag</tt>之外的所有集合类型都有一个<span class="emphasis"><em>索引(index)</em></span>字段,这个字段映射到一个数组或者<tt class="literal">List</tt>的索引或者<tt class="literal">Map</tt>的key。Map的索引的类型可以是任何基本类型, 实体类型或者甚至是一个组合类型(但不能是一个集合类型)。数组和list的索引肯定是整型,<tt class="literal">integer</tt>。在Hibernate配置文件中使用 <tt class="literal"><index></tt>, <tt class="literal"><index-many-to-many></tt>, <tt class="literal"><composite-index></tt> 或者 <tt class="literal"><index-many-to-any></tt>等元素来映射索引。 </p><p> 集合类可以产生相当多种类的映射,涵盖了很多通常的关系模型。我们建议你练习使用schema生成工具, 以便对如何把不同的映射定义转换为数据库表有一个感性认识。 </p></div><div class="sect1" lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="collections-s1-3"></a>6.2. 映射集合(Mapping a Collection)</h2></div></div><div></div></div><p> 在Hibernate配置文件中使用<tt class="literal"><set></tt>, <tt class="literal"><list></tt>, <tt class="literal"><map></tt>, <tt class="literal"><bag></tt>, <tt class="literal"><array></tt> 和 <tt class="literal"><primitive-array></tt>等元素来定义集合,而<tt class="literal"><map></tt>是最典型的一个。 </p><div class="programlistingco"><pre class="programlisting"><map name="propertyName" <span class="co"><img src="../images/callouts/1.png" alt="(1)"></span> table="table_name" <span class="co"><img src="../images/callouts/2.png" alt="(2)"></span> schema="schema_name" <span class="co"><img src="../images/callouts/3.png" alt="(3)"></span> lazy="true|false" <span class="co"><img src="../images/callouts/4.png" alt="(4)"></span> inverse="true|false" <span class="co"><img src="../images/callouts/5.png" alt="(5)"></span> cascade="all|none|save-update|delete|all-delete-orphan" <span class="co"><img src="../images/callouts/6.png" alt="(6)"></span> sort="unsorted|natural|comparatorClass" <span class="co"><img src="../images/callouts/7.png" alt="(7)"></span> order-by="column_name asc|desc" <span class="co"><img src="../images/callouts/8.png" alt="(8)"></span> where="arbitrary sql where condition" <span class="co"><img src="../images/callouts/9.png" alt="(9)"></span> outer-join="true|false|auto" <span class="co"><img src="../images/callouts/10.png" alt="(10)"></span> batch-size="N" <span class="co">(11)</span> access="field|property|ClassName" <span class="co">(12)</span>> <key .... /> <index .... /> <element .... /></map></pre><div class="calloutlist"><table border="0" summary="Callout list"><tr><td width="5%" valign="top" align="left"><img src="../images/callouts/1.png" alt="1" border="0"></td><td valign="top" align="left"><p> <tt class="literal">name</tt> 集合属性的名称 </p></td></tr><tr><td width="5%" valign="top" align="left"><img src="../images/callouts/2.png" alt="2" border="0"></td><td valign="top" align="left"><p> <tt class="literal">table</tt> (可选——默认为属性的名称)这个集合表的名称(不能在一对多的关联关系中使用) </p></td></tr><tr><td width="5%" valign="top" align="left"><img src="../images/callouts/3.png" alt="3" border="0"></td><td valign="top" align="left"><p> <tt class="literal">schema</tt> (可选) 表的schema的名称, 他将覆盖在根元素中定义的schema </p></td></tr><tr><td width="5%" valign="top" align="left"><img src="../images/callouts/4.png" alt="4" border="0"></td><td valign="top" align="left"><p> <tt class="literal">lazy</tt> (可选——默认为<tt class="literal">false</tt>) lazy(可选--默认为false) 允许延迟加载(lazy initialization )(不能在数组中使用) </p></td></tr><tr><td width="5%" valign="top" align="left"><img src="../images/callouts/5.png" alt="5" border="0"></td><td valign="top" align="left"><p> <tt class="literal">inverse</tt> (可选——默认为<tt class="literal">false</tt>) 标记这个集合作为双向关联关系中的方向一端。 </p></td></tr><tr><td width="5%" valign="top" align="left"><img src="../images/callouts/6.png" alt="6" border="0"></td><td valign="top" align="left"><p> <tt class="literal">cascade</tt> (可选——默认为<tt class="literal">none</tt>) 让操作级联到子实体 </p></td></tr><tr><td width="5%" valign="top" align="left"><img src="../images/callouts/7.png" alt="7" border="0"></td><td valign="top" align="left"><p>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -