📄 collection-performance.html
字号:
Set可以被看作是Hibernate程序中最普遍的集合类型。 </p><p> <span class="emphasis"><em>这个版本的Hibernate有一个没有写在文档中的功能。<tt class="literal"><idbag></tt>可以对值集合和多对多关联实现bag语义,并且性能比上面任何类型都高!</em></span> </p></div><div class="sect1" lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="collection-performance-mostefficient-2"></a>13.3. Bag和list是反向集合类中效率最高的</h2></div></div><div></div></div><p> 好了,在你把bag扔到水沟里面再踩上一只脚之前,有一种情况下bag(包括list)要比set性能高得多。对于指明了<tt class="literal">inverse="true"</tt>的集合类(比如说,标准的双向一对多关联),我们可以在不初始化(fetch)包元素的情况下就增加新元素!这是因为<tt class="literal">Collection.add()</tt>或者<tt class="literal">Collection.addAll()</tt>对bag或者<tt class="literal">List</tt>总是返回true的(与<tt class="literal">Set</tt>不同)。对于下面的代码来说,速度会快得多。 </p><pre class="programlisting">Parent p = (Parent) sess.load(Parent.class, id);Child c = new Child();c.setParent(p);p.getChildren().add(c); //no need to fetch the collection!sess.flush();</pre></div><div class="sect1" lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="collection-performance-oneshotdelete"></a>13.4. 一次性删除(One shot delete)</h2></div></div><div></div></div><p> 有时候,一个一个的删除集合类中的元素是极度低效的。Hibernate没那么笨,如果你想要把整个集合都删除(比如说调用<tt class="literal">list.clear()</tt>),Hibernate只需要一个<tt class="literal">DELETE</tt>就搞定了。 </p><p> 假设我们在一个长度为20的集合类中新增加了一个元素,然后删除了两个。Hibernate会安排一个<tt class="literal">INSERT</tt>语句和两条<tt class="literal">DELETE</tt>语句(除非集合类是一个bag)。这当然是可以想见的。 </p><p> 但是,如果假设我们删除了18个元素,只剩下2个,然后新增3个。有两种处理方式: </p><div class="itemizedlist"><ul type="disc"><li><p>把这18个元素一个一个的干掉,再新增三个</p></li><li><p>把整个集合类都咔嚓掉(只用一句<tt class="literal">DELETE</tt>语句),然后增加5个元素。 </p></li></ul></div><p> Hibernate还没那么聪明,知道第二种选择可能会比较快。(也许让Hibernate不要这么聪明也是好事,否则可能会引发意外的数据库触发器什么的。) </p><p> 幸运的是,你可以强制使用第二种策略。你需要把原来的整个集合类都取消(取消其引用),然后返回一个新实例化的集合类,只包含需要的元素。有些时候这是非常有用的。 </p></div></div><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="performance.html">Prev</a> </td><td width="20%" align="center"><a accesskey="u" href="index.html">Up</a></td><td width="40%" align="right"> <a accesskey="n" href="query-criteria.html">Next</a></td></tr><tr><td width="40%" align="left" valign="top">Chapter 12. 性能提升(Improving Performance) </td><td width="20%" align="center"><a accesskey="h" href="index.html">Home</a></td><td width="40%" align="right" valign="top"> Chapter 14. 条件查询(Criteria Query)</td></tr></table></div></body></html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -