?? collections.html
字號:
<html><head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <title>第 7 章 集合类(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="第 6 章 对象/关系数据库映射基础(Basic O/R Mapping)"><link rel="next" href="associations.html" title="第 8 章 关联关系映射"></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">第 7 章 集合类(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="associations.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>第 7 章 集合类(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>7.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> Hibernate要求持久化集合值字段必须声明为接口,比如: </p><pre class="programlisting">public class Product { private String serialNumber; private Set parts = new HashSet(); public Set getParts() { return parts; } void setParts(Set parts) { this.parts = parts; } public String getSerialNumber() { return serialNumber; } void setSerialNumber(String sn) { serialNumber = sn; }}</pre><p> 实际的接口可能是<tt class="literal">java.util.Set</tt>, <tt class="literal">java.util.Collection</tt>, <tt class="literal">java.util.List</tt>, <tt class="literal">java.util.Map</tt>, <tt class="literal">java.util.SortedSet</tt>, <tt class="literal">java.util.SortedMap</tt> 或者...任何你喜欢的类型!("任何你喜欢的类型" 代表你需要编写 <tt class="literal">org.hibernate.usertype.UserCollectionType</tt>的实现.) </p><p> 注意我们是如何用一个<tt class="literal">HashSet</tt>实例来初始化实例变量的.这是用于初始化新创建(尚未持久化)的类实例中集合值属性的最佳方法。当你持久化这个实例时——比如通过调用<tt class="literal">persist()</tt>——Hibernate 会自动把<tt class="literal">HashSet</tt>替换为Hibernate自己的<tt class="literal">Set</tt>实现。观察下面的错误: </p><pre class="programlisting">Cat cat = new DomesticCat();Cat kitten = new DomesticCat();....Set kittens = new HashSet();kittens.add(kitten);cat.setKittens(kittens);session.persist(cat);kittens = cat.getKittens(); //Okay, kittens collection is a Set(HashSet) cat.getKittens(); //Error!</pre><p> 根据不同的接口类型,被Hibernate注射的持久化集合类的表现类似<tt class="literal">HashMap</tt>, <tt class="literal">HashSet</tt>, <tt class="literal">TreeMap</tt>, <tt class="literal">TreeSet</tt> or <tt class="literal">ArrayList</tt>。 </p><p> 集合类实例具有值类型的通常行为。当被持久化对象引用后,他们会自动被持久化,当不再被引用后,自动被删除。假若实例被从一个持久化对象传递到另一个,它的元素可能从一个表转移到另一个表。两个实体不能共享同一个集合类实例的引用。因为底层关系数据库模型的原因,集合值属性无法支持空值语义;Hibernate对空的集合引用和空集合不加区别。 </p><p> 你不需要过多的为此担心。就如同你平时使用普通的Java集合类一样来使用持久化集合类。只是要确认你理解了双向关联的语义(后文讨论)。 </p></div><div class="sect1" lang="zh-cn"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="collections-mapping"></a>7.2. 集合映射( Collection mappings )</h2></div></div><div></div></div><p> 用于映射集合类的Hibernate映射元素取决于接口的类型。比如, <tt class="literal"><set></tt> 元素用来映射<tt class="literal">Set</tt>类型的属性。 </p><pre class="programlisting"><class name="Product"> <id name="serialNumber" column="productSerialNumber"/> <set name="parts"> <key column="productSerialNumber" not-null="true"/> <one-to-many class="Part"/> </set></class></pre><p> 除了<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> fetch="join|select|subselect" <span class="co">(10)</span> batch-size="N" <span class="co">(11)</span> access="field|property|ClassName" <span class="co">(12)</span> optimistic-lock="true|false" <span class="co">(13)</span> node="element-name|." embed-xml="true|false"> <key .... /> <map-key .... /> <element .... /></map></pre><div class="calloutlist"><table border="0" summary="Callout list"><tr><td width="5%" valign="top" align="left">(1)</td><td valign="top" align="left"><p> <tt class="literal">name</tt> 集合属性的名称 </p></td></tr><tr><td width="5%" valign="top" align="left">(2)</td><td valign="top" align="left"><p> <tt class="literal">table</tt> (可选——默认为属性的名称)这个集合表的名称(不能在一对多的关联关系中使用) </p></td></tr><tr><td width="5%" valign="top" align="left">(3)</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">(4)</td><td valign="top" align="left"><p> <tt class="literal">lazy</tt> (可选--默认为true) 可以用来关闭延迟加载,指定一直使用预先抓取(对数组不适用) </p></td></tr><tr><td width="5%" valign="top" align="left">(5)</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">(6)</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">(7)</td><td valign="top" align="left"><p> <tt class="literal">sort</tt>(可选)指定集合的排序顺序, 其可以为自然的(<tt class="literal">natural</tt>)或者给定一个用来比较的类。 </p></td></tr><tr><td width="5%" valign="top" align="left">(8)</td><td valign="top" align="left"><p> <tt class="literal">order-by</tt> (可选, 仅用于jdk1.4) 指定表的字段(一个或几个)再加上asc或者desc(可选), 定义Map,Set和Bag的迭代顺序 </p></td></tr><tr><td width="5%" valign="top" align="left">(9)</td><td valign="top" align="left"><p> <tt class="literal">where</tt> (可选) 指定任意的SQL where条件, 该条件将在重新载入或者删除这个集合时使用(当集合中的数据仅仅是所有可用数据的一个子集时这个条件非常有用) </p></td></tr><tr><td width="5%" valign="top" align="left">(10)</td><td valign="top" align="left"><p> <tt class="literal">fetch</tt> (可选, 默认为<tt class="literal">select</tt>) 用于在外连接抓取、通过后续select抓取和通过后续subselect抓取之间选择。 </p></td></tr><tr><td width="5%" valign="top" align="left">(11)</td><td valign="top" align="left"><p> <tt class="literal">batch-size</tt> (可选, 默认为<tt class="literal">1</tt>) 指定通过延迟加载取得集合实例的批处理块大小("batch size")。 </p></td></tr><tr><td width="5%" valign="top" align="left">(12)</td><td valign="top" align="left"><p> <tt class="literal">access</tt>(可选-默认为属性property):Hibernate取得属性值时使用的策略 </p></td></tr><tr><td width="5%" valign="top" align="left">(12)</td><td valign="top" align="left"><p> <tt class="literal">乐观锁</tt> (可选 - 默认为 <tt class="literal">true</tt>): 对集合的状态的改变会是否导致其所属的实体的版本增长。 (对一对多关联来说,关闭这个属性常常是有理的) </p></td></tr></table></div></div><div class="sect2" lang="zh-cn"><div class="titlepage"><div><div><h3 class="title"><a name="collections-foreignkeys"></a>7.2.1. 集合外键(Collection foreign keys)</h3></div></div><div></div></div><p> 集合实例在数据库中依靠持有集合的实体的外键加以辨别。此外键作为<span class="emphasis"><em>集合关键字段(collection key column)</em></span>(或多个字段)加以引用。集合关键字段通过<tt class="literal"><key></tt> 元素映射。 </p><p>
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -