﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-Jerome Kwok〖旧日的足迹〗-文章分类-Hibernate</title><link>http://www.blogjava.net/JeromeKwok/category/35025.html</link><description>仁者不忧，知者不惑，勇者不惧</description><language>zh-cn</language><lastBuildDate>Mon, 08 Feb 2010 18:05:22 GMT</lastBuildDate><pubDate>Mon, 08 Feb 2010 18:05:22 GMT</pubDate><ttl>60</ttl><item><title>Hibernate 实现分页查询</title><link>http://www.blogjava.net/JeromeKwok/articles/311963.html</link><dc:creator>Jerome Kwok</dc:creator><author>Jerome Kwok</author><pubDate>Thu, 04 Feb 2010 07:05:00 GMT</pubDate><guid>http://www.blogjava.net/JeromeKwok/articles/311963.html</guid><wfw:comment>http://www.blogjava.net/JeromeKwok/comments/311963.html</wfw:comment><comments>http://www.blogjava.net/JeromeKwok/articles/311963.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/JeromeKwok/comments/commentRss/311963.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/JeromeKwok/services/trackbacks/311963.html</trackback:ping><description><![CDATA[<p><span style="font-family: Courier"><span style="font-size: 12pt"><span style="font-size: 10pt"><span style="font-size: 12pt"><span style="font-size: 12pt"><span style="font-family: Courier"><span style="font-family: Courier"><span style="font-family: Courier"><span style="font-size: 12pt">Hibernate <span style="font-family: Courier">可以实现分页查询，</span></span></span></span></span></span></span></span></span></span></p>
<p><span style="font-family: Courier"><span style="font-size: 12pt"><span style="font-size: 10pt"><span style="font-size: 12pt"><span style="font-size: 12pt"><span style="font-family: Courier"><span style="font-family: Courier"><span style="font-family: Courier"><span style="font-size: 12pt">例如:从第2万条开始取出100条记录</span></span></span></span></span></span></span></span></span></p>
<p><span style="font-family: Courier"><span style="font-size: 12pt"><span style="font-size: 10pt"><span style="font-size: 12pt"><span style="font-size: 12pt"><span style="font-family: Courier"><span style="font-family: Courier"><span style="font-size: 12pt">Query q = session.createQuery("from Cat as c");<br />
q.setFirstResult(20000);<br />
q.setMaxResults(100);<br />
List l = q.list();</span></span></span></span></span></span></span></span></p>
<p><br />
<span style="font-family: Courier"><span style="font-size: 12pt"><span style="font-size: 10pt"><span style="font-size: 12pt"><span style="font-size: 12pt"><span style="font-family: Courier"><span style="font-family: Courier"><span style="font-size: 12pt">那么Hibernate底层如何实现分页的呢？实际上Hibernate的查询定义在<br />
net.sf.hibernate.loader.Loader这个类里面，仔细阅读该类代码，就可以把问题彻底</span><br />
搞清楚。</span></span></span></span></span></span></span></p>
<p><span style="font-family: Courier"><span style="font-size: 12pt"><span style="font-size: 10pt"><span style="font-size: 12pt"><span style="font-size: 12pt"><span style="font-family: Courier"><span style="font-family: Courier">Hibernate2.0.3的Loader源代码第480行以下：</span></span></span></span></span></span></span></p>
<p><span style="font-family: Courier"><span style="font-size: 12pt"><span style="font-size: 10pt"><span style="font-size: 12pt"><span style="font-size: 12pt"><span style="font-family: Courier"><span style="font-family: Courier">代码:<br />
if (useLimit) sql = dialect.getLimitString(sql);<br />
PreparedStatement st = session.getBatcher().prepareQueryStatement(sql,<br />
scrollable);</span></span></span></span></span></span></span></p>
<p><span style="font-family: Courier"><span style="font-size: 12pt"><span style="font-size: 10pt"><span style="font-size: 12pt"><span style="font-size: 12pt"><span style="font-family: Courier"><span style="font-family: Courier"><span style="font-family: Courier"><span style="font-family: "><span style="font-family: ; font-size: 12pt"><span style="font-family: ; font-size: 10pt"><span style="font-family: ; font-size: 12pt"><span style="font-family: ; font-size: 12pt"><span style="font-family: "><span style="font-family: ">如果相应的数据库定</span></span></span></span></span></span></span></span>义了限定查询记录的sql语句，那么直接使用特定数据库的sql语<br />
句。</span></span></span></span></span></span></span></p>
<p><span style="font-family: Courier"><span style="font-size: 12pt"><span style="font-size: 10pt"><span style="font-size: 12pt"><span style="font-size: 12pt"><span style="font-family: Courier"><span style="font-family: Courier">然后来看net.sf.hibernate.dialect.MySQLDialect:</span></span></span></span></span></span></span></p>
<p><span style="font-family: Courier"><span style="font-size: 12pt"><span style="font-size: 10pt"><span style="font-size: 12pt"><span style="font-size: 12pt"><span style="font-family: Courier"><span style="font-family: Courier">代码:<br />
public boolean supportsLimit() {<br />
return true;<br />
}<br />
public String getLimitString(String sql) {<br />
StringBuffer pagingSelect = new StringBuffer(100);<br />
pagingSelect.append(sql);<br />
pagingSelect.append(" limit ?, ?");<br />
return pagingSelect.toString();<br />
}</span></span></span></span></span></span></span></p>
<p><br />
<span style="font-family: Courier"><span style="font-size: 12pt"><span style="font-size: 10pt"><span style="font-size: 12pt"><span style="font-size: 12pt"><span style="font-family: Courier"><span style="font-family: Courier">这是MySQL的专用分页语句，再来看net.sf.hibernate.dialect.Oracle9Dialect:</span></span></span></span></span></span></span></p>
<p><span style="font-family: Courier"><span style="font-size: 12pt"><span style="font-size: 10pt"><span style="font-size: 12pt"><span style="font-size: 12pt"><span style="font-family: Courier"><span style="font-family: Courier">代码:<br />
public boolean supportsLimit() {<br />
return true;<br />
}</span></span></span></span></span></span></span></p>
<p><span style="font-family: Courier"><span style="font-size: 12pt"><span style="font-size: 10pt"><span style="font-size: 12pt"><span style="font-size: 12pt"><span style="font-family: Courier"><span style="font-family: Courier">public String getLimitString(String sql) {<br />
StringBuffer pagingSelect = new StringBuffer(100);<br />
pagingSelect.append("select * from ( select row_.*, rownum rownum_<br />
from ( ");<br />
pagingSelect.append(sql);<br />
pagingSelect.append(" ) row_ where rownum &lt;= ?) where rownum_ &gt; ?");<br />
return pagingSelect.toString();<br />
}</span></span></span></span></span></span></span></p>
<p><br />
<span style="font-family: Courier"><span style="font-size: 12pt"><span style="font-size: 10pt"><span style="font-size: 12pt"><span style="font-size: 12pt"><span style="font-family: Courier"><span style="font-family: Courier">Oracle采用嵌套3层的查询语句结合rownum来实现分页，这在Oracle上是最快的方式，<br />
如果只是一层或者两层的查询语句的rownum不能支持order by。</span></span></span></span></span></span></span></p>
<p><span style="font-family: Courier"><span style="font-size: 12pt"><span style="font-size: 10pt"><span style="font-size: 12pt"><span style="font-size: 12pt"><span style="font-family: Courier"><span style="font-family: Courier">除此之外，Interbase，PostgreSQL，HSQL也支持分页的sql语句，在相应的Dialect里<br />
面，大家自行参考。</span></span></span></span></span></span></span></p>
<p><span style="font-family: Courier"><span style="font-size: 12pt"><span style="font-size: 10pt"><span style="font-size: 12pt"><span style="font-size: 12pt"><span style="font-family: Courier"><span style="font-family: Courier">如果数据库不支持分页的SQL语句，那么根据在配置文件里面<br />
#hibernate.jdbc.use_scrollable_resultset true<br />
默认是true，如果你不指定为false，那么Hibernate会使用JDBC2.0的scrollable<br />
result来实现分页，看Loader第430行以下：</span></span></span></span></span></span></span></p>
<p><br />
<span style="font-family: Courier"><span style="font-size: 12pt"><span style="font-size: 10pt"><span style="font-size: 12pt"><span style="font-size: 12pt"><span style="font-family: Courier"><span style="font-family: Courier">代码:<br />
if ( session.getFactory().useScrollableResultSets() ) {<br />
// we can go straight to the first required row<br />
rs.absolute(firstRow);<br />
}<br />
else {<br />
// we need to step through the rows one row at a time (slow)<br />
for ( int m=0; m }</span></span></span></span></span></span></span></p>
<p><span style="font-family: Courier"><span style="font-size: 12pt"><span style="font-size: 10pt"><span style="font-size: 12pt"><span style="font-size: 12pt"><span style="font-family: Courier"><span style="font-family: Courier"><span style="font-family: Courier">如果支持scrollable result，使用ResultSet的absolute方法直接移到查询起点，如果<br />
不支持的话，使用循环语句，rs.next一点点的移过去。</span></span></span></span></span></span></span></span></p>
<p><span style="font-family: Courier"><span style="font-size: 12pt"><span style="font-size: 10pt"><span style="font-size: 12pt"><span style="font-size: 12pt"><span style="font-family: Courier"><span style="font-family: Courier"><span style="font-family: Courier">可见使用Hibernate，在进行查询分页的操作上，是具有非常大的灵活性，Hibernate会<br />
首先尝试用特定数据库的分页sql，如果没用，再尝试Scrollable，如果不行，最后采<br />
用rset.next()移动的办法。</span></span></span></span></span></span></span></span></p>
<p><span style="font-family: Courier"><span style="font-size: 12pt"><span style="font-size: 10pt"><span style="font-size: 12pt"><span style="font-size: 12pt"><span style="font-family: Courier"><span style="font-family: Courier"><span style="font-family: Courier">在查询分页代码中使用Hibernate的一大好处是，既兼顾了查询分页的性能，同时又保<br />
证了代码在不同的数据库之间的可移植性。</span></span></span></span></span></span></span></span></p>
<img src ="http://www.blogjava.net/JeromeKwok/aggbug/311963.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/JeromeKwok/" target="_blank">Jerome Kwok</a> 2010-02-04 15:05 <a href="http://www.blogjava.net/JeromeKwok/articles/311963.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>学习JPA——Hibernate Annotation使用实例 （转自菠萝大象）</title><link>http://www.blogjava.net/JeromeKwok/articles/232855.html</link><dc:creator>Jerome Kwok</dc:creator><author>Jerome Kwok</author><pubDate>Tue, 07 Oct 2008 02:46:00 GMT</pubDate><guid>http://www.blogjava.net/JeromeKwok/articles/232855.html</guid><wfw:comment>http://www.blogjava.net/JeromeKwok/comments/232855.html</wfw:comment><comments>http://www.blogjava.net/JeromeKwok/articles/232855.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/JeromeKwok/comments/commentRss/232855.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/JeromeKwok/services/trackbacks/232855.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp; 目前，JPA（Java Persistence API）的使用范围越来越广，作为Java EE 5.0平台标准的ORM规范，得到了诸如：Hibernate、TopLink、OpenJpa等ORM框架的支持，同时还是EJB 3.0的重要组成部分。JPA的宗旨是为POJO提供持久化标准规范。它能够脱离容器独立运行，方便开发和测试。本文将通过一个小实例来说明如何在Hiberna...&nbsp;&nbsp;<a href='http://www.blogjava.net/JeromeKwok/articles/232855.html'>阅读全文</a><img src ="http://www.blogjava.net/JeromeKwok/aggbug/232855.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/JeromeKwok/" target="_blank">Jerome Kwok</a> 2008-10-07 10:46 <a href="http://www.blogjava.net/JeromeKwok/articles/232855.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate中的session 事务处理机制  （转）</title><link>http://www.blogjava.net/JeromeKwok/articles/232830.html</link><dc:creator>Jerome Kwok</dc:creator><author>Jerome Kwok</author><pubDate>Tue, 07 Oct 2008 01:53:00 GMT</pubDate><guid>http://www.blogjava.net/JeromeKwok/articles/232830.html</guid><wfw:comment>http://www.blogjava.net/JeromeKwok/comments/232830.html</wfw:comment><comments>http://www.blogjava.net/JeromeKwok/articles/232830.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/JeromeKwok/comments/commentRss/232830.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/JeromeKwok/services/trackbacks/232830.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 在没有使用Spring提供的Open Session In View情况下，因需要在service(or Dao)层里把session关闭，所以lazy loading 为true的话，要在应用层内把关系集合都初始化，如 company.getEmployees()，否则Hibernate抛session already closed Exception;&nbsp;&nbsp;&nbsp; Op...&nbsp;&nbsp;<a href='http://www.blogjava.net/JeromeKwok/articles/232830.html'>阅读全文</a><img src ="http://www.blogjava.net/JeromeKwok/aggbug/232830.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/JeromeKwok/" target="_blank">Jerome Kwok</a> 2008-10-07 09:53 <a href="http://www.blogjava.net/JeromeKwok/articles/232830.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate 3 入門和JPA 批注参考（中文） 转</title><link>http://www.blogjava.net/JeromeKwok/articles/231540.html</link><dc:creator>Jerome Kwok</dc:creator><author>Jerome Kwok</author><pubDate>Sat, 27 Sep 2008 08:44:00 GMT</pubDate><guid>http://www.blogjava.net/JeromeKwok/articles/231540.html</guid><wfw:comment>http://www.blogjava.net/JeromeKwok/comments/231540.html</wfw:comment><comments>http://www.blogjava.net/JeromeKwok/articles/231540.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/JeromeKwok/comments/commentRss/231540.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/JeromeKwok/services/trackbacks/231540.html</trackback:ping><description><![CDATA[<p><strong><span style="font-family: Courier">Hibernate 3 入門</span></strong></p>
<p><span style="font-family: Courier">台湾 </span><a href="http://www.javaworld.com.tw/confluence/display/~caterpillar"><span style="font-family: Courier">良葛格</span></a><span style="font-family: Courier">&nbsp; ，比较详细，按照开发步骤讲解的Hibernate学习资料，个人觉得比那本中文版的Hibernate参考手册要有可操作性的多。地址：</span><a title="http://www.javaworld.com.tw/confluence/pages/viewpage.action?pageId=3077" href="http://www.javaworld.com.tw/confluence/pages/viewpage.action?pageId=3077"><span style="font-family: Courier">http://www.javaworld.com.tw/confluence/pages/viewpage.action?pageId=3077</span></a></p>
<p><span style="font-family: Courier">内容一览：</span></p>
<p><span style="font-family: Courier">Hibernate 是「物件/關係對應」（Object/Relational Mapping）的解決方案，簡寫為ORM，簡單的說就是將 Java 中的物件與物件關係，映射至關聯式資料庫中的表格與表格之間的關係， Hibernate 提供了這個過程中自動對應轉換的方案。 </span>
<p><span style="font-family: Courier">2001年未 Hibernate 第一個版本發表，2003年6月8日 Hibernate 2 發表，並於年未獲得 Jolt 2004 大獎，後被 JBOSS 收納而成為其子項目之一，2005年3月 Hibernate 3 正式發表，當中有了一些重大的改變，這份文件將以之前 Hibernate 2 時撰寫的 </span><a href="http://www.javaworld.com.tw/confluence/pages/viewpage.action?pageId=833"><span style="font-family: Courier">文件<sup><img height="7" alt="" src="http://www.javaworld.com.tw/confluence/images/icons/linkext7.gif" width="7" align="absMiddle" border="0" /></sup></span></a><span style="font-family: Courier"> 為基礎，針對 Hibernate 3作重新整理的動作，所使用的版本為Hibernate 3.0。 </span>
<p><span style="font-family: Courier"><strong><ins>基礎入門</ins></strong><br />
從一個最基本的物件關係映射自動化程式，瞭解 Hibernate 組成的基本元素，並進一步瞭解 Hibernate 的基礎語義、配置等概念。 </span>
<ul>
    <li><span style="font-family: Courier">O/R 映射入門<br />
    第一個 Hibernate 程式很簡單，將一個物件映射至一個資料表。 </span>
    <ul>
        <li><a href="http://www.javaworld.com.tw/confluence/pages/viewpage.action?pageId=3084"><span style="font-family: Courier">配置 Hibernate</span></a><span style="font-family: Courier"> </span>
        <li><a href="http://www.javaworld.com.tw/confluence/pages/viewpage.action?pageId=3090"><span style="font-family: Courier">第一個 Hibernate</span></a><span style="font-family: Courier"> </span>
        <li><a href="http://www.javaworld.com.tw/confluence/pages/viewpage.action?pageId=3094"><span style="font-family: Courier">第二個 Hibernate</span></a></li>
    </ul>
    </li>
</ul>
<ul>
    <li><span style="font-family: Courier">基本配置<br />
    瞭解一下配置文件、映射文件中各種元素的意義，在進入物件關係映射的學習之前，這是必備的基本功夫。 </span>
    <ul>
        <li><a href="http://www.javaworld.com.tw/confluence/pages/viewpage.action?pageId=3112"><span style="font-family: Courier">配置文件</span></a><span style="font-family: Courier"> </span>
        <li><a href="http://www.javaworld.com.tw/confluence/pages/viewpage.action?pageId=3114"><span style="font-family: Courier">資料庫連結</span></a><span style="font-family: Courier"> </span>
        <li><a href="http://www.javaworld.com.tw/confluence/pages/viewpage.action?pageId=3115"><span style="font-family: Courier">簡介快取（Session Level）</span></a><span style="font-family: Courier"> </span>
        <li><a href="http://www.javaworld.com.tw/confluence/pages/viewpage.action?pageId=3116"><span style="font-family: Courier">簡介事務管理（基於 JDBC ）</span></a><span style="font-family: Courier"> </span>
        <li><a href="http://www.javaworld.com.tw/confluence/pages/viewpage.action?pageId=3117"><span style="font-family: Courier">映射文件</span></a></li>
    </ul>
    </li>
</ul>
<ul>
    <li><span style="font-family: Courier">基本 API<br />
    瞭解一下 Hibernate 常使用的幾個類別之基本使用方式。 </span>
    <ul>
        <li><a href="http://www.javaworld.com.tw/confluence/display/opensrc/Session"><span style="font-family: Courier">Session</span></a><span style="font-family: Courier"> </span>
        <li><a href="http://www.javaworld.com.tw/confluence/pages/viewpage.action?pageId=3120"><span style="font-family: Courier">Session 管理</span></a><span style="font-family: Courier"> </span>
        <li><a href="http://www.javaworld.com.tw/confluence/pages/viewpage.action?pageId=3128"><span style="font-family: Courier">Criteria 基本查詢</span></a><span style="font-family: Courier"> </span>
        <li><a href="http://www.javaworld.com.tw/confluence/pages/viewpage.action?pageId=3129"><span style="font-family: Courier">Criteria 進階查詢</span></a><span style="font-family: Courier"> </span>
        <li><a href="http://www.javaworld.com.tw/confluence/display/opensrc/DetchedCriteria"><span style="font-family: Courier">DetchedCriteria</span></a><span style="font-family: Courier"> </span>
        <li><a href="http://www.javaworld.com.tw/confluence/display/opensrc/Query"><span style="font-family: Courier">Query</span></a></li>
    </ul>
    </li>
</ul>
<ul>
    <li><span style="font-family: Courier">HQL（Hibernate Query Language）<br />
    這是 Hibernate 官方所推薦的查詢語言，接近 SQL 的語法，並提供更多的特性與封裝。 </span>
    <ul>
        <li><a href="http://www.javaworld.com.tw/confluence/pages/viewpage.action?pageId=3133"><span style="font-family: Courier">基本查詢</span></a><span style="font-family: Courier"> </span>
        <li><a href="http://www.javaworld.com.tw/confluence/pages/viewpage.action?pageId=3134"><span style="font-family: Courier">where、group by、order by 子句</span></a><span style="font-family: Courier"> </span>
        <li><a href="http://www.javaworld.com.tw/confluence/pages/viewpage.action?pageId=3135"><span style="font-family: Courier">更新、刪除</span></a></li>
    </ul>
    </li>
</ul>
<ul>
    <li><span style="font-family: Courier">SQL 支援<br />
    Hibernate 提供了對 SQL 的支援，並可以自行定義持久化方式。 </span>
    <ul>
        <li><a href="http://www.javaworld.com.tw/confluence/pages/viewpage.action?pageId=3136"><span style="font-family: Courier">建立 SQL 查詢</span></a><span style="font-family: Courier"> </span>
        <li><a href="http://www.javaworld.com.tw/confluence/pages/viewpage.action?pageId=3137"><span style="font-family: Courier">自定義 insert、update、delete</span></a></li>
    </ul>
    </li>
</ul>
<ul>
    <li><span style="font-family: Courier">映射基礎議題<br />
    一邊是物件，一邊是資料表格，兩者在映射時有一些過渡的基礎議題必須瞭解。 </span>
    <ul>
        <li><a href="http://www.javaworld.com.tw/confluence/pages/viewpage.action?pageId=3138"><span style="font-family: Courier">實體物件生命週期</span></a><span style="font-family: Courier"> </span>
        <li><a href="http://www.javaworld.com.tw/confluence/pages/viewpage.action?pageId=3140"><span style="font-family: Courier">資料識別（Data Identity）</span></a></li>
    </ul>
    </li>
</ul>
<p><span style="font-family: Courier"><strong><ins>物件關聯映射（Object/Relational Mapping, ORM）</ins></strong><br />
學習 Hibernate，大部份的時間都在瞭解如何實現映射，而從中您也可以瞭解到不少關聯式資料庫的表格設計方式。 </span>
<ul>
    <li><span style="font-family: Courier">實體映射<br />
    來看看一些進階的實體映射議題。 </span>
    <ul>
        <li><a href="http://www.javaworld.com.tw/confluence/pages/viewpage.action?pageId=3142"><span style="font-family: Courier">複合主鍵（一）</span></a><span style="font-family: Courier"> </span>
        <li><a href="http://www.javaworld.com.tw/confluence/pages/viewpage.action?pageId=3145"><span style="font-family: Courier">複合主鍵（二）</span></a><span style="font-family: Courier"> </span>
        <li><a href="http://www.javaworld.com.tw/confluence/pages/viewpage.action?pageId=3146"><span style="font-family: Courier">Blob、Clob</span></a><span style="font-family: Courier"> </span>
        <li><a href="http://www.javaworld.com.tw/confluence/display/opensrc/Component"><span style="font-family: Courier">Component</span></a><span style="font-family: Courier"> </span>
        <li><a href="http://www.javaworld.com.tw/confluence/pages/viewpage.action?pageId=3150"><span style="font-family: Courier">動態模型（Dynamic Model）</span></a></li>
    </ul>
    </li>
</ul>
<ul>
    <li><span style="font-family: Courier">繼承映射<br />
    在物件導向設計中，繼承關係是很常見的，但繼承與關聯式資料庫有著先天上的差異，繼承關係至表格的設計上有三種方式。 </span>
    <ul>
        <li><a href="http://www.javaworld.com.tw/confluence/pages/viewpage.action?pageId=3152"><span style="font-family: Courier">繼承 - Table per concrete class</span></a><span style="font-family: Courier"> </span>
        <li><a href="http://www.javaworld.com.tw/confluence/pages/viewpage.action?pageId=3154"><span style="font-family: Courier">繼承 - Table per class hierarchy</span></a><span style="font-family: Courier"> </span>
        <li><a href="http://www.javaworld.com.tw/confluence/pages/viewpage.action?pageId=3159"><span style="font-family: Courier">繼承 - Table per subclass</span></a></li>
    </ul>
    </li>
</ul>
<ul>
    <li><span style="font-family: Courier">容器映射<br />
    容器常用來儲存物件，這邊來瞭解一下如何將容器的關係映射至表格。 </span>
    <ul>
        <li><a href="http://www.javaworld.com.tw/confluence/display/opensrc/Set"><span style="font-family: Courier">Set</span></a><span style="font-family: Courier"> </span>
        <li><a href="http://www.javaworld.com.tw/confluence/display/opensrc/List"><span style="font-family: Courier">List</span></a><span style="font-family: Courier"> </span>
        <li><a href="http://www.javaworld.com.tw/confluence/display/opensrc/Map"><span style="font-family: Courier">Map</span></a><span style="font-family: Courier"> </span>
        <li><a href="http://www.javaworld.com.tw/confluence/display/opensrc/Bag"><span style="font-family: Courier">Bag</span></a><span style="font-family: Courier"> </span>
        <li><a href="http://www.javaworld.com.tw/confluence/pages/viewpage.action?pageId=3178"><span style="font-family: Courier">內含 Component 的容器</span></a><span style="font-family: Courier"> </span>
        <li><a href="http://www.javaworld.com.tw/confluence/pages/viewpage.action?pageId=3180"><span style="font-family: Courier">容器的排序</span></a><span style="font-family: Courier"> </span>
        <li><a href="http://www.javaworld.com.tw/confluence/pages/viewpage.action?pageId=3181"><span style="font-family: Courier">容器的延遲初始（Lazy Initialization）</span></a></li>
    </ul>
    </li>
</ul>
<ul>
    <li><span style="font-family: Courier">關係映射<br />
    來看看實體與實體之間的多對一、一對多、一對一、多對多如何與Java物件之間進行映射。 </span>
    <ul>
        <li><a href="http://www.javaworld.com.tw/confluence/pages/viewpage.action?pageId=3187"><span style="font-family: Courier">多對一</span></a><span style="font-family: Courier"> </span>
        <li><a href="http://www.javaworld.com.tw/confluence/pages/viewpage.action?pageId=3283"><span style="font-family: Courier">cascade 的意義</span></a><span style="font-family: Courier"> </span>
        <li><a href="http://www.javaworld.com.tw/confluence/pages/viewpage.action?pageId=3346"><span style="font-family: Courier">一對多</span></a><span style="font-family: Courier"> </span>
        <li><a href="http://www.javaworld.com.tw/confluence/pages/viewpage.action?pageId=3479"><span style="font-family: Courier">雙向關聯（inverse 的意義）</span></a><span style="font-family: Courier"> </span>
        <li><a href="http://www.javaworld.com.tw/confluence/pages/viewpage.action?pageId=3481"><span style="font-family: Courier">一對一（唯一外鍵關聯）</span></a><span style="font-family: Courier"> </span>
        <li><a href="http://www.javaworld.com.tw/confluence/pages/viewpage.action?pageId=3524"><span style="font-family: Courier">一對一（主鍵關聯）</span></a><span style="font-family: Courier"> </span>
        <li><a href="http://www.javaworld.com.tw/confluence/pages/viewpage.action?pageId=3526"><span style="font-family: Courier">多對多</span></a></li>
    </ul>
    </li>
</ul>
<p><span style="font-family: Courier"><strong><ins>進階特性</ins></strong><br />
有關於Hibernate的快取、事務等進階特性的探討。 </span>
<ul>
    <li><span style="font-family: Courier">快取<br />
    二級快取可以跨越 Session 生命週期，Hibernate 透過第三方來實現二級快取，這邊也來看看 Query 的快取。 </span>
    <ul>
        <li><a href="http://www.javaworld.com.tw/confluence/pages/viewpage.action?pageId=3576"><span style="font-family: Courier">二級快取（Second-level）</span></a><span style="font-family: Courier"> </span>
        <li><a href="http://www.javaworld.com.tw/confluence/pages/viewpage.action?pageId=3606"><span style="font-family: Courier">Query 快取</span></a><span style="font-family: Courier"> </span>
        <li><a href="http://www.javaworld.com.tw/confluence/pages/viewpage.action?pageId=3607"><span style="font-family: Courier">Query.list、iterator</span></a></li>
    </ul>
    </li>
</ul>
<ul>
    <li><span style="font-family: Courier">Locking<br />
    Hibernate 透過兩種 Locking 機制來保證資料在操作過程中不會被干擾。 </span>
    <ul>
        <li><a href="http://www.javaworld.com.tw/confluence/pages/viewpage.action?pageId=3608"><span style="font-family: Courier">悲觀鎖定（Pessimistic Locking）</span></a><span style="font-family: Courier"> </span>
        <li><a href="http://www.javaworld.com.tw/confluence/pages/viewpage.action?pageId=3609"><span style="font-family: Courier">樂觀鎖定（Optimistic Locking）</span></a></li>
    </ul>
    </li>
</ul>
<ul>
    <li><span style="font-family: Courier">Validatable、Lifecycle、Interceptor<br />
    分別透過這三個介面，來進行資料驗證、於 CRUD（Create Retrieve Update Delete）作對應動作、欄截動作。 </span>
    <ul>
        <li><a href="http://www.javaworld.com.tw/confluence/pages/viewpage.action?pageId=3610"><span style="font-family: Courier">Lifecycle 介面、Validatable 介面</span></a><span style="font-family: Courier"> </span>
        <li><a href="http://www.javaworld.com.tw/confluence/pages/viewpage.action?pageId=3611"><span style="font-family: Courier">Interceptor 介面</span></a></li>
    </ul>
    </li>
</ul>
<p><span style="font-family: Courier"><strong><ins>工具</ins></strong><br />
透過一些工具來自動生成映射文件或資料庫表格。 </span>
<ul>
    <li><a href="http://www.javaworld.com.tw/confluence/pages/viewpage.action?pageId=3612"><span style="font-family: Courier">從映射文件生成資料表</span></a><span style="font-family: Courier"> </span>
    <li><a href="http://www.javaworld.com.tw/confluence/pages/viewpage.action?pageId=3613"><span style="font-family: Courier">從資料表生成映射文件</span></a></li>
</ul>
 <img src ="http://www.blogjava.net/JeromeKwok/aggbug/231540.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/JeromeKwok/" target="_blank">Jerome Kwok</a> 2008-09-27 16:44 <a href="http://www.blogjava.net/JeromeKwok/articles/231540.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>