📄 collections.html
字号:
<html><head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <title>第 6 章 集合类(Collections)映射</title><link rel="stylesheet" href="../shared/css/html.css" type="text/css"><meta name="generator" content="DocBook XSL Stylesheets V1.65.1"><link rel="home" href="index.html" title="HIBERNATE - 符合Java习惯的关系数据库持久化"><link rel="up" href="index.html" title="HIBERNATE - 符合Java习惯的关系数据库持久化"><link rel="previous" href="mapping.html" title="第 5 章 O/R Mapping基础"><link rel="next" href="components.html" title="第 7 章 组件(Component)映射"></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">第 6 章 集合类(Collections)映射</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="mapping.html">上一页</a> </td><th width="60%" align="center"> </th><td width="20%" align="right"> <a accesskey="n" href="components.html">下一页</a></td></tr></table><hr></div><div class="chapter" lang="zh-cn"><div class="titlepage"><div><div><h2 class="title"><a name="collections"></a>第 6 章 集合类(Collections)映射</h2></div></div><div></div></div><div class="sect1" lang="zh-cn"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="collections-persistent"></a>6.1. 持久化集合类(Persistent Collections)</h2></div></div><div></div></div><p><a name="collections-persistent-translate-comment"></a> (译者注:在阅读本章的时候,以后整个手册的阅读过程中,我们都会面临一个名词方面的问题,那就是“集合”。"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> 集合类在被一个持久化对象引用的时候,会自动持久化,当不再被引用时将会自动删除。如果一个集合被贝从一个持久化对象传递到另一个,它的元素可讷讷个会从一个表转移到另一个表。你应该不需要对此特别关心。就如同你使用普通的Java集合类一样使用Hibernate的集合类,但是你需要确信使用前你理解了双向关联的语义(后面会讨论)。 </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="zh-cn"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="collections-mapping"></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">(1)</span> table="table_name" <span class="co">(2)</span> schema="schema_name" <span class="co">(3)</span> lazy="true|false" <span class="co">(4)</span> inverse="true|false" <span class="co">(5)</span> cascade="all|none|save-update|delete|all-delete-orphan" <span class="co">(6)</span> sort="unsorted|natural|comparatorClass" <span class="co">(7)</span> order-by="column_name asc|desc" <span class="co">(8)</span> where="arbitrary sql where condition" <span class="co">(9)</span> outer-join="true|false|auto" <span class="co">(10)</span> batch-size="N" <span class="co">(11)</span> access="field|property|ClassName" <span class="co">(12)</span>> <key .... /> <index .... /> <element .... />
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -