[hibernate-commits] Hibernate SVN: r14081 - in core/trunk/documentation/manual/zh-CN: src/main and 3 other directories.
hibernate-commits at lists.jboss.org
hibernate-commits at lists.jboss.org
Tue Oct 9 16:10:35 EDT 2007
Author: steve.ebersole at jboss.com
Date: 2007-10-09 16:10:34 -0400 (Tue, 09 Oct 2007)
New Revision: 14081
Added:
core/trunk/documentation/manual/zh-CN/glossary.txt
core/trunk/documentation/manual/zh-CN/src/main/docbook/Hibernate_Reference.xml
core/trunk/documentation/manual/zh-CN/src/main/docbook/content/
core/trunk/documentation/manual/zh-CN/src/main/docbook/content/architecture.xml
core/trunk/documentation/manual/zh-CN/src/main/docbook/content/association_mapping.xml
core/trunk/documentation/manual/zh-CN/src/main/docbook/content/basic_mapping.xml
core/trunk/documentation/manual/zh-CN/src/main/docbook/content/batch.xml
core/trunk/documentation/manual/zh-CN/src/main/docbook/content/best_practices.xml
core/trunk/documentation/manual/zh-CN/src/main/docbook/content/collection_mapping.xml
core/trunk/documentation/manual/zh-CN/src/main/docbook/content/component_mapping.xml
core/trunk/documentation/manual/zh-CN/src/main/docbook/content/configuration.xml
core/trunk/documentation/manual/zh-CN/src/main/docbook/content/events.xml
core/trunk/documentation/manual/zh-CN/src/main/docbook/content/example_mappings.xml
core/trunk/documentation/manual/zh-CN/src/main/docbook/content/example_parentchild.xml
core/trunk/documentation/manual/zh-CN/src/main/docbook/content/example_weblog.xml
core/trunk/documentation/manual/zh-CN/src/main/docbook/content/filters.xml
core/trunk/documentation/manual/zh-CN/src/main/docbook/content/inheritance_mapping.xml
core/trunk/documentation/manual/zh-CN/src/main/docbook/content/performance.xml
core/trunk/documentation/manual/zh-CN/src/main/docbook/content/persistent_classes.xml
core/trunk/documentation/manual/zh-CN/src/main/docbook/content/preface.xml
core/trunk/documentation/manual/zh-CN/src/main/docbook/content/query_criteria.xml
core/trunk/documentation/manual/zh-CN/src/main/docbook/content/query_hql.xml
core/trunk/documentation/manual/zh-CN/src/main/docbook/content/query_sql.xml
core/trunk/documentation/manual/zh-CN/src/main/docbook/content/quickstart.xml
core/trunk/documentation/manual/zh-CN/src/main/docbook/content/session_api.xml
core/trunk/documentation/manual/zh-CN/src/main/docbook/content/toolset_guide.xml
core/trunk/documentation/manual/zh-CN/src/main/docbook/content/transactions.xml
core/trunk/documentation/manual/zh-CN/src/main/docbook/content/tutorial.xml
core/trunk/documentation/manual/zh-CN/src/main/docbook/content/xml.xml
core/trunk/documentation/manual/zh-CN/src/main/docbook/images/
core/trunk/documentation/manual/zh-CN/src/main/docbook/images/AuthorWork.png
core/trunk/documentation/manual/zh-CN/src/main/docbook/images/AuthorWork.zargo
core/trunk/documentation/manual/zh-CN/src/main/docbook/images/CustomerOrderProduct.png
core/trunk/documentation/manual/zh-CN/src/main/docbook/images/CustomerOrderProduct.zargo
core/trunk/documentation/manual/zh-CN/src/main/docbook/images/EmployerEmployee.png
core/trunk/documentation/manual/zh-CN/src/main/docbook/images/EmployerEmployee.zargo
core/trunk/documentation/manual/zh-CN/src/main/docbook/images/full_cream.png
core/trunk/documentation/manual/zh-CN/src/main/docbook/images/full_cream.svg
core/trunk/documentation/manual/zh-CN/src/main/docbook/images/hibernate_logo_a.png
core/trunk/documentation/manual/zh-CN/src/main/docbook/images/lite.png
core/trunk/documentation/manual/zh-CN/src/main/docbook/images/lite.svg
core/trunk/documentation/manual/zh-CN/src/main/docbook/images/overview.png
core/trunk/documentation/manual/zh-CN/src/main/docbook/images/overview.svg
core/trunk/documentation/manual/zh-CN/src/main/docbook/legal_notice.xml
core/trunk/documentation/manual/zh-CN/src/main/docbook/translators.xml
Removed:
core/trunk/documentation/manual/zh-CN/src/main/docbook/glossary.txt
core/trunk/documentation/manual/zh-CN/src/main/docbook/master.xml
core/trunk/documentation/manual/zh-CN/src/main/docbook/modules/
core/trunk/documentation/manual/zh-CN/src/main/resources/
Log:
new docbook layout (prep for translations migration to PO)
Copied: core/trunk/documentation/manual/zh-CN/glossary.txt (from rev 14080, core/trunk/documentation/manual/zh-CN/src/main/docbook/glossary.txt)
===================================================================
--- core/trunk/documentation/manual/zh-CN/glossary.txt (rev 0)
+++ core/trunk/documentation/manual/zh-CN/glossary.txt 2007-10-09 20:10:34 UTC (rev 14081)
@@ -0,0 +1,27 @@
+O/R Mapping 对象/å
³ç³»æ°æ®åºæ å°
+identifier property: æ è¯å±æ§
+discriminator: 辨å«æ å¿(ä¸ä½¿ç¨"é´å«å¨")
+
+join-subclass,union-subclass,join: ä¸ç¿»è¯
+
+fine-grained ç»ç²åº¦
+domain model é¢å模å
+business object ä¸å¡å¯¹è±¡(v2çæ¶åç¿»è¯ä¸º"åä¸å¯¹è±¡",被æ æ°äººçéª....)
+annotations 注解(è¿ä¸ªè¯è¿æ¯è¾æ°,ä¹è§å°æç¿»è¯ä¸º"ç¹æ®æ³¨é"/"æ 注"ç)
+
+Aggregate functions ç»è®¡å½æ° (èéå½æ°?èåå½æ°? è¿æ¯ç¿»è¯ä¸ºç»è®¡å½æ°æè½è®©äººçæ)
+Criteria Queries æ¡ä»¶æ¥è¯¢(æ åæ¥è¯¢?è¿éCriteriaæ¯"å¤æ®"çå«ä¹,èé"æ å",æè¯ä¸ºæ¡ä»¶æ¥è¯¢æ´å æç½)
+
+session flush sessionæ¸
æ´
+lazy fetching 延è¿å è½½(æå è½½,ç¿»è¯å¾ç´ç½,ä½æ¯å´ä¸æç解)
+
+对象ç¶æï¼
+ persistent class æä¹
åç±»
+ persistent object æä¹
对象 (ä½ç°è¿æ¯ä¸æ个æä¹
å设å¤èç³»ç,æçµä¹åä¸æ¶å¤±)
+ transient object ç¬æ¶å¯¹è±¡ (å
¶å«ä¹æ¯ä»
å¨å
åä¸åå¨ç,æçµä¹åæ¶å¤±,ç¿»è¯ä¸ºç¬æ¶å¯¹è±¡æ¯è¾å¥½)
+ detached object è±ç®¡å¯¹è±¡(ä¸sessionè±ç¦»ç对象)
+
+outer-join fetching å¤è¿æ¥æå (fetchä¸è¬ç¿»è¯ä¸º"è·å",v2ç¿»è¯çæ¶å,为äºçªåºå
¶ä¸»å¨è·åçç¹ç¹,ç¿»è¯ä¸º"æå")
+
+class hierarchy ç±»åå±ç»æ http://www.umlchina.com/xprogrammer/glossary1.htm
+inheritance hierarchy 继æ¿å±æ¬¡ http://www-128.ibm.com/developerworks/cn/java/j-aopwork4/?ca=dwcn-newsletter-java
Copied: core/trunk/documentation/manual/zh-CN/src/main/docbook/Hibernate_Reference.xml (from rev 14073, core/trunk/documentation/manual/en-US/src/main/docbook/Hibernate_Reference.xml)
===================================================================
--- core/trunk/documentation/manual/zh-CN/src/main/docbook/Hibernate_Reference.xml (rev 0)
+++ core/trunk/documentation/manual/zh-CN/src/main/docbook/Hibernate_Reference.xml 2007-10-09 20:10:34 UTC (rev 14081)
@@ -0,0 +1,72 @@
+<?xml version='1.0' encoding="UTF-8"?>
+<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
+ <!ENTITY versionNumber "3.3.0.alpha1">
+ <!ENTITY copyrightYear "2004">
+ <!ENTITY copyrightHolder "Red Hat Middleware, LLC.">
+]>
+
+<book>
+
+ <bookinfo>
+ <title>HIBERNATE - 符åJavaä¹ æ¯çå
³ç³»æ°æ®åºæä¹
å</title>
+ <subtitle>Hibernateåèææ¡£</subtitle>
+ <releaseinfo>&versionNumber;</releaseinfo>
+ <productnumber>&versionNumber;</productnumber>
+ <issuenum>1</issuenum>
+ <mediaobject>
+ <imageobject role="fo">
+ <imagedata fileref="images/hibernate_logo_a.png" align="center" />
+ </imageobject>
+ <imageobject role="html">
+ <imagedata fileref="images/hibernate_logo_a.png" depth="3cm" />
+ </imageobject>
+ </mediaobject>
+ <copyright>
+ <year>©rightYear;</year>
+ <holder>©rightHolder;</holder>
+ </copyright>
+ <xi:include href="translators.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
+ <xi:include href="legal_notice.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
+ </bookinfo>
+
+ <toc/>
+
+ <xi:include href="content/preface.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
+
+ <xi:include href="content/tutorial.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
+
+ <xi:include href="content/architecture.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
+
+ <xi:include href="content/configuration.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
+
+ <xi:include href="content/persistent_classes.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
+
+ <xi:include href="content/basic_mapping.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
+ <xi:include href="content/collection_mapping.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
+ <xi:include href="content/association_mapping.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
+ <xi:include href="content/component_mapping.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
+ <xi:include href="content/inheritance_mapping.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
+
+ <xi:include href="content/session_api.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
+ <xi:include href="content/transactions.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
+ <xi:include href="content/events.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
+ <xi:include href="content/batch.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
+
+ <xi:include href="content/query_hql.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
+ <xi:include href="content/query_criteria.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
+ <xi:include href="content/query_sql.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
+ <xi:include href="content/filters.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
+ <xi:include href="content/xml.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
+
+ <xi:include href="content/performance.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
+
+ <xi:include href="content/toolset_guide.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
+
+ <xi:include href="content/example_parentchild.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
+ <xi:include href="content/example_weblog.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
+ <xi:include href="content/example_mappings.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
+
+ <xi:include href="content/best_practices.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
+
+</book>
+
Copied: core/trunk/documentation/manual/zh-CN/src/main/docbook/content/architecture.xml (from rev 14080, core/trunk/documentation/manual/zh-CN/src/main/docbook/modules/architecture.xml)
===================================================================
--- core/trunk/documentation/manual/zh-CN/src/main/docbook/content/architecture.xml (rev 0)
+++ core/trunk/documentation/manual/zh-CN/src/main/docbook/content/architecture.xml 2007-10-09 20:10:34 UTC (rev 14081)
@@ -0,0 +1,284 @@
+<chapter id="architecture">
+
+ <title>ä½ç³»ç»æ(Architecture)</title>
+ <sect1 id="architecture-overview" revision="1">
+ <title>æ¦åµ(Overview)</title>
+
+ <para>
+ ä¸ä¸ªé常ç®è¦çHibernateä½ç³»ç»æçæ¦è¦å¾ï¼
+ </para>
+
+ <mediaobject>
+ <imageobject role="fo">
+ <imagedata fileref="images/overview.svg" format="SVG" align="center"/>
+ </imageobject>
+ <imageobject role="html">
+ <imagedata fileref="../shared/images/overview.gif" format="GIF" align="center"/>
+ </imageobject>
+ </mediaobject>
+
+ <para>
+ ä»è¿ä¸ªå¾å¯ä»¥çåºï¼Hibernate使ç¨æ°æ®åºåé
置信æ¯æ¥ä¸ºåºç¨ç¨åºæä¾æä¹
åæå¡ï¼ä»¥åæä¹
ç对象ï¼ã
+ </para>
+
+ <para>
+ æ们æ¥æ´è¯¦ç»å°çä¸ä¸Hibernateè¿è¡æ¶ä½ç³»ç»æãç±äºHibernateé常çµæ´»ï¼ä¸æ¯æå¤ç§åºç¨æ¹æ¡ï¼
+ æ以æ们è¿åªæè¿°ä¸ä¸ä¸¤ç§æ端çæ
åµãâè½»åâçä½ç³»ç»ææ¹æ¡ï¼è¦æ±åºç¨ç¨åºæä¾èªå·±çJDBC
+ è¿æ¥å¹¶ç®¡çèªå·±çäºå¡ãè¿ç§æ¹æ¡ä½¿ç¨äºHibernate APIçæå°åéï¼
+ </para>
+
+ <mediaobject>
+ <imageobject role="fo">
+ <imagedata fileref="images/lite.svg" format="SVG" align="center"/>
+ </imageobject>
+ <imageobject role="html">
+ <imagedata fileref="../shared/images/lite.gif" format="GIF" align="center"/>
+ </imageobject>
+ </mediaobject>
+
+ <para>
+ âå
¨é¢è§£å³âçä½ç³»ç»ææ¹æ¡ï¼å°åºç¨å±ä»åºå±çJDBC/JTA APIä¸æ½è±¡åºæ¥ï¼è让Hibernateæ¥å¤çè¿äºç»èã
+ </para>
+
+ <mediaobject>
+ <imageobject role="fo">
+ <imagedata fileref="images/full_cream.svg" format="SVG" align="center"/>
+ </imageobject>
+ <imageobject role="html">
+ <imagedata fileref="../shared/images/full_cream.gif" format="GIF" align="center"/>
+ </imageobject>
+ </mediaobject>
+
+ <para>
+ å¾ä¸å个对象çå®ä¹å¦ä¸ï¼
+
+ <variablelist spacing="compact">
+ <varlistentry>
+ <term>SessionFactory (<literal>org.hibernate.SessionFactory</literal>)</term>
+ <listitem>
+ <para>
+ é对å个æ°æ®åºæ å°å
³ç³»ç»è¿ç¼è¯åçå
åéåï¼æ¯çº¿ç¨å®å
¨çï¼ä¸å¯åï¼ã
+ å®æ¯çæ<literal>Session</literal>çå·¥åï¼æ¬èº«è¦ç¨å°<literal>ConnectionProvider</literal>ã
+ 该对象å¯ä»¥å¨è¿ç¨æé群ç级å«ä¸ï¼ä¸ºé£äºäºå¡ä¹é´å¯ä»¥éç¨çæ°æ®æä¾å¯éçäºçº§ç¼åã
+ </para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>Session (<literal>org.hibernate.Session</literal>)</term>
+ <listitem>
+ <para>
+ 表示åºç¨ç¨åºä¸æä¹
å¨åå±ä¹é´äº¤äºæä½çä¸ä¸ªå线ç¨å¯¹è±¡ï¼æ¤å¯¹è±¡çåæå¾çã
+ å
¶éèäºJDBCè¿æ¥ï¼ä¹æ¯<literal>Transaction</literal>çå·¥åã
+ å
¶ä¼ææä¸ä¸ªé对æä¹
å对象çå¿
éï¼ç¬¬ä¸çº§ï¼ç¼åï¼å¨éå对象å¾æè
æ ¹æ®æä¹
åæ è¯æ¥æ¾å¯¹è±¡æ¶ä¼ç¨å°ã
+ </para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>æä¹
ç对象åå
¶éå</term>
+ <listitem>
+ <para>
+ 带ææä¹
åç¶æçãå
·æä¸å¡åè½çå线ç¨å¯¹è±¡ï¼æ¤å¯¹è±¡çåæå¾çã
+ è¿äºå¯¹è±¡å¯è½æ¯æ®éçJavaBeans/POJOï¼å¯ä¸ç¹æ®çæ¯ä»ä»¬æ£ä¸ï¼ä»
ä»
ä¸ä¸ªï¼<literal>Session</literal>ç¸å
³èã
+ ä¸æ¦è¿ä¸ª<literal>Session</literal>被å
³éï¼è¿äºå¯¹è±¡å°±ä¼è±ç¦»æä¹
åç¶æï¼è¿æ ·å°±å¯è¢«åºç¨ç¨åºçä»»ä½å±èªç±ä½¿ç¨ã
+ ï¼ä¾å¦ï¼ç¨ä½è·è¡¨ç¤ºå±æ交éçæ°æ®ä¼ è¾å¯¹è±¡ãï¼
+ </para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>ç¬æ(transient)åè±ç®¡(detached)ç对象åå
¶éå</term>
+ <listitem>
+ <para>
+ é£äºç®å没æä¸sessionå
³èçæä¹
åç±»å®ä¾ã
+ ä»ä»¬å¯è½æ¯å¨è¢«åºç¨ç¨åºå®ä¾ååï¼å°æªè¿è¡æä¹
åç对象ã
+ ä¹å¯è½æ¯å 为å®ä¾åä»ä»¬ç<literal>Session</literal>å·²ç»è¢«å
³éèè±ç¦»æä¹
åç对象ã
+ </para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>äºå¡Transaction (<literal>org.hibernate.Transaction</literal>)</term>
+ <listitem>
+ <para>
+ ï¼å¯éçï¼åºç¨ç¨åºç¨æ¥æå®ååæä½åå
èå´ç对象ï¼å®æ¯å线ç¨çï¼çå½å¨æå¾çã
+ å®éè¿æ½è±¡å°åºç¨ä»åºå±å
·ä½çJDBCãJTA以åCORBAäºå¡é离å¼ã
+ æäºæ
åµä¸ï¼ä¸ä¸ª<literal>Session</literal>ä¹å
å¯è½å
å«å¤ä¸ª<literal>Transaction</literal>对象ã
+ 尽管æ¯å¦ä½¿ç¨è¯¥å¯¹è±¡æ¯å¯éçï¼ä½æ 论æ¯ä½¿ç¨åºå±çAPIè¿æ¯ä½¿ç¨<literal>Transaction</literal>对象ï¼äºå¡è¾¹ççå¼å¯ä¸å
³éæ¯å¿
ä¸å¯å°çã
+ </para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>ConnectionProvider (<literal>org.hibernate.connection.ConnectionProvider</literal>)</term>
+ <listitem>
+ <para>
+ ï¼å¯éçï¼çæJDBCè¿æ¥çå·¥åï¼åæ¶ä¹èµ·å°è¿æ¥æ± çä½ç¨ï¼ã
+ å®éè¿æ½è±¡å°åºç¨ä»åºå±ç<literal>Datasource</literal>æ<literal>DriverManager</literal>é离å¼ã
+ ä»
ä¾å¼åè
æ©å±/å®ç°ç¨ï¼å¹¶ä¸æ´é²ç»åºç¨ç¨åºä½¿ç¨ã
+ </para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>TransactionFactory (<literal>org.hibernate.TransactionFactory</literal>)</term>
+ <listitem>
+ <para>
+ ï¼å¯éçï¼çæ<literal>Transaction</literal>对象å®ä¾çå·¥åã
+ ä»
ä¾å¼åè
æ©å±/å®ç°ç¨ï¼å¹¶ä¸æ´é²ç»åºç¨ç¨åºä½¿ç¨ã
+ </para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term><emphasis>æ©å±æ¥å£</emphasis></term>
+ <listitem>
+ <para>
+ Hibernateæä¾äºå¾å¤å¯éçæ©å±æ¥å£ï¼ä½ å¯ä»¥éè¿å®ç°å®ä»¬æ¥å®å¶ä½ çæä¹
å±çè¡ä¸ºã
+ å
·ä½è¯·åèAPIææ¡£ã
+ </para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </para>
+
+ <para>
+ å¨ç¹å®âè½»åâçä½ç³»ç»æä¸ï¼åºç¨ç¨åºå¯è½ç»è¿
+ <literal>Transaction</literal>/<literal>TransactionFactory</literal> 以å
+ <literal>ConnectionProvider</literal> çAPIç´æ¥è·JTAæJDBCæ交éã
+ </para>
+ </sect1>
+
+ <sect1 id="architecture-states" revision="1">
+ <title>å®ä¾ç¶æ</title>
+ <para>
+ ä¸ä¸ªæä¹
åç±»çå®ä¾å¯è½å¤äºä¸ç§ä¸åç¶æä¸çæä¸ç§ã
+ è¿ä¸ç§ç¶æçå®ä¹åä¸æè°ç<emphasis>æä¹
åä¸ä¸æ(persistence context)</emphasis>æå
³ã
+ Hibernateç<literal>Session</literal>对象就æ¯è¿ä¸ªæè°çæä¹
åä¸ä¸æï¼
+ </para>
+
+ <variablelist spacing="compact">
+ <varlistentry>
+ <term>ç¬æï¼transientï¼</term>
+ <listitem>
+ <para>
+ 该å®ä¾ä»æªä¸ä»»ä½æä¹
åä¸ä¸æå
³èè¿ãå®æ²¡ææä¹
åæ è¯ï¼ç¸å½äºä¸»é®å¼ï¼ã
+ </para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>æä¹
å(persistent)</term>
+ <listitem>
+ <para>
+ å®ä¾ç®åä¸æ个æä¹
åä¸ä¸ææå
³èã
+ å®æ¥ææä¹
åæ è¯ï¼ç¸å½äºä¸»é®å¼ï¼ï¼å¹¶ä¸å¯è½å¨æ°æ®åºä¸æä¸ä¸ªå¯¹åºçè¡ã
+ 对äºæä¸ä¸ªç¹å®çæä¹
åä¸ä¸æï¼Hibernate<emphasis>ä¿è¯</emphasis>æä¹
åæ è¯ä¸Javaæ è¯ï¼å
¶å¼ä»£è¡¨å¯¹è±¡å¨å
åä¸çä½ç½®ï¼çä»·ã
+ </para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>è±ç®¡(detached)</term>
+ <listitem>
+ <para>
+ å®ä¾æ¾ç»ä¸æ个æä¹
åä¸ä¸æåçè¿å
³èï¼ä¸è¿é£ä¸ªä¸ä¸æ被å
³éäºï¼
+ æè
è¿ä¸ªå®ä¾æ¯è¢«åºåå(serialize)å°å¦å¤çè¿ç¨ã
+ å®æ¥ææä¹
åæ è¯ï¼å¹¶ä¸å¨æ°æ®åºä¸å¯è½åå¨ä¸ä¸ªå¯¹åºçè¡ã
+ 对äºè±ç®¡ç¶æçå®ä¾ï¼Hibernateä¸ä¿è¯ä»»ä½æä¹
åæ è¯åJavaæ è¯çå
³ç³»ã
+ </para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </sect1>
+
+ <sect1 id="architecture-jmx" revision="1">
+ <title>JMXæ´å</title>
+
+ <para>
+ JMXæ¯ç®¡çJavaç»ä»¶(Java components)çJ2EEæ åã Hibernate å¯ä»¥éè¿ä¸ä¸ªJMXæ åæå¡æ¥ç®¡çã
+ å¨è¿ä¸ªåè¡çæ¬ä¸ï¼æ们æä¾äºä¸ä¸ªMBeanæ¥å£çå®ç°,å³
+ <literal>org.hibernate.jmx.HibernateService</literal>ã
+ </para>
+
+ <para>
+ æ³è¦çå¦ä½å¨JBossåºç¨æå¡å¨ä¸å°Hibernateé¨ç½²ä¸ºä¸ä¸ªJMXæå¡çä¾åï¼æ¨å¯ä»¥åèJBossç¨æ·æåã
+ æ们ç°å¨è¯´ä¸ä¸å¨Jbossåºç¨æå¡å¨ä¸ï¼ä½¿ç¨JMXæ¥é¨ç½²Hibernateç好å¤ï¼
+ </para>
+
+ <itemizedlist>
+ <listitem>
+ <para>
+ <emphasis>Session管çï¼</emphasis> Hibernateç<literal>Session</literal>对象ççå½å¨æå¯ä»¥
+ èªå¨è·ä¸ä¸ªJTAäºå¡è¾¹çç»å®ãè¿æå³çä½ æ éæå·¥å¼å
³<literal>Session</literal>äº, è¿é¡¹
+ å·¥ä½ä¼ç±JBoss EJB æ¦æªå¨æ¥å®æãä½ åä¹ä¸ç¨æ
å¿ä½ ç代ç ä¸çäºå¡è¾¹çäº(é¤éä½ æ³å©ç¨Hibernateæä¾å¯é
+ ç<literal>Transaction</literal> APIæ¥èªå·±åä¸ä¸ªä¾¿äºç§»æ¤ççæä¹
å±)ã
+ ä½ éè¿è°ç¨<literal>HibernateContext</literal>æ¥è®¿é®<literal>Session</literal>ã
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ <emphasis>HAR é¨ç½²:</emphasis> é常æ
åµä¸ï¼ä½ ä¼ä½¿ç¨JBossçæå¡é¨ç½²æ述符ï¼å¨EARæ/åSARæ件ä¸ï¼æ¥é¨ç½²Hibernate JMXæå¡ã
+ è¿ç§é¨ç½²æ¹å¼æ¯æææ常è§çHibernate <literal>SessionFactory</literal>çé
ç½®é项ã
+ ä¸è¿ï¼ä½ ä»éå¨é¨ç½²æ述符ä¸ï¼ååºä½ ææçæ å°æ件çååãå¦æä½ ä½¿ç¨HARé¨ç½²æ¹å¼, JBoss
+ ä¼èªå¨æ¢æµåºä½ çHARæ件ä¸ææçæ å°æ件ã
+ </para>
+ </listitem>
+ </itemizedlist>
+
+ <para>
+ è¿äºé项æ´å¤çæè¿°ï¼è¯·åèJBoss åºç¨ç¨åºç¨æ·æåã
+ </para>
+
+ <para>
+ å°Hibernate以é¨ç½²ä¸ºJMXæå¡çå¦ä¸ä¸ªå¥½å¤ï¼æ¯å¯ä»¥æ¥çHibernateçè¿è¡æ¶ç»è®¡ä¿¡æ¯ãåç
+ <xref linkend="configuration-optional-statistics"/>.
+ </para>
+ </sect1>
+
+ <sect1 id="architecture-jca" revision="1">
+ <title>对JCAçæ¯æ</title>
+ <para>
+ Hibernateä¹å¯ä»¥è¢«é
置为ä¸ä¸ªJCAè¿æ¥å¨ï¼JCA connectorï¼ãæ´å¤ä¿¡æ¯è¯·åçç½ç«ã
+ 请注æï¼Hibernate对JCAçæ¯æï¼ä»å¤äºå®éªæ§é¶æ®µã
+ </para>
+ </sect1>
+ <sect1 id="architecture-current-session" revision="2">
+ <title>ä¸ä¸æç¸å
³çï¼Contextualï¼Session</title>
+ <para>
+ 使ç¨Hibernateç大å¤æ°åºç¨ç¨åºéè¦æç§å½¢å¼çâä¸ä¸æç¸å
³çâ sessionï¼ç¹å®çsessionå¨æ´ä¸ªç¹å®çä¸ä¸æèå´å
å§ç»ææãç¶èï¼å¯¹ä¸åç±»åçåºç¨ç¨åºèè¨ï¼è¦ä¸ºä»ä¹æ¯ç»æè¿ç§âä¸ä¸æâä¸ä¸ä¸ªå®ä¹é常æ¯å°é¾çï¼ä¸åçä¸ä¸æ对âå½åâè¿ä¸ªæ¦å¿µå®ä¹äºä¸åçèå´ãå¨3.0çæ¬ä¹åï¼ä½¿ç¨Hibernateçç¨åºè¦ä¹éç¨èªè¡ç¼åçåºäº<literal>ThreadLocal</literal>çä¸ä¸æsessionï¼è¦ä¹éç¨<literal>HibernateUtil</literal>è¿æ ·çè¾
å©ç±»ï¼è¦ä¹éç¨ç¬¬ä¸æ¹æ¡æ¶ï¼æ¯å¦SpringæPico)ï¼å®ä»¬æä¾äºåºäºä»£ç(proxy)æè
åºäºæ¦æªå¨(interception)çä¸ä¸æç¸å
³sessionã
+ </para>
+ <para>
+ ä»3.0.1çæ¬å¼å§ï¼Hibernateå¢å äº<literal>SessionFactory.getCurrentSession()</literal>æ¹æ³ãä¸å¼å§ï¼å®åå®äºéç¨<literal>JTA</literal>äºå¡ï¼<literal>JTA</literal>äºå¡å®ä¹äºå½åsessionçèå´åä¸ä¸æ(scope and context)ãHibernateå¼åå¢éåä¿¡ï¼å 为æ好å 个ç¬ç«ç<literal>JTA TransactionManager</literal>å®ç°ç¨³å®å¯ç¨ï¼ä¸è®ºæ¯å¦è¢«é¨ç½²å°ä¸ä¸ª<literal>J2EE</literal>容å¨ä¸ï¼å¤§å¤æ°(åè¥ä¸æ¯ææçï¼åºç¨ç¨åºé½åºè¯¥éç¨<literal>JTA</literal>äºå¡ç®¡çãåºäºè¿ä¸ç¹ï¼éç¨<literal>JTA</literal>çä¸ä¸æç¸å
³sessionå¯ä»¥æ»¡è¶³ä½ ä¸åéè¦ã
+ </para>
+ <para>
+ æ´å¥½çæ¯ï¼ä»3.1å¼å§ï¼<literal>SessionFactory.getCurrentSession()</literal>çåå°å®ç°æ¯å¯ææçãå æ¤ï¼æ们å¼å
¥äºæ°çæ©å±æ¥å£(<literal>org.hibernate.context.CurrentSessionContext</literal>)åæ°çé
ç½®åæ°(<literal>hibernate.current_session_context_class</literal>)ï¼ä»¥ä¾¿å¯¹ä»ä¹æ¯âå½åsessionâçèå´åä¸ä¸æ(scope and context)çå®ä¹è¿è¡ææã
+ </para>
+ <para>
+ 请åé
<literal>org.hibernate.context.CurrentSessionContext</literal>æ¥å£çJavadoc,é£éæå
³äºå®çå¥çº¦ç详ç»è®¨è®ºãå®å®ä¹äºåä¸çæ¹æ³ï¼<literal>currentSession()</literal>ï¼ç¹å®çå®ç°ç¨å®æ¥è´è´£è·è¸ªå½åçä¸ä¸æsessionãHibernateå
ç½®äºæ¤æ¥å£çä¸ç§å®ç°ã
+ </para>
+
+ <itemizedlist>
+ <listitem>
+ <para>
+ <literal>org.hibernate.context.JTASessionContext</literal> - å½åsessionæ ¹æ®<literal>JTA</literal>æ¥è·è¸ªåçå®ãè¿å以åçä»
æ¯æJTAçæ¹æ³æ¯å®å
¨ä¸æ ·çã详æ
请åé
Javadocã
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ <literal>org.hibernate.context.ThreadLocalSessionContext</literal> - å½åsessionéè¿å½åæ§è¡ç线ç¨æ¥è·è¸ªåçå®ã详æ
ä¹è¯·åé
Javadocã
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ <literal>org.hibernate.context.ManagedSessionContext</literal> - å½åsessionéè¿å½åæ§è¡ç线ç¨æ¥è·è¸ªåçå®ãä½æ¯ï¼ä½ éè¦è´è´£ä½¿ç¨è¿ä¸ªç±»çéææ¹æ³å°<literal>Session</literal>å®ä¾ç»å®ãæè
åæ¶ç»å®ï¼å®å¹¶ä¸ä¼æå¼(open)ãflushæè
å
³é(close)ä»»ä½<literal>Session</literal>ã
+ </para>
+ </listitem>
+ </itemizedlist>
+
+ <para>
+ å两ç§å®ç°é½æä¾äºâæ¯æ°æ®åºäºå¡å¯¹åºä¸ä¸ªsessionâçç¼ç¨æ¨¡åï¼ä¹ç§°ä½<emphasis>æ¯æ¬¡è¯·æ±ä¸ä¸ªsession</emphasis>ãHibernate sessionçèµ·å§åç»ç»ç±æ°æ®åºäºå¡ççåæ¥æ§å¶ãåè¥ä½ å¨çº¯ç²¹ç Java SEä¹ä¸éç¨èªè¡ç¼å代ç æ¥ç®¡çäºå¡,èä¸ä½¿ç¨JTAï¼å»ºè®®ä½ 使ç¨Hibernate <literal>Transaction</literal> APIæ¥æåºå±äºå¡å®ç°ä»ä½ ç代ç ä¸éèæãå¦æä½ ä½¿ç¨JTAï¼è¯·ä½¿ç¨JTAåå£æ¥ç®¡çTransactionãå¦æä½ å¨æ¯æCMTçEJB容å¨ä¸æ§è¡ä»£ç ï¼äºå¡è¾¹çæ¯å£°æå¼å®ä¹çï¼ä½ ä¸éè¦å¨ä»£ç ä¸è¿è¡ä»»ä½äºå¡æsession管çæä½ã请åé
<xref linkend="transactions"/>ä¸èæ¥é
读æ´å¤çå
容å示ä¾ä»£ç ã
+ </para>
+
+ <para>
+ <literal>hibernate.current_session_context_class</literal>é
ç½®åæ°å®ä¹äºåºè¯¥éç¨åªä¸ª<literal>org.hibernate.context.CurrentSessionContext</literal>å®ç°ã注æï¼ä¸ºäºåä¸å
¼å®¹ï¼å¦ææªé
ç½®æ¤åæ°ï¼ä½æ¯åå¨<literal>org.hibernate.transaction.TransactionManagerLookup</literal>çé
ç½®ï¼Hibernateä¼éç¨<literal>org.hibernate.context.JTASessionContext</literal>ãä¸è¬èè¨ï¼æ¤åæ°çå¼ææäºè¦ä½¿ç¨çå®ç°ç±»çå
¨åï¼ä½é£ä¸ç§å
ç½®çå®ç°å¯ä»¥ä½¿ç¨ç®åï¼å³"jta"ã"thread"å"managed"ã
+
+ </para>
+
+ </sect1>
+
+</chapter>
+
+
Copied: core/trunk/documentation/manual/zh-CN/src/main/docbook/content/association_mapping.xml (from rev 14080, core/trunk/documentation/manual/zh-CN/src/main/docbook/modules/association_mapping.xml)
===================================================================
--- core/trunk/documentation/manual/zh-CN/src/main/docbook/content/association_mapping.xml (rev 0)
+++ core/trunk/documentation/manual/zh-CN/src/main/docbook/content/association_mapping.xml 2007-10-09 20:10:34 UTC (rev 14081)
@@ -0,0 +1,579 @@
+<chapter id="associations">
+
+ <title>å
³èå
³ç³»æ å°</title>
+
+ <sect1 id="assoc-intro" revision="1">
+ <title>ä»ç»</title>
+
+ <para>
+ å
³èå
³ç³»æ å°é常æ
åµæ¯æé¾é
ç½®æ£ç¡®çãå¨è¿ä¸ªé¨åä¸ï¼æ们ä»ååå
³ç³»æ å°å¼å§ï¼ç¶åèèååå
³ç³»æ å°ï¼ç±æµ
è³æ·±è®²è¿°ä¸éå
¸åçæ¡ä¾ãå¨ææçä¾åä¸ï¼æ们é½ä½¿ç¨ <literal>Person</literal>å<literal>Address</literal>ã
+ </para>
+
+ <para>
+ æä»¬æ ¹æ®æ å°å
³ç³»æ¯å¦æ¶åè¿æ¥è¡¨ä»¥åå¤æ ·æ§æ¥ååå
³èç±»åã
+ </para>
+
+ <para>
+ å¨ä¼ ç»çæ°æ®å»ºæ¨¡ä¸ï¼å
许为Nullå¼çå¤é®è¢«è®¤ä¸ºæ¯ä¸ç§ä¸å¥½çå®è·µï¼å æ¤æ们ææçä¾åä¸é½ä½¿ç¨ä¸å
许为Nullçå¤é®ãè¿å¹¶ä¸æ¯Hibernateçè¦æ±ï¼å³ä½¿ä½ å é¤æä¸å
许为Nullç约æï¼Hibernateæ å°ä¸æ ·å¯ä»¥å·¥ä½çå¾å¥½ã
+ </para>
+
+ </sect1>
+
+ <sect1 id="assoc-unidirectional" revision="1">
+ <title>ååå
³èï¼Unidirectional associationsï¼</title>
+
+ <sect2 id="assoc-unidirectional-m21">
+ <title>å¤å¯¹ä¸(many to one)</title>
+
+ <para>
+ <emphasis>ååmany-to-oneå
³è</emphasis>æ¯æ常è§çååå
³èå
³ç³»ã
+ </para>
+
+ <programlisting><![CDATA[<class name="Person">
+ <id name="id" column="personId">
+ <generator class="native"/>
+ </id>
+ <many-to-one name="address"
+ column="addressId"
+ not-null="true"/>
+</class>
+
+<class name="Address">
+ <id name="id" column="addressId">
+ <generator class="native"/>
+ </id>
+</class>]]></programlisting>
+ <programlisting><![CDATA[
+create table Person ( personId bigint not null primary key, addressId bigint not null )
+create table Address ( addressId bigint not null primary key )
+ ]]></programlisting>
+
+ </sect2>
+
+ <sect2 id="assoc-unidirectional-121">
+ <title>ä¸å¯¹ä¸ï¼one to oneï¼</title>
+
+ <para>
+ <emphasis>åºäºå¤é®å
³èçååä¸å¯¹ä¸å
³è</emphasis>å<emphasis>ååå¤å¯¹ä¸å
³è</emphasis>å ä¹æ¯ä¸æ ·çãå¯ä¸çä¸åå°±æ¯ååä¸å¯¹ä¸å
³èä¸çå¤é®å段å
·æå¯ä¸æ§çº¦æã
+ </para>
+
+ <programlisting><![CDATA[<class name="Person">
+ <id name="id" column="personId">
+ <generator class="native"/>
+ </id>
+ <many-to-one name="address"
+ column="addressId"
+ unique="true"
+ not-null="true"/>
+</class>
+
+<class name="Address">
+ <id name="id" column="addressId">
+ <generator class="native"/>
+ </id>
+</class>]]></programlisting>
+ <programlisting><![CDATA[
+create table Person ( personId bigint not null primary key, addressId bigint not null unique )
+create table Address ( addressId bigint not null primary key )
+ ]]></programlisting>
+
+ <para>
+ <emphasis>åºäºä¸»é®å
³èçååä¸å¯¹ä¸å
³è</emphasis>é常使ç¨ä¸ä¸ªç¹å®çidçæå¨ãï¼è¯·æ³¨æï¼å¨è¿ä¸ªä¾åä¸æ们ææ¢äºå
³èçæ¹åãï¼
+ </para>
+
+ <programlisting><![CDATA[<class name="Person">
+ <id name="id" column="personId">
+ <generator class="native"/>
+ </id>
+</class>
+
+<class name="Address">
+ <id name="id" column="personId">
+ <generator class="foreign">
+ <param name="property">person</param>
+ </generator>
+ </id>
+ <one-to-one name="person" constrained="true"/>
+</class>]]></programlisting>
+ <programlisting><![CDATA[
+create table Person ( personId bigint not null primary key )
+create table Address ( personId bigint not null primary key )
+ ]]></programlisting>
+
+ </sect2>
+
+ <sect2 id="assoc-unidirectional-12m">
+ <title>ä¸å¯¹å¤ï¼one to manyï¼</title>
+
+ <para>
+ <emphasis>åºäºå¤é®å
³èçååä¸å¯¹å¤å
³è</emphasis>æ¯ä¸ç§å¾å°è§çæ
åµï¼å¹¶ä¸æ¨è使ç¨ã
+ </para>
+
+ <programlisting><![CDATA[<class name="Person">
+ <id name="id" column="personId">
+ <generator class="native"/>
+ </id>
+ <set name="addresses">
+ <key column="personId"
+ not-null="true"/>
+ <one-to-many class="Address"/>
+ </set>
+</class>
+
+<class name="Address">
+ <id name="id" column="addressId">
+ <generator class="native"/>
+ </id>
+</class>]]></programlisting>
+ <programlisting><![CDATA[
+create table Person ( personId bigint not null primary key )
+create table Address ( addressId bigint not null primary key, personId bigint not null )
+ ]]></programlisting>
+
+ <para>
+ æ们认为对äºè¿ç§å
³èå
³ç³»æ好使ç¨è¿æ¥è¡¨ã
+ </para>
+
+ </sect2>
+
+ </sect1>
+
+ <sect1 id="assoc-unidirectional-join" revision="1">
+ <title>使ç¨è¿æ¥è¡¨çååå
³èï¼Unidirectional associations with join tablesï¼</title>
+
+ <sect2 id="assoc-unidirectional-join-12m">
+ <title>ä¸å¯¹å¤(one to many)</title>
+
+ <para>
+ <emphasis>åºäºè¿æ¥è¡¨çååä¸å¯¹å¤å
³è</emphasis> åºè¯¥ä¼å
被éç¨ã请注æï¼éè¿æå®<literal>unique="true"</literal>ï¼æ们å¯ä»¥æå¤æ ·æ§ä»å¤å¯¹å¤æ¹å为ä¸å¯¹å¤ã
+ </para>
+
+ <programlisting><![CDATA[<class name="Person">
+ <id name="id" column="personId">
+ <generator class="native"/>
+ </id>
+ <set name="addresses" table="PersonAddress">
+ <key column="personId"/>
+ <many-to-many column="addressId"
+ unique="true"
+ class="Address"/>
+ </set>
+</class>
+
+<class name="Address">
+ <id name="id" column="addressId">
+ <generator class="native"/>
+ </id>
+</class>]]></programlisting>
+ <programlisting><![CDATA[
+create table Person ( personId bigint not null primary key )
+create table PersonAddress ( personId not null, addressId bigint not null primary key )
+create table Address ( addressId bigint not null primary key )
+ ]]></programlisting>
+
+ </sect2>
+
+ <sect2 id="assoc-unidirectional-join-m21">
+ <title>å¤å¯¹ä¸ï¼many to oneï¼</title>
+
+ <para>
+ <emphasis>åºäºè¿æ¥è¡¨çååå¤å¯¹ä¸å
³è</emphasis>å¨å
³èå
³ç³»å¯éçæ
åµä¸åºç¨ä¹å¾æ®éã
+ </para>
+
+ <programlisting><![CDATA[<class name="Person">
+ <id name="id" column="personId">
+ <generator class="native"/>
+ </id>
+ <join table="PersonAddress"
+ optional="true">
+ <key column="personId" unique="true"/>
+ <many-to-one name="address"
+ column="addressId"
+ not-null="true"/>
+ </join>
+</class>
+
+<class name="Address">
+ <id name="id" column="addressId">
+ <generator class="native"/>
+ </id>
+</class>]]></programlisting>
+ <programlisting><![CDATA[
+create table Person ( personId bigint not null primary key )
+create table PersonAddress ( personId bigint not null primary key, addressId bigint not null )
+create table Address ( addressId bigint not null primary key )
+ ]]></programlisting>
+
+ </sect2>
+
+ <sect2 id="assoc-unidirectional-join-121">
+ <title>ä¸å¯¹ä¸ï¼one to oneï¼</title>
+
+ <para>
+ <emphasis>åºäºè¿æ¥è¡¨çååä¸å¯¹ä¸å
³è</emphasis>é常å°è§ï¼ä½ä¹æ¯å¯è¡çã
+ </para>
+
+ <programlisting><![CDATA[<class name="Person">
+ <id name="id" column="personId">
+ <generator class="native"/>
+ </id>
+ <join table="PersonAddress"
+ optional="true">
+ <key column="personId"
+ unique="true"/>
+ <many-to-one name="address"
+ column="addressId"
+ not-null="true"
+ unique="true"/>
+ </join>
+</class>
+
+<class name="Address">
+ <id name="id" column="addressId">
+ <generator class="native"/>
+ </id>
+</class>]]></programlisting>
+ <programlisting><![CDATA[
+create table Person ( personId bigint not null primary key )
+create table PersonAddress ( personId bigint not null primary key, addressId bigint not null unique )
+create table Address ( addressId bigint not null primary key )
+ ]]></programlisting>
+
+ </sect2>
+
+ <sect2 id="assoc-unidirectional-join-m2m">
+ <title>å¤å¯¹å¤ï¼many to manyï¼</title>
+
+ <para>
+ æåï¼è¿æ <emphasis>ååå¤å¯¹å¤å
³è</emphasis>.
+ </para>
+
+ <programlisting><![CDATA[<class name="Person">
+ <id name="id" column="personId">
+ <generator class="native"/>
+ </id>
+ <set name="addresses" table="PersonAddress">
+ <key column="personId"/>
+ <many-to-many column="addressId"
+ class="Address"/>
+ </set>
+</class>
+
+<class name="Address">
+ <id name="id" column="addressId">
+ <generator class="native"/>
+ </id>
+</class>]]></programlisting>
+ <programlisting><![CDATA[
+create table Person ( personId bigint not null primary key )
+create table PersonAddress ( personId bigint not null, addressId bigint not null, primary key (personId, addressId) )
+create table Address ( addressId bigint not null primary key )
+ ]]></programlisting>
+
+ </sect2>
+
+ </sect1>
+
+ <sect1 id="assoc-bidirectional" revision="1">
+ <title>ååå
³èï¼Bidirectional associationsï¼</title>
+
+ <sect2 id="assoc-bidirectional-m21" revision="2">
+ <title>ä¸å¯¹å¤ï¼one to many) / å¤å¯¹ä¸ï¼many to oneï¼</title>
+
+ <para>
+ <emphasis>ååå¤å¯¹ä¸å
³è</emphasis> æ¯æ常è§çå
³èå
³ç³»ãï¼è¿ä¹æ¯æ åçç¶/åå
³èå
³ç³»ãï¼
+ </para>
+
+ <programlisting><![CDATA[<class name="Person">
+ <id name="id" column="personId">
+ <generator class="native"/>
+ </id>
+ <many-to-one name="address"
+ column="addressId"
+ not-null="true"/>
+</class>
+
+<class name="Address">
+ <id name="id" column="addressId">
+ <generator class="native"/>
+ </id>
+ <set name="people" inverse="true">
+ <key column="addressId"/>
+ <one-to-many class="Person"/>
+ </set>
+</class>]]></programlisting>
+
+ <programlisting><![CDATA[
+create table Person ( personId bigint not null primary key, addressId bigint not null )
+create table Address ( addressId bigint not null primary key )
+ ]]></programlisting>
+
+ <para>
+ å¦æä½ ä½¿ç¨<literal>List</literal>(æè
å
¶ä»æåºéåç±»)ï¼ä½ éè¦è®¾ç½®å¤é®å¯¹åºç<literal>key</literal>å为 <literal>not null</literal>,让Hibernateæ¥ä»éå端管çå
³èï¼ç»´æ¤æ¯ä¸ªå
ç´ çç´¢å¼ï¼éè¿è®¾ç½®<literal>update="false"</literal> and <literal>insert="false"</literal>æ¥å¯¹å¦ä¸ç«¯ååæä½ï¼ã
+ </para>
+
+ <programlisting><![CDATA[<class name="Person">
+ <id name="id"/>
+ ...
+ <many-to-one name="address"
+ column="addressId"
+ not-null="true"
+ insert="false"
+ update="false"/>
+</class>
+
+<class name="Address">
+ <id name="id"/>
+ ...
+ <list name="people">
+ <key column="addressId" not-null="true"/>
+ <list-index column="peopleIdx"/>
+ <one-to-many class="Person"/>
+ </list>
+</class>]]></programlisting>
+
+ <para>
+ åè¥éåæ å°ç<literal><key></literal>å
ç´ å¯¹åºçåºå±å¤é®å段æ¯<literal>NOT NULL</literal>çï¼é£ä¹ä¸ºè¿ä¸keyå
ç´ å®ä¹<literal>not-null="true"</literal>æ¯å¾éè¦çãä¸è¦ä»
ä»
为å¯è½çåµå¥<literal><column></literal>å
ç´ å®ä¹<literal>not-null="true"</literal>ï¼<literal><key></literal>å
ç´ ä¹æ¯éè¦çã
+ </para>
+
+ </sect2>
+
+ <sect2 id="assoc-bidirectional-121">
+ <title>ä¸å¯¹ä¸ï¼one to oneï¼</title>
+
+ <para>
+ <emphasis>åºäºå¤é®å
³èçååä¸å¯¹ä¸å
³è</emphasis>ä¹å¾å¸¸è§ã
+ </para>
+
+ <programlisting><![CDATA[<class name="Person">
+ <id name="id" column="personId">
+ <generator class="native"/>
+ </id>
+ <many-to-one name="address"
+ column="addressId"
+ unique="true"
+ not-null="true"/>
+</class>
+
+<class name="Address">
+ <id name="id" column="addressId">
+ <generator class="native"/>
+ </id>
+ <one-to-one name="person"
+ property-ref="address"/>
+</class>]]></programlisting>
+ <programlisting><![CDATA[
+create table Person ( personId bigint not null primary key, addressId bigint not null unique )
+create table Address ( addressId bigint not null primary key )
+ ]]></programlisting>
+
+ <para>
+ <emphasis>åºäºä¸»é®å
³èçä¸å¯¹ä¸å
³è</emphasis>éè¦ä½¿ç¨ç¹å®çidçæå¨ã
+ </para>
+
+ <programlisting><![CDATA[<class name="Person">
+ <id name="id" column="personId">
+ <generator class="native"/>
+ </id>
+ <one-to-one name="address"/>
+</class>
+
+<class name="Address">
+ <id name="id" column="personId">
+ <generator class="foreign">
+ <param name="property">person</param>
+ </generator>
+ </id>
+ <one-to-one name="person"
+ constrained="true"/>
+</class>]]></programlisting>
+ <programlisting><![CDATA[
+create table Person ( personId bigint not null primary key )
+create table Address ( personId bigint not null primary key )
+ ]]></programlisting>
+
+ </sect2>
+
+ </sect1>
+
+ <sect1 id="assoc-bidirectional-join" revision="1">
+ <title>使ç¨è¿æ¥è¡¨çååå
³èï¼Bidirectional associations with join tablesï¼</title>
+
+ <sect2 id="assoc-bidirectional-join-12m">
+ <title>ä¸å¯¹å¤ï¼one to manyï¼ /å¤å¯¹ä¸ï¼ many to oneï¼</title>
+
+ <para>
+ <emphasis>åºäºè¿æ¥è¡¨çååä¸å¯¹å¤å
³è</emphasis>ã注æ<literal>inverse="true"</literal>å¯ä»¥åºç°å¨å
³èçä»»æä¸ç«¯ï¼å³collection端æè
join端ã
+ </para>
+
+ <programlisting><![CDATA[<class name="Person">
+ <id name="id" column="personId">
+ <generator class="native"/>
+ </id>
+ <set name="addresses"
+ table="PersonAddress">
+ <key column="personId"/>
+ <many-to-many column="addressId"
+ unique="true"
+ class="Address"/>
+ </set>
+</class>
+
+<class name="Address">
+ <id name="id" column="addressId">
+ <generator class="native"/>
+ </id>
+ <join table="PersonAddress"
+ inverse="true"
+ optional="true">
+ <key column="addressId"/>
+ <many-to-one name="person"
+ column="personId"
+ not-null="true"/>
+ </join>
+</class>]]></programlisting>
+ <programlisting><![CDATA[
+create table Person ( personId bigint not null primary key )
+create table PersonAddress ( personId bigint not null, addressId bigint not null primary key )
+create table Address ( addressId bigint not null primary key )
+ ]]></programlisting>
+
+ </sect2>
+
+ <sect2 id="assoc-bidirectional-join-121">
+ <title>ä¸å¯¹ä¸ï¼one to oneï¼</title>
+
+ <para>
+ <emphasis>åºäºè¿æ¥è¡¨çååä¸å¯¹ä¸å
³è</emphasis>æ为ç½è§ï¼ä½ä¹æ¯å¯è¡çã
+ </para>
+
+ <programlisting><![CDATA[<class name="Person">
+ <id name="id" column="personId">
+ <generator class="native"/>
+ </id>
+ <join table="PersonAddress"
+ optional="true">
+ <key column="personId"
+ unique="true"/>
+ <many-to-one name="address"
+ column="addressId"
+ not-null="true"
+ unique="true"/>
+ </join>
+</class>
+
+<class name="Address">
+ <id name="id" column="addressId">
+ <generator class="native"/>
+ </id>
+ <join table="PersonAddress"
+ optional="true"
+ inverse="true">
+ <key column="addressId"
+ unique="true"/>
+ <many-to-one name="person"
+ column="personId"
+ not-null="true"
+ unique="true"/>
+ </join>
+</class>]]></programlisting>
+ <programlisting><![CDATA[
+create table Person ( personId bigint not null primary key )
+create table PersonAddress ( personId bigint not null primary key, addressId bigint not null unique )
+create table Address ( addressId bigint not null primary key )
+ ]]></programlisting>
+
+ </sect2>
+
+ <sect2 id="assoc-bidirectional-join-m2m" revision="1">
+ <title>å¤å¯¹å¤ï¼many to manyï¼</title>
+
+ <para>
+ æåï¼è¿æ <emphasis>ååå¤å¯¹å¤å
³è</emphasis>.
+ </para>
+
+ <programlisting><![CDATA[<class name="Person">
+ <id name="id" column="personId">
+ <generator class="native"/>
+ </id>
+ <set name="addresses" table="PersonAddress">
+ <key column="personId"/>
+ <many-to-many column="addressId"
+ class="Address"/>
+ </set>
+</class>
+
+<class name="Address">
+ <id name="id" column="addressId">
+ <generator class="native"/>
+ </id>
+ <set name="people" inverse="true" table="PersonAddress">
+ <key column="addressId"/>
+ <many-to-many column="personId"
+ class="Person"/>
+ </set>
+</class>]]></programlisting>
+
+ <programlisting><![CDATA[
+create table Person ( personId bigint not null primary key )
+create table PersonAddress ( personId bigint not null, addressId bigint not null, primary key (personId, addressId) )
+create table Address ( addressId bigint not null primary key )
+ ]]></programlisting>
+
+ </sect2>
+
+ </sect1>
+ <sect1 id="assoc-complex">
+ <title>æ´å¤æçå
³èæ å°</title>
+
+ <para>
+ æ´å¤æçå
³èè¿æ¥<emphasis>æ为</emphasis>ç½è§ã
+ éè¿å¨æ å°ææ¡£ä¸åµå
¥SQLçæï¼Hibernateä¹å¯ä»¥å¤çæ´ä¸ºå¤æçæ
åµãæ¯å¦ï¼åè¥å
å«åå²å¸æ·æ°æ®ç表å®ä¹äº<literal>accountNumber</literal>, <literal>effectiveEndDate</literal> å<literal>effectiveStartDate</literal>å段ï¼æç
§ä¸é¢æ å°ï¼
+ </para>
+
+ <programlisting><![CDATA[<properties name="currentAccountKey">
+ <property name="accountNumber" type="string" not-null="true"/>
+ <property name="currentAccount" type="boolean">
+ <formula>case when effectiveEndDate is null then 1 else 0 end</formula>
+ </property>
+</properties>
+<property name="effectiveEndDate" type="date"/>
+<property name="effectiveStateDate" type="date" not-null="true"/>]]></programlisting>
+
+ <para>
+ é£ä¹æ们å¯ä»¥å¯¹<emphasis>ç®å(current)</emphasis>å®ä¾(å
¶<literal>effectiveEndDate</literal>为null)使ç¨è¿æ ·çå
³èæ å°:
+ </para>
+
+ <programlisting><![CDATA[<many-to-one name="currentAccountInfo"
+ property-ref="currentAccountKey"
+ class="AccountInfo">
+ <column name="accountNumber"/>
+ <formula>'1'</formula>
+</many-to-one>]]></programlisting>
+
+ <para>
+ æ´å¤æçä¾å,åæ³<literal>Employee</literal>å<literal>Organization</literal>ä¹é´çå
³èæ¯éè¿ä¸ä¸ª<literal>Employment</literal>ä¸é´è¡¨ç»´æ¤ç,èä¸é´è¡¨ä¸å¡«å
äºå¾å¤åå²éåæ°æ®ãé£âéåç<emphasis>ææ°</emphasis>é主âè¿ä¸ªå
³èï¼ææ°é主就æ¯<literal>startDate</literal>æåçé£ä¸ªï¼å¯ä»¥è¿æ ·æ å°ï¼
+ </para>
+
+ <programlisting><![CDATA[<join>
+ <key column="employeeId"/>
+ <subselect>
+ select employeeId, orgId
+ from Employments
+ group by orgId
+ having startDate = max(startDate)
+ </subselect>
+ <many-to-one name="mostRecentEmployer"
+ class="Organization"
+ column="orgId"/>
+</join>]]></programlisting>
+
+ <para>
+ 使ç¨è¿ä¸åè½æ¶å¯ä»¥å
满åæï¼ä½é常æ´å å®ç¨çæ¯ç¨HQLææ¡ä»¶æ¥è¯¢æ¥å¤çè¿äºæ
å½¢ã
+ </para>
+
+ </sect1>
+
+
+</chapter>
+
Copied: core/trunk/documentation/manual/zh-CN/src/main/docbook/content/basic_mapping.xml (from rev 14080, core/trunk/documentation/manual/zh-CN/src/main/docbook/modules/basic_mapping.xml)
===================================================================
--- core/trunk/documentation/manual/zh-CN/src/main/docbook/content/basic_mapping.xml (rev 0)
+++ core/trunk/documentation/manual/zh-CN/src/main/docbook/content/basic_mapping.xml 2007-10-09 20:10:34 UTC (rev 14081)
@@ -0,0 +1,2982 @@
+<chapter id="mapping">
+ <title>对象/å
³ç³»æ°æ®åºæ å°åºç¡(Basic O/R Mapping)</title>
+
+ <sect1 id="mapping-declaration" revision="1">
+ <title>æ å°å®ä¹ï¼Mapping declarationï¼</title>
+
+ <para>
+ 对象åå
³ç³»æ°æ®åºä¹é´çæ å°é常æ¯ç¨ä¸ä¸ªXMLææ¡£(XML document)æ¥å®ä¹çãè¿ä¸ªæ å°æ档被设计为æ读çï¼
+ 并ä¸å¯ä»¥æ工修æ¹ãæ å°è¯è¨æ¯ä»¥Java为ä¸å¿ï¼è¿æå³çæ å°ææ¡£æ¯æç
§æä¹
åç±»çå®ä¹æ¥å建çï¼
+ èé表çå®ä¹ã
+ </para>
+
+
+ <para>
+ 请注æï¼è½ç¶å¾å¤Hibernateç¨æ·éæ©æåXMLæ å°ææ¡£ï¼ä½ä¹æä¸äºå·¥å
·å¯ä»¥ç¨æ¥çææ å°ææ¡£ï¼
+ å
æ¬XDoclet,MiddlegenåAndroMDAã
+ </para>
+
+ <para>
+ 让æ们ä»ä¸ä¸ªæ å°çä¾åå¼å§ï¼
+ </para>
+
+ <programlisting id="mapping-declaration-ex1" revision="1"><![CDATA[<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC
+ "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+ "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<hibernate-mapping package="eg">
+
+ <class name="Cat"
+ table="cats"
+ discriminator-value="C">
+
+ <id name="id">
+ <generator class="native"/>
+ </id>
+
+ <discriminator column="subclass"
+ type="character"/>
+
+ <property name="weight"/>
+
+ <property name="birthdate"
+ type="date"
+ not-null="true"
+ update="false"/>
+
+ <property name="color"
+ type="eg.types.ColorUserType"
+ not-null="true"
+ update="false"/>
+
+ <property name="sex"
+ not-null="true"
+ update="false"/>
+
+ <property name="litterId"
+ column="litterId"
+ update="false"/>
+
+ <many-to-one name="mother"
+ column="mother_id"
+ update="false"/>
+
+ <set name="kittens"
+ inverse="true"
+ order-by="litter_id">
+ <key column="mother_id"/>
+ <one-to-many class="Cat"/>
+ </set>
+
+ <subclass name="DomesticCat"
+ discriminator-value="D">
+
+ <property name="name"
+ type="string"/>
+
+ </subclass>
+
+ </class>
+
+ <class name="Dog">
+ <!-- mapping for Dog could go here -->
+ </class>
+
+</hibernate-mapping>]]></programlisting>
+
+ <para>
+ æ们ç°å¨å¼å§è®¨è®ºæ å°ææ¡£çå
容ãæ们åªæè¿°Hibernateå¨è¿è¡æ¶ç¨å°çææ¡£å
ç´ åå±æ§ã
+ æ å°ææ¡£è¿å
æ¬ä¸äºé¢å¤çå¯éå±æ§åå
ç´ ï¼å®ä»¬å¨ä½¿ç¨schema导åºå·¥å
·çæ¶åä¼å½±å导åºçæ°æ®åºschemaç»æã
+ ï¼æ¯å¦ï¼<literal> not-null</literal> å±æ§ãï¼
+ </para>
+
+
+
+ <sect2 id="mapping-declaration-doctype" revision="3">
+ <title>Doctype</title>
+
+ <para>
+ ææçXMLæ å°é½éè¦å®ä¹å¦ä¸æ示çdoctypeãDTDå¯ä»¥ä»ä¸è¿°URLä¸è·åï¼
+ ä¹å¯ä»¥ä»<literal>hibernate-x.x.x/src/net/sf/hibernate</literal>ç®å½ä¸ã
+ æ<literal>hibernate.jar</literal>æ件ä¸æ¾å°ãHibernateæ»æ¯ä¼é¦å
å¨å®çclassptahä¸æç´¢DTDæ件ã
+ å¦æä½ åç°å®æ¯éè¿è¿æ¥Internetæ¥æ¾DTDæ件ï¼å°±å¯¹ç
§ä½ çclasspathç®å½æ£æ¥XMLæ件éçDTD声æã
+ </para>
+
+ <sect3 id="mapping-declaration-entity-resolution">
+ <title>EntityResolver</title>
+ <para>
+ As mentioned previously, Hibernate will first attempt to resolve DTDs in its classpath. The
+ manner in which it does this is by registering a custom <literal>org.xml.sax.EntityResolver</literal>
+ implementation with the SAXReader it uses to read in the xml files. This custom
+ <literal>EntityResolver</literal> recognizes two different systemId namespaces.
+ å¦åæè¿°,Hibernateé¦å
å¨å
¶classpathä¸æ¥æ¾DTDãå
¶è¡ä¸ºæ¯ä¾é å¨ç³»ç»ä¸æ³¨åç<literal>org.xml.sax.EntityResolver</literal>çä¸ä¸ªå
·ä½å®ç°ï¼SAXReaderä¾é å®æ¥è¯»åxmlæ件ãè¿ä¸ <literal>EntityResolver</literal> å®ç°è½è¾¨è®¤ä¸¤ç§ä¸åç systenIdå½å空é´ã
+ </para>
+ <itemizedlist>
+ <listitem>
+ <para>
+ è¥resolveréå°äºä¸ä¸ªä»¥<literal>http://hibernate.sourceforge.net/</literal>为å¼å¤´çsystemIdï¼å®ä¼è¾¨è®¤åºæ¯<literal>hibernate namespace</literal>ï¼resolverå°±è¯å¾éè¿å è½½Hibernateç±»çclassloaderæ¥æ¥æ¾è¿äºå®ä½ã
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+
+ è¥resolveréå°äºä¸ä¸ªä½¿ç¨<literal>classpath://</literal>URLåè®®çsystemIdï¼å®ä¼è¾¨è®¤åºè¿æ¯<literal>user namespace</literal>,resolverè¯å¾éè¿(1)å½å线ç¨ä¸ä¸æçclassloaderå(2)å è½½Hibernate classçclassloaderæ¥æ¥æ¾è¿äºå®ä½ã
+ </para>
+ </listitem>
+ </itemizedlist>
+ <para>
+ 使ç¨user namespace(ç¨æ·å½å空é´)çä¾åï¼
+ </para>
+ <programlisting><![CDATA[<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC
+ "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+ "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" [
+ <!ENTITY types SYSTEM "classpath://your/domain/types.xml">
+]>
+
+<hibernate-mapping package="your.domain">
+ <class name="MyEntity">
+ <id name="id" type="my-custom-id-type">
+ ...
+ </id>
+ <class>
+ &types;
+</hibernate-mapping>]]></programlisting>
+ <para>
+ <literal>types.xml</literal>æ¯<literal>your.domain</literal>å
ä¸çä¸ä¸ªèµæºï¼å®å
å«äºä¸ä¸ªå®å¶ç<xref linkend="mapping-types-custom">typedef</xref>ã
+ </para>
+
+ </sect3>
+
+ </sect2>
+
+ <sect2 id="mapping-declaration-mapping" revision="3">
+ <title>hibernate-mapping</title>
+
+ <para>
+ è¿ä¸ªå
ç´ å
æ¬ä¸äºå¯éçå±æ§ã<literal>schema</literal>å<literal>catalog</literal>å±æ§ï¼
+ ææäºè¿ä¸ªæ å°æè¿æ¥ï¼referï¼ç表æå¨çschemaå/æcatalogå称ã
+ åè¥æå®äºè¿ä¸ªå±æ§ï¼è¡¨åä¼å ä¸ææå®çschemaåcatalogçååæ©å±ä¸ºå
¨éå®åãåè¥æ²¡ææå®ï¼è¡¨åå°±ä¸ä¼ä½¿ç¨å
¨éå®åã
+ <literal>default-cascade</literal>æå®äºæªæ确注æ<literal>cascade</literal>å±æ§çJavaå±æ§å
+ éåç±»Hibernateä¼éåä»ä¹æ ·çé»è®¤çº§èé£æ ¼ã<literal>auto-import</literal>å±æ§é»è®¤è®©æ们å¨æ¥è¯¢è¯è¨ä¸å¯ä»¥ä½¿ç¨
+ éå
¨éå®åçç±»åã
+ </para>
+
+
+ <programlistingco>
+ <areaspec>
+ <area id="hm1" coords="2 55"/>
+ <area id="hm2" coords="3 55"/>
+ <area id="hm3" coords="4 55"/>
+ <area id="hm4" coords="5 55"/>
+ <area id="hm5" coords="6 55"/>
+ <area id="hm6" coords="7 55"/>
+ <area id="hm7" coords="8 55"/>
+ </areaspec>
+ <programlisting><![CDATA[<hibernate-mapping
+ schema="schemaName"
+ catalog="catalogName"
+ default-cascade="cascade_style"
+ default-access="field|property|ClassName"
+ default-lazy="true|false"
+ auto-import="true|false"
+ package="package.name"
+ />]]></programlisting>
+ <calloutlist>
+ <callout arearefs="hm1">
+ <para>
+ <literal>schema</literal> (å¯é): æ°æ®åºschemaçå称ã
+ </para>
+ </callout>
+ <callout arearefs="hm2">
+ <para>
+ <literal>catalog</literal> (å¯é): æ°æ®åºcatalogçå称ã
+ </para>
+ </callout>
+ <callout arearefs="hm3">
+ <para>
+ <literal>default-cascade</literal> (å¯é - é»è®¤ä¸º <literal>none</literal>):
+ é»è®¤ç级èé£æ ¼ã
+ </para>
+ </callout>
+ <callout arearefs="hm4">
+ <para>
+ <literal>default-access</literal> (å¯é - é»è®¤ä¸º <literal>property</literal>):
+ Hibernateç¨æ¥è®¿é®ææå±æ§ççç¥ãå¯ä»¥éè¿å®ç°<literal>PropertyAccessor</literal>æ¥å£
+ èªå®ä¹ã
+ </para>
+ </callout>
+ <callout arearefs="hm5">
+ <para>
+ <literal>default-lazy</literal> (å¯é - é»è®¤ä¸º <literal>true</literal>):
+ æå®äºæªæ确注æ<literal>lazy</literal>å±æ§çJavaå±æ§åéåç±»ï¼
+ Hibernateä¼éåä»ä¹æ ·çé»è®¤å è½½é£æ ¼ã
+ </para>
+ </callout>
+ <callout arearefs="hm6">
+ <para>
+ <literal>auto-import</literal> (å¯é - é»è®¤ä¸º <literal>true</literal>):
+ æå®æ们æ¯å¦å¯ä»¥å¨æ¥è¯¢è¯è¨ä¸ä½¿ç¨éå
¨éå®çç±»åï¼ä»
éäºæ¬æ å°æ件ä¸çç±»ï¼ã
+ </para>
+ </callout>
+ <callout arearefs="hm7">
+ <para>
+ <literal>package</literal> (å¯é): æå®ä¸ä¸ªå
åç¼ï¼å¦æå¨æ å°ææ¡£ä¸æ²¡ææå®å
¨éå®çç±»åï¼
+ 就使ç¨è¿ä¸ªä½ä¸ºå
åã
+ </para>
+ </callout>
+ </calloutlist>
+ </programlistingco>
+
+ <para>
+ åè¥ä½ æ两个æä¹
åç±»ï¼å®ä»¬çéå
¨éå®åæ¯ä¸æ ·çï¼å°±æ¯ä¸¤ä¸ªç±»çååä¸æ ·ï¼æå¨çå
ä¸ä¸æ ·--è¯è
注ï¼ï¼
+ ä½ åºè¯¥è®¾ç½®<literal>auto-import="false"</literal>ãå¦æä½ æä¸ä¸ªâimportè¿âçåååæ¶å¯¹åºä¸¤ä¸ªç±»ï¼
+ Hibernateä¼æåºä¸ä¸ªå¼å¸¸ã
+ </para>
+
+ <para>
+ 注æ<literal>hibernate-mapping</literal> å
ç´ å
è®¸ä½ åµå¥å¤ä¸ªå¦ä¸æ示ç
+ <literal><class></literal>æ å°ãä½æ¯æ好çåæ³ï¼ä¹è®¸ä¸äºå·¥å
·éè¦çï¼æ¯ä¸ä¸ª
+ æä¹
åç±»ï¼æä¸ä¸ªç±»ç继æ¿å±æ¬¡ï¼å¯¹åºä¸ä¸ªæ å°æ件ï¼å¹¶ä»¥æä¹
åçè¶
ç±»å称å½åï¼ä¾å¦ï¼
+ <literal>Cat.hbm.xml</literal>ï¼
+ <literal>Dog.hbm.xml</literal>ï¼æè
å¦æ使ç¨ç»§æ¿ï¼<literal>Animal.hbm.xml</literal>ã
+ </para>
+
+ </sect2>
+
+ <sect2 id="mapping-declaration-class" revision="3">
+ <title>class</title>
+
+ <para>
+ ä½ å¯ä»¥ä½¿ç¨<literal>class</literal>å
ç´ æ¥å®ä¹ä¸ä¸ªæä¹
åç±»ï¼
+ </para>
+
+
+ <programlistingco>
+ <areaspec>
+ <area id="class1" coords="2 55"/>
+ <area id="class2" coords="3 55" />
+ <area id="class3" coords="4 55"/>
+ <area id="class4" coords="5 55" />
+ <area id="class5" coords="6 55"/>
+ <area id="class6" coords="7 55" />
+ <area id="class7" coords="8 55"/>
+ <area id="class8" coords="9 55" />
+ <area id="class9" coords="10 55" />
+ <area id="class10" coords="11 55"/>
+ <area id="class11" coords="12 55"/>
+ <area id="class12" coords="13 55"/>
+ <area id="class13" coords="14 55"/>
+ <area id="class14" coords="15 55"/>
+ <area id="class15" coords="16 55"/>
+ <area id="class16" coords="17 55"/>
+ <area id="class17" coords="18 55"/>
+ <area id="class18" coords="19 55"/>
+ <area id="class19" coords="20 55"/>
+ <area id="class20" coords="21 55"/>
+ <area id="class21" coords="22 55"/>
+ </areaspec>
+ <programlisting><![CDATA[<class
+ name="ClassName"
+ table="tableName"
+ discriminator-value="discriminator_value"
+ mutable="true|false"
+ schema="owner"
+ catalog="catalog"
+ proxy="ProxyInterface"
+ dynamic-update="true|false"
+ dynamic-insert="true|false"
+ select-before-update="true|false"
+ polymorphism="implicit|explicit"
+ where="arbitrary sql where condition"
+ persister="PersisterClass"
+ batch-size="N"
+ optimistic-lock="none|version|dirty|all"
+ lazy="true|false"
+ entity-name="EntityName"
+ check="arbitrary sql check condition"
+ rowid="rowid"
+ subselect="SQL expression"
+ abstract="true|false"
+ node="element-name"
+/>]]></programlisting>
+ <calloutlist>
+ <callout arearefs="class1">
+ <para>
+ <literal>name</literal> (å¯é): æä¹
åç±»ï¼æè
æ¥å£ï¼çJavaå
¨éå®åã
+ å¦æè¿ä¸ªå±æ§ä¸åå¨ï¼Hibernateå°åå®è¿æ¯ä¸ä¸ªéPOJOçå®ä½æ å°ã
+ </para>
+ </callout>
+ <callout arearefs="class2">
+ <para>
+ <literal>table</literal> (å¯é - é»è®¤æ¯ç±»çéå
¨éå®å): 对åºçæ°æ®åºè¡¨åã
+ </para>
+ </callout>
+ <callout arearefs="class3">
+ <para>
+ <literal>discriminator-value</literal> (å¯é - é»è®¤åç±»åä¸æ ·):
+ ä¸ä¸ªç¨äºåºåä¸åçåç±»çå¼ï¼å¨å¤æè¡ä¸ºæ¶ä½¿ç¨ãå®å¯ä»¥æ¥åçå¼å
æ¬
+ <literal>null</literal> å <literal>not null</literal>ã
+ </para>
+ </callout>
+ <callout arearefs="class4">
+ <para>
+ <literal>mutable</literal> (å¯éï¼é»è®¤å¼ä¸º<literal>true</literal>):
+ 表æ该类çå®ä¾æ¯å¯åçæè
ä¸å¯åçã
+ </para>
+ </callout>
+ <callout arearefs="class5">
+ <para>
+ <literal>schema</literal> (å¯é):
+ è¦çå¨æ ¹<literal><hibernate-mapping></literal>å
ç´ ä¸æå®çschemaååã
+ </para>
+ </callout>
+ <callout arearefs="class6">
+ <para>
+ <literal>catalog</literal> (å¯é):
+ è¦çå¨æ ¹<literal><hibernate-mapping></literal>å
ç´ ä¸æå®çcatalogååã
+ </para>
+ </callout>
+ <callout arearefs="class7">
+ <para>
+ <literal>proxy</literal> (å¯é): æå®ä¸ä¸ªæ¥å£ï¼å¨å»¶è¿è£
è½½æ¶ä½ä¸ºä»£ç使ç¨ã
+ ä½ å¯ä»¥å¨è¿é使ç¨è¯¥ç±»èªå·±çååã
+ </para>
+ </callout>
+ <callout arearefs="class8">
+ <para>
+ <literal>dynamic-update</literal> (å¯é, é»è®¤ä¸º <literal>false</literal>):
+ æå®ç¨äº<literal>UPDATE</literal> çSQLå°ä¼å¨è¿è¡æ¶å¨æçæï¼å¹¶ä¸åªæ´æ°é£äºæ¹åè¿çå段ã
+ </para>
+ </callout>
+ <callout arearefs="class9">
+ <para>
+ <literal>dynamic-insert</literal> (å¯é, é»è®¤ä¸º <literal>false</literal>):
+ æå®ç¨äº<literal>INSERT</literal>ç SQL å°ä¼å¨è¿è¡æ¶å¨æçæï¼å¹¶ä¸åªå
å«é£äºé空å¼å段ã
+ </para>
+ </callout>
+ <callout arearefs="class10">
+ <para>
+ <literal>select-before-update</literal> (å¯é, é»è®¤ä¸º <literal>false</literal>):
+ æå®Hibernateé¤éç¡®å®å¯¹è±¡çæ£è¢«ä¿®æ¹äºï¼å¦æ该å¼ä¸ºtrueï¼è¯æ³¨ï¼ï¼å¦å<emphasis>ä¸ä¼</emphasis>æ§è¡SQL
+ <literal>UPDATE</literal>æä½ãå¨ç¹å®åºåï¼å®é
ä¸ï¼å®åªå¨ä¸ä¸ªç¬æ¶å¯¹è±¡ï¼transient objectï¼å
³èå°ä¸ä¸ª
+ æ°çsessionä¸æ¶æ§è¡çupdate()ä¸çæï¼ï¼è¿è¯´æHibernateä¼å¨<literal>UPDATE</literal>
+ ä¹åæ§è¡ä¸æ¬¡é¢å¤çSQL <literal>SELECT</literal>æä½ï¼æ¥å³å®æ¯å¦åºè¯¥æ§è¡
+ <literal>UPDATE</literal>ã
+ </para>
+ </callout>
+ <callout arearefs="class11">
+ <para>
+ <literal>polymorphismï¼å¤æï¼</literal> (å¯é, é»è®¤å¼ä¸º <literal>implicit (éå¼)
+ </literal>): çå®æ¯éå¼è¿æ¯æ¾å¼ç使ç¨å¤ææ¥è¯¢ï¼è¿åªå¨Hibernateçå
·ä½è¡¨ç»§æ¿çç¥ä¸ç¨å°ï¼è¯æ³¨ï¼ã
+ </para>
+ </callout>
+ <callout arearefs="class12">
+ <para>
+ <literal>where</literal> (å¯é) æå®ä¸ä¸ªéå çSQL<literal>WHERE</literal> æ¡ä»¶ï¼
+ å¨æåè¿ä¸ªç±»ç对象æ¶ä¼ä¸ç´å¢å è¿ä¸ªæ¡ä»¶ã
+ </para>
+ </callout>
+ <callout arearefs="class13">
+ <para>
+ <literal>persister</literal> (å¯é): æå®ä¸ä¸ªå®å¶ç<literal>ClassPersister</literal>ã
+ </para>
+ </callout>
+ <callout arearefs="class14">
+ <para>
+ <literal>batch-size</literal> (å¯é,é»è®¤æ¯<literal>1</literal>) æå®ä¸ä¸ªç¨äº
+ æ ¹æ®æ è¯ç¬¦ï¼identifierï¼æåå®ä¾æ¶ä½¿ç¨ç"batch size"ï¼æ¹æ¬¡æåæ°éï¼ã
+ </para>
+ </callout>
+ <callout arearefs="class15">
+ <para>
+ <literal>optimistic-lockï¼ä¹è§éå®ï¼</literal>
+ (å¯éï¼é»è®¤æ¯<literal>version</literal>): å³å®ä¹è§éå®ççç¥ã
+ </para>
+ </callout>
+ <callout arearefs="class16">
+ <para>
+ <literal>lazy</literal> (å¯é): éè¿è®¾ç½®<literal>lazy="false"</literal>ï¼
+ ææç延è¿å è½½ï¼Lazy fetchingï¼åè½å°è¢«å
¨é¨ç¦ç¨ï¼disabledï¼ã
+ </para>
+ </callout>
+ <callout arearefs="class17">
+ <para>
+ <literal>entity-name</literal> (å¯éï¼é»è®¤ä¸ºç±»å): Hibernate3å
许ä¸ä¸ªç±»è¿è¡å¤æ¬¡æ å°ï¼
+ åææ¯æ å°å°ä¸åç表ï¼ï¼å¹¶ä¸å
许使ç¨MapsæXML代æ¿Javaå±æ¬¡çå®ä½æ å°
+ ï¼ä¹å°±æ¯å®ç°å¨æé¢å模åï¼ä¸ç¨åæä¹
åç±»ï¼è¯æ³¨ï¼ã
+ æ´å¤ä¿¡æ¯è¯·ç<xref linkend="persistent-classes-dynamicmodels"/> and <xref linkend="xml"/>ã
+ </para>
+ </callout>
+ <callout arearefs="class18">
+ <para>
+ <literal>check</literal> (å¯é): è¿æ¯ä¸ä¸ªSQL表达å¼ï¼
+ ç¨äºä¸ºèªå¨çæçschemaæ·»å å¤è¡ï¼multi-rowï¼çº¦æ<emphasis>æ£æ¥</emphasis>ã
+ </para>
+ </callout>
+ <callout arearefs="class19">
+ <para>
+ <literal>rowid</literal> (å¯é): Hibernateå¯ä»¥ä½¿ç¨æ°æ®åºæ¯æçæè°çROWIDsï¼ä¾å¦ï¼
+ Oracleæ°æ®åºï¼å¦æä½ è®¾ç½®è¿ä¸ªå¯éç<literal>rowid</literal>ï¼
+ Hibernateå¯ä»¥ä½¿ç¨é¢å¤çå段<literal>rowid</literal>å®ç°å¿«éæ´æ°ãROWIDæ¯è¿ä¸ªåè½å®ç°çéç¹ï¼
+ å®ä»£è¡¨äºä¸ä¸ªåå¨å
ç»ï¼tupleï¼çç©çä½ç½®ã
+ </para>
+ </callout>
+ <callout arearefs="class20">
+ <para>
+ <literal>subselect</literal> (å¯é): å®å°ä¸ä¸ªä¸å¯åï¼immutableï¼å¹¶ä¸åªè¯»çå®ä½æ å°å°ä¸ä¸ªæ°æ®åºç
+ åæ¥è¯¢ä¸ãå½ä½ æ³ç¨è§å¾ä»£æ¿ä¸å¼ åºæ¬è¡¨çæ¶åï¼è¿æ¯æç¨çï¼ä½æ好ä¸è¦è¿æ ·åãæ´å¤çä»ç»è¯·çä¸é¢å
容ã
+ </para>
+ </callout>
+ <callout arearefs="class21">
+ <para>
+ <literal>abstract</literal> (å¯é): ç¨äºå¨<literal><union-subclass></literal>ç继æ¿ç»æ
+ ï¼hierarchiesï¼ä¸æ è¯æ½è±¡è¶
ç±»ã
+ </para>
+ </callout>
+ </calloutlist>
+ </programlistingco>
+
+ <para>
+ è¥ææçæä¹
åç±»å®é
ä¸æ¯ä¸ä¸ªæ¥å£ï¼è¿ä¹æ¯å®å
¨å¯ä»¥æ¥åçã
+ ä¹åä½ å¯ä»¥ç¨å
ç´ <literal><subclass></literal>æ¥æå®è¯¥æ¥å£çå®é
å®ç°ç±»ã
+ ä½ å¯ä»¥æä¹
åä»»ä½<emphasis>static</emphasis>ï¼éæçï¼å
é¨ç±»ã
+ ä½ åºè¯¥ä½¿ç¨æ åçç±»åæ ¼å¼æ¥æå®ç±»åï¼<literal>æ¯å¦ï¼Foo$Bar</literal>ã
+ </para>
+ <para>
+ ä¸å¯åç±»ï¼<literal>mutable="false"</literal>ä¸å¯ä»¥è¢«åºç¨ç¨åºæ´æ°æè
å é¤ã
+ è¿å¯ä»¥è®©Hibernateåä¸äºå°å°çæ§è½ä¼åã
+ </para>
+
+ <para>
+ å¯éç<literal>proxy</literal>å±æ§å
许延è¿å 载类çæä¹
åå®ä¾ã
+ Hibernateå¼å§ä¼è¿åå®ç°äºè¿ä¸ªå½åæ¥å£çCGLIB代çãå½ä»£ççæ个æ¹æ³è¢«å®é
è°ç¨çæ¶åï¼
+ çå®çæä¹
å对象æä¼è¢«è£
è½½ãåè§ä¸é¢çâç¨äºå»¶è¿è£
è½½ç代çâã
+ </para>
+
+ <para><emphasis>Implicit</emphasis> (éå¼)çå¤ææ¯æï¼å¦ææ¥è¯¢æ¶ç»åºçæ¯ä»»ä½è¶
ç±»ã该类å®ç°çæ¥å£æè
该类ç
+ ååï¼é½ä¼è¿åè¿ä¸ªç±»çå®ä¾ï¼å¦ææ¥è¯¢ä¸ç»åºçæ¯åç±»çååï¼åä¼è¿ååç±»çå®ä¾ã
+ <emphasis>Explicit</emphasis> ï¼æ¾å¼ï¼çå¤ææ¯æï¼åªæå¨æ¥è¯¢æ¶ç»åºæç¡®ç该类ååæ¶æä¼è¿åè¿ä¸ªç±»çå®ä¾ï¼
+ åæ¶åªæå¨è¿ä¸ª<literal><class></literal>çå®ä¹ä¸ä½ä¸º<literal><subclass></literal>
+ æè
<literal><joined-subclass></literal>åºç°çåç±»ï¼æä¼å¯è½è¿åã
+ å¨å¤§å¤æ°æ
åµä¸ï¼é»è®¤ç<literal>polymorphism="implicit"</literal>é½æ¯åéçã
+ æ¾å¼çå¤æå¨æ两个ä¸åçç±»æ å°å°åä¸ä¸ªè¡¨çæ¶åå¾æç¨ãï¼å
许ä¸ä¸ªâè½»åâçç±»ï¼åªå
å«é¨å表å段ï¼ã
+ </para>
+
+ <para>
+ <literal>persister</literal>å±æ§å¯ä»¥è®©ä½ å®å¶è¿ä¸ªç±»ä½¿ç¨çæä¹
åçç¥ã
+ ä½ å¯ä»¥æå®ä½ èªå·±å®ç°
+ <literal>org.hibernate.persister.EntityPersister</literal>çåç±»ï¼ä½ çè³å¯ä»¥å®å
¨ä»å¤´å¼å§ç¼åä¸ä¸ª
+ <literal>org.hibernate.persister.ClassPersister</literal>æ¥å£çå®ç°ï¼
+ æ¯å¦æ¯ç¨å¨åè¿ç¨è°ç¨ãåºååå°æ件æè
LDAPæ°æ®åºæ¥å®ç°ã
+ åé
<literal>org.hibernate.test.CustomPersister</literal>ï¼è¿æ¯ä¸ä¸ªç®åçä¾å
+ ï¼âæä¹
åâå°ä¸ä¸ª<literal>Hashtable</literal>ï¼ã
+ </para>
+
+ <para>
+ 请注æ<literal>dynamic-update</literal>å<literal>dynamic-insert</literal>ç设置并ä¸ä¼ç»§æ¿å°åç±»ï¼
+ æ以å¨<literal><subclass></literal>æè
<literal><joined-subclass></literal>å
ç´ ä¸å¯è½
+ éè¦å次设置ãè¿äºè®¾ç½®æ¯å¦è½å¤æé«æçè¦è§æ
å½¢èå®ã请ç¨ä½ çæºæ
§å³å®æ¯å¦ä½¿ç¨ã
+ </para>
+
+ <para>
+ 使ç¨<literal>select-before-update</literal>é常ä¼éä½æ§è½ãå¦æä½ éæ°è¿æ¥ä¸ä¸ªè±ç®¡ï¼detacheï¼å¯¹è±¡å®ä¾
+ å°ä¸ä¸ª<literal>Session</literal>ä¸æ¶ï¼å®å¯ä»¥é²æ¢æ°æ®åºä¸å¿
è¦ç触åupdateã
+ è¿å°±å¾æç¨äºã
+ </para>
+
+ <para>
+ å¦æä½ æå¼äº<literal>dynamic-update</literal>ï¼ä½ å¯ä»¥éæ©å ç§ä¹è§éå®ççç¥ï¼
+ </para>
+ <itemizedlist>
+ <listitem>
+ <para>
+ <literal>versionï¼çæ¬æ£æ¥ï¼</literal> æ£æ¥version/timestampå段
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ <literal>allï¼å
¨é¨ï¼</literal> æ£æ¥å
¨é¨å段
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ <literal>dirtyï¼èæ£æ¥ï¼</literal>åªæ£å¯ä¿®æ¹è¿çå段
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ <literal>noneï¼ä¸æ£æ¥ï¼</literal>ä¸ä½¿ç¨ä¹è§éå®
+ </para>
+ </listitem>
+ </itemizedlist>
+ <para>
+ æ们<emphasis>é常</emphasis>强çå»ºè®®ä½ å¨Hibernateä¸ä½¿ç¨version/timestampå段æ¥è¿è¡ä¹è§éå®ã
+ 对æ§è½æ¥è¯´ï¼è¿æ¯æ好çéæ©ï¼å¹¶ä¸è¿ä¹æ¯å¯ä¸è½å¤å¤çå¨sessionå¤è¿è¡æä½ççç¥ï¼ä¾å¦ï¼
+ å¨ä½¿ç¨<literal>Session.merge()</literal>çæ¶åï¼ã
+ </para>
+
+ <para>
+ 对Hibernateæ å°æ¥è¯´è§å¾å表æ¯æ²¡æåºå«çï¼è¿æ¯å 为å®ä»¬å¨æ°æ®å±é½æ¯éæçï¼
+ 注æï¼ä¸äºæ°æ®åºä¸æ¯æè§å¾å±æ§ï¼ç¹å«æ¯æ´æ°çæ¶åï¼ãææ¶ä½ æ³ä½¿ç¨è§å¾ï¼ä½å´ä¸è½å¨æ°æ®åº
+ ä¸å建å®ï¼ä¾å¦ï¼å¨éççschemaä¸ï¼ãè¿æ ·çè¯ï¼ä½ å¯ä»¥æ å°ä¸ä¸ªä¸å¯åçï¼immutableï¼å¹¶ä¸æ¯
+ åªè¯»çå®ä½å°ä¸ä¸ªç»å®çSQLåæ¥è¯¢è¡¨è¾¾å¼ï¼
+ </para>
+
+ <programlisting><![CDATA[<class name="Summary">
+ <subselect>
+ select item.name, max(bid.amount), count(*)
+ from item
+ join bid on bid.item_id = item.id
+ group by item.name
+ </subselect>
+ <synchronize table="item"/>
+ <synchronize table="bid"/>
+ <id name="name"/>
+ ...
+</class>]]></programlisting>
+
+ <para>
+ å®ä¹è¿ä¸ªå®ä½ç¨å°ç表为åæ¥ï¼synchronizeï¼ï¼ç¡®ä¿èªå¨å·æ°ï¼auto-flushï¼æ£ç¡®æ§è¡ï¼
+ 并ä¸ä¾èµåå®ä½çæ¥è¯¢ä¸ä¼è¿åè¿ææ°æ®ã<literal><subselect></literal>å¨å±æ§å
ç´
+ åä¸ä¸ªåµå¥æ å°å
ç´ ä¸é½å¯è§ã
+ </para>
+
+ </sect2>
+
+ <sect2 id="mapping-declaration-id" revision="4">
+ <title>id</title>
+
+ <para>
+ 被æ å°çç±»<emphasis>å¿
é¡»</emphasis>å®ä¹å¯¹åºæ°æ®åºè¡¨ä¸»é®å段ã大å¤æ°ç±»æä¸ä¸ªJavaBeansé£æ ¼çå±æ§ï¼
+ 为æ¯ä¸ä¸ªå®ä¾å
å«å¯ä¸çæ è¯ã<literal><id></literal> å
ç´ å®ä¹äºè¯¥å±æ§å°æ°æ®åºè¡¨ä¸»é®å段çæ å°ã
+ </para>
+
+ <programlistingco>
+ <areaspec>
+ <area id="id1" coords="2 70"/>
+ <area id="id2" coords="3 70" />
+ <area id="id3" coords="4 70"/>
+ <area id="id4" coords="5 70" />
+ <area id="id5" coords="6 70" />
+ </areaspec>
+ <programlisting><![CDATA[<id
+ name="propertyName"
+ type="typename"
+ column="column_name"
+ unsaved-value="null|any|none|undefined|id_value"
+ access="field|property|ClassName"
+ node="element-name|@attribute-name|element/@attribute|.">
+
+ <generator class="generatorClass"/>
+</id>]]></programlisting>
+ <calloutlist>
+ <callout arearefs="id1">
+ <para>
+ <literal>name</literal> (å¯é): æ è¯å±æ§çååã
+ </para>
+ </callout>
+ <callout arearefs="id2">
+ <para>
+ <literal>type</literal> (å¯é): æ è¯Hibernateç±»åçååã
+ </para>
+ </callout>
+ <callout arearefs="id3">
+ <para>
+ <literal>column</literal> (å¯é - é»è®¤ä¸ºå±æ§å): 主é®å段çååã
+ </para>
+ </callout>
+ <callout arearefs="id4">
+ <para>
+ <literal>unsaved-value</literal> (å¯é - é»è®¤ä¸ºä¸ä¸ªååå®é
ï¼sensibleï¼çå¼):
+ ä¸ä¸ªç¹å®çæ è¯å±æ§å¼ï¼ç¨æ¥æ å¿è¯¥å®ä¾æ¯ååå建çï¼å°æªä¿åã
+ è¿å¯ä»¥æè¿ç§å®ä¾åä»ä»¥åçsessionä¸è£
è½½è¿ï¼å¯è½ååè¿ä¿®æ¹--è¯è
注ï¼
+ ä½æªå次æä¹
åçå®ä¾åºåå¼æ¥ã
+ </para>
+ </callout>
+ <callout arearefs="id5">
+ <para>
+ <literal>access</literal> (å¯é - é»è®¤ä¸º<literal>property</literal>):
+ Hibernateç¨æ¥è®¿é®å±æ§å¼ççç¥ã
+ </para>
+ </callout>
+ </calloutlist>
+ </programlistingco>
+
+ <para>
+ å¦æ <literal>name</literal>å±æ§ä¸åå¨ï¼ä¼è®¤ä¸ºè¿ä¸ªç±»æ²¡ææ è¯å±æ§ã
+ </para>
+
+ <para>
+ <literal>unsaved-value</literal> å±æ§å¨Hibernate3ä¸å ä¹ä¸åéè¦ã
+ </para>
+
+ <para>
+ è¿æä¸ä¸ªå¦å¤ç<literal><composite-id></literal>å®ä¹å¯ä»¥è®¿é®æ§å¼çå¤ä¸»é®æ°æ®ã
+ æ们强çä¸å»ºè®®ä½¿ç¨è¿ç§æ¹å¼ã
+ </para>
+
+ <sect3 id="mapping-declaration-id-generator" revision="2">
+ <title>Generator</title>
+
+ <para>
+ å¯éç<literal><generator></literal>åå
ç´ æ¯ä¸ä¸ªJavaç±»çååï¼
+ ç¨æ¥ä¸ºè¯¥æä¹
åç±»çå®ä¾çæå¯ä¸çæ è¯ãå¦æè¿ä¸ªçæå¨å®ä¾éè¦æäºé
ç½®å¼æè
åå§ååæ°ï¼
+ ç¨<literal><param></literal>å
ç´ æ¥ä¼ éã
+ </para>
+
+ <programlisting><![CDATA[<id name="id" type="long" column="cat_id">
+ <generator class="org.hibernate.id.TableHiLoGenerator">
+ <param name="table">uid_table</param>
+ <param name="column">next_hi_value_column</param>
+ </generator>
+</id>]]></programlisting>
+
+ <para>
+
+ ææççæå¨é½å®ç°<literal>org.hibernate.id.IdentifierGenerator</literal>æ¥å£ã
+ è¿æ¯ä¸ä¸ªé常ç®åçæ¥å£ï¼æäºåºç¨ç¨åºå¯ä»¥éæ©æä¾ä»ä»¬èªå·±ç¹å®çå®ç°ãå½ç¶ï¼
+ Hibernateæä¾äºå¾å¤å
ç½®çå®ç°ãä¸é¢æ¯ä¸äºå
ç½®çæå¨çå¿«æ·ååï¼
+
+ <variablelist>
+ <varlistentry>
+ <term><literal>increment</literal></term>
+ <listitem>
+ <para>
+ ç¨äºä¸º<literal>long</literal>, <literal>short</literal>æè
<literal>int</literal>ç±»åçæ
+ å¯ä¸æ è¯ãåªæå¨æ²¡æå
¶ä»è¿ç¨å¾åä¸å¼ 表ä¸æå
¥æ°æ®æ¶æè½ä½¿ç¨ã
+ <emphasis>å¨é群ä¸ä¸è¦ä½¿ç¨ã</emphasis>
+ </para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term><literal>identity</literal></term>
+ <listitem>
+ <para>
+ 对DB2,MySQL, MS SQL Server, SybaseåHypersonicSQLçå
ç½®æ è¯å段æä¾æ¯æã
+ è¿åçæ è¯ç¬¦æ¯<literal>long</literal>, <literal>short</literal> æè
<literal>int</literal>ç±»åçã
+ </para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term><literal>sequence</literal></term>
+ <listitem>
+ <para>
+ å¨DB2,PostgreSQL, Oracle, SAP DB, McKoiä¸ä½¿ç¨åºåï¼sequence)ï¼
+ èå¨Interbaseä¸ä½¿ç¨çæå¨(generator)ãè¿åçæ è¯ç¬¦æ¯<literal>long</literal>,
+ <literal>short</literal>æè
<literal>int</literal>ç±»åçã
+ </para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term><literal>hilo</literal></term>
+ <listitem>
+ <para id="mapping-declaration-id-hilodescription" revision="1">
+ 使ç¨ä¸ä¸ªé«/ä½ä½ç®æ³é«æççæ<literal>long</literal>, <literal>short</literal>
+ æè
<literal>int</literal>ç±»åçæ è¯ç¬¦ãç»å®ä¸ä¸ªè¡¨åå段ï¼é»è®¤åå«æ¯
+ <literal>hibernate_unique_key</literal> å<literal>next_hi</literal>ï¼ä½ä¸ºé«ä½å¼çæ¥æºã
+ é«/ä½ä½ç®æ³çæçæ è¯ç¬¦åªå¨ä¸ä¸ªç¹å®çæ°æ®åºä¸æ¯å¯ä¸çã
+ </para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term><literal>seqhilo</literal></term>
+ <listitem>
+ <para>
+ 使ç¨ä¸ä¸ªé«/ä½ä½ç®æ³æ¥é«æççæ<literal>long</literal>, <literal>short</literal>
+ æè
<literal>int</literal>ç±»åçæ è¯ç¬¦ï¼ç»å®ä¸ä¸ªæ°æ®åºåºåï¼sequence)çååã
+ </para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term><literal>uuid</literal></term>
+ <listitem>
+ <para>
+ ç¨ä¸ä¸ª128-bitçUUIDç®æ³çæå符串类åçæ è¯ç¬¦ï¼
+ è¿å¨ä¸ä¸ªç½ç»ä¸æ¯å¯ä¸çï¼ä½¿ç¨äºIPå°åï¼ãUUID被ç¼ç 为ä¸ä¸ª32ä½16è¿å¶æ°åçå符串ã
+ </para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term><literal>guid</literal></term>
+ <listitem>
+ <para>
+ å¨MS SQL Server å MySQL ä¸ä½¿ç¨æ°æ®åºçæçGUIDå符串ã
+ </para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term><literal>native</literal></term>
+ <listitem>
+ <para>
+ æ ¹æ®åºå±æ°æ®åºçè½åéæ©<literal>identity</literal>, <literal>sequence</literal>
+ æè
<literal>hilo</literal>ä¸çä¸ä¸ªã
+ </para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term><literal>assigned</literal></term>
+ <listitem>
+ <para>
+ 让åºç¨ç¨åºå¨<literal>save()</literal>ä¹å为对象åé
ä¸ä¸ªæ 示符ãè¿æ¯
+ <literal><generator></literal>å
ç´ æ²¡ææå®æ¶çé»è®¤çæçç¥ã
+ </para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term><literal>select</literal></term>
+ <listitem>
+ <para>
+ éè¿æ°æ®åºè§¦åå¨éæ©ä¸äºå¯ä¸ä¸»é®çè¡å¹¶è¿å主é®å¼æ¥åé
ä¸ä¸ªä¸»é®ã
+ </para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term><literal>foreign</literal></term>
+ <listitem>
+ <para>
+ 使ç¨å¦å¤ä¸ä¸ªç¸å
³èç对象çæ è¯ç¬¦ãé常å<literal><one-to-one></literal>èåèµ·æ¥ä½¿ç¨ã
+ </para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term><literal>sequence-identity</literal></term>
+ <listitem>
+ <para>
+ ä¸ç§ç¹å«çåºåçæçç¥,使ç¨æ°æ®åºåºåæ¥çæå®é
å¼,ä½å°å®åJDBC3çgetGeneratedKeysç»åå¨ä¸èµ·,使å¾å¨æå
¥è¯å¥æ§è¡çæ¶åå°±è¿åçæçå¼ãç®å为æ¢åªæé¢åJDK 1.4çOracle 10g驱å¨æ¯æè¿ä¸çç¥ã注æï¼å 为Oracle驱å¨ç¨åºçä¸ä¸ªbugï¼è¿äºæå
¥è¯å¥ç注é被å
³éäºãï¼åæï¼Note comments on these insert statements are disabled due to a bug in the Oracle drivers.ï¼
+ </para>
+ </listitem>
+ </varlistentry>
+
+ </variablelist>
+
+ </para>
+ </sect3>
+
+ <sect3 id="mapping-declaration-id-hilo" revision="1">
+ <title>é«/ä½ä½ç®æ³ï¼Hi/Lo Algorithmï¼</title>
+ <para>
+ <literal>hilo</literal> å <literal>seqhilo</literal>çæå¨ç»åºäºä¸¤ç§hi/loç®æ³çå®ç°ï¼
+ è¿æ¯ä¸ç§å¾ä»¤äººæ»¡æçæ è¯ç¬¦çæç®æ³ã第ä¸ç§å®ç°éè¦ä¸ä¸ªâç¹æ®âçæ°æ®åºè¡¨æ¥ä¿åä¸ä¸ä¸ªå¯ç¨çâhiâå¼ã
+ 第äºç§å®ç°ä½¿ç¨ä¸ä¸ªOracleé£æ ¼çåºåï¼å¨è¢«æ¯æçæ
åµä¸ï¼ã
+ </para>
+
+ <programlisting><![CDATA[<id name="id" type="long" column="cat_id">
+ <generator class="hilo">
+ <param name="table">hi_value</param>
+ <param name="column">next_value</param>
+ <param name="max_lo">100</param>
+ </generator>
+</id>]]></programlisting>
+
+ <programlisting><![CDATA[<id name="id" type="long" column="cat_id">
+ <generator class="seqhilo">
+ <param name="sequence">hi_value</param>
+ <param name="max_lo">100</param>
+ </generator>
+</id>]]></programlisting>
+
+ <para>
+ å¾ä¸å¹¸ï¼ä½ å¨ä¸ºHibernateèªè¡æä¾<literal>Connection</literal>æ¶æ æ³ä½¿ç¨<literal>hilo</literal>ã
+ å½Hibernate使ç¨JTAè·ååºç¨æå¡å¨çæ°æ®æºè¿æ¥æ¶,ä½ å¿
é¡»æ£ç¡®å°é
ç½®
+ <literal>hibernate.transaction.manager_lookup_class</literal>ã
+ </para>
+ </sect3>
+
+ <sect3 id="mapping-declaration-id-uuid">
+ <title>UUIDç®æ³ï¼UUID Algorithm ï¼</title>
+ <para>
+ UUIDå
å«ï¼IPå°åï¼JVMçå¯å¨æ¶é´ï¼ç²¾ç¡®å°1/4ç§ï¼ï¼ç³»ç»æ¶é´åä¸ä¸ªè®¡æ°å¨å¼ï¼å¨JVMä¸å¯ä¸ï¼ã
+ å¨Java代ç ä¸ä¸å¯è½è·å¾MACå°åæè
å
åå°åï¼æ以è¿å·²ç»æ¯æ们å¨ä¸ä½¿ç¨JNIçåæä¸çè½åçæ好å®ç°äºã
+ </para>
+ </sect3>
+
+ <sect3 id="mapping-declaration-id-sequences">
+ <title>æ è¯å段ååºåï¼Identity columns and Sequencesï¼</title>
+ <para>
+ 对äºå
é¨æ¯ææ è¯å段çæ°æ®åº(DB2,MySQL,Sybase,MS SQL)ï¼ä½ å¯ä»¥ä½¿ç¨<literal>identity</literal>å
³é®åçæã
+ 对äºå
é¨æ¯æåºåçæ°æ®åºï¼DB2,Oracle, PostgreSQL, Interbase, McKoi,SAP DB),
+ ä½ å¯ä»¥ä½¿ç¨<literal>sequence</literal>é£æ ¼çå
³é®åçæã
+ è¿ä¸¤ç§æ¹å¼å¯¹äºæå
¥ä¸ä¸ªæ°ç对象é½éè¦ä¸¤æ¬¡SQLæ¥è¯¢ã
+ </para>
+
+ <programlisting><![CDATA[<id name="id" type="long" column="person_id">
+ <generator class="sequence">
+ <param name="sequence">person_id_sequence</param>
+ </generator>
+</id>]]></programlisting>
+
+ <programlisting><![CDATA[<id name="id" type="long" column="person_id" unsaved-value="0">
+ <generator class="identity"/>
+</id>]]></programlisting>
+ <para>
+ 对äºè·¨å¹³å°å¼åï¼<literal>native</literal>çç¥ä¼ä»<literal>identity</literal>,
+ <literal>sequence</literal> å<literal>hilo</literal>ä¸è¿è¡éæ©ï¼éæ©åªä¸ä¸ªï¼è¿åå³äºåºå±æ°æ®åºçæ¯æè½åã
+ </para>
+ </sect3>
+
+ <sect3 id="mapping-declaration-id-assigned">
+ <title>ç¨åºåé
çæ è¯ç¬¦ï¼Assigned Identifiersï¼</title>
+ <para>
+ å¦æä½ éè¦åºç¨ç¨åºåé
ä¸ä¸ªæ 示符ï¼èéHibernateæ¥çæï¼ï¼ä½ å¯ä»¥ä½¿ç¨<literal>assigned</literal>
+ çæå¨ãè¿ç§ç¹æ®ççæå¨ä¼ä½¿ç¨å·²ç»åé
ç»å¯¹è±¡çæ è¯ç¬¦å±æ§çæ è¯ç¬¦å¼ã
+ è¿ä¸ªçæå¨ä½¿ç¨ä¸ä¸ªèªç¶é®ï¼natural keyï¼æåä¸æä¹çåï¼è¯æ³¨ï¼ä½ä¸ºä¸»é®ï¼èä¸æ¯ä½¿ç¨ä¸ä¸ªä»£çé®ï¼
+ surrogate keyï¼æ²¡æåä¸æä¹çåï¼è¯æ³¨ï¼ãè¿æ¯æ²¡ææå®<literal><generator></literal>å
ç´ æ¶çé»è®¤è¡ä¸º
+ </para>
+
+ <para>
+ å½éæ©<literal>assigned</literal>çæå¨æ¶ï¼é¤éæä¸ä¸ªversionætimestampå±æ§ï¼æè
ä½ å®ä¹äº
+ <literal>Interceptor.isUnsaved()</literal>ï¼å¦åéè¦è®©Hiberante使ç¨
+ <literal>unsaved-value="undefined"</literal>ï¼å¼ºå¶Hibernatetæ¥è¯¢æ°æ®åºæ¥ç¡®å®ä¸ä¸ªå®ä¾æ¯ç¬æ¶çï¼transientï¼
+ è¿æ¯è±ç®¡çï¼detachedï¼ã
+ </para>
+ </sect3>
+
+ <sect3 id="mapping-declaration-id-select">
+ <title>触åå¨å®ç°ç主é®çæå¨ï¼Primary keys assigned by triggersï¼</title>
+ <para>
+ ä»
ä»
ç¨äºéççschemaä¸ (Hibernateä¸è½ä½¿ç¨è§¦åå¨çæDDL)ã
+ </para>
+
+ <programlisting><![CDATA[<id name="id" type="long" column="person_id">
+ <generator class="select">
+ <param name="key">socialSecurityNumber</param>
+ </generator>
+</id>]]></programlisting>
+
+ <para>
+ å¨ä¸é¢çä¾åä¸ï¼ç±»å®ä¹äºä¸ä¸ªå½å为<literal>socialSecurityNumber</literal>çå¯ä¸å¼å±æ§ï¼
+ å®æ¯ä¸ä¸ªèªç¶é®ï¼natural keyï¼ï¼å½å为<literal>person_id</literal>ç代çé®ï¼surrogate keyï¼
+ çå¼ç±è§¦åå¨çæã
+ </para>
+
+ </sect3>
+
+ </sect2>
+
+ <sect2 id="mapping-declaration-compositeid" revision="3">
+ <title>composite-id</title>
+
+ <programlisting><![CDATA[<composite-id
+ name="propertyName"
+ class="ClassName"
+ mapped="true|false"
+ access="field|property|ClassName"
+ node="element-name|."
+ >
+
+ <key-property name="propertyName" type="typename" column="column_name"/>
+ <key-many-to-one name="propertyName class="ClassName" column="column_name"/>
+ ......
+</composite-id>]]></programlisting>
+
+ <para>
+ å¦æ表使ç¨èå主é®ï¼ä½ å¯ä»¥æ å°ç±»çå¤ä¸ªå±æ§ä¸ºæ è¯ç¬¦å±æ§ã
+ <literal><composite-id></literal>å
ç´ æ¥å<literal><key-property></literal>
+ å±æ§æ å°å<literal><key-many-to-one></literal>å±æ§æ å°ä½ä¸ºåå
ç´ ã
+ </para>
+
+ <programlisting><![CDATA[<composite-id>
+ <key-property name="medicareNumber"/>
+ <key-property name="dependent"/>
+</composite-id>]]></programlisting>
+
+ <para>
+ ä½ çæä¹
åç±»<emphasis>å¿
é¡»</emphasis>éè½½<literal>equals()</literal>å
+ <literal>hashCode()</literal>æ¹æ³ï¼æ¥å®ç°ç»åçæ è¯ç¬¦çç¸çå¤æã
+ å®ç°<literal>Serializable</literal>æ¥å£ä¹æ¯å¿
é¡»çã
+ </para>
+
+ <para>
+ ä¸å¹¸çæ¯ï¼è¿ç§ç»åå
³é®åçæ¹æ³æå³çä¸ä¸ªæä¹
åç±»æ¯å®èªå·±çæ è¯ãé¤äºå¯¹è±¡èªå·±ä¹å¤ï¼
+ 没æä»ä¹æ¹ä¾¿çâææâå¯ç¨ãä½ å¿
é¡»åå§åæä¹
åç±»çå®ä¾ï¼å¡«å
å®çæ è¯ç¬¦å±æ§ï¼å<literal>load()</literal>
+ ç»åå
³é®åå
³èçæä¹
ç¶æãæ们æè¿ç§æ¹æ³ç§°ä¸º<emphasis>embeddedï¼åµå
¥å¼ï¼</emphasis>çç»åæ è¯ç¬¦ï¼å¨éè¦çåºç¨ä¸ä¸é¼å±ä½¿ç¨è¿ç§ç¨æ³ã
+ </para>
+
+ <para>
+ 第äºç§æ¹æ³æ们称为<emphasis>mapped(æ å°å¼)</emphasis>ç»åæ è¯ç¬¦ (mapped composite identifier),<literal><composite-id></literal>å
ç´ ä¸ååºçæ è¯å±æ§ä¸ä½å¨æä¹
åç±»åºç°ï¼è¿å½¢æä¸ä¸ªç¬ç«çæ è¯ç¬¦ç±»ã
+ </para>
+
+ <programlisting><![CDATA[<composite-id class="MedicareId" mapped="true">
+ <key-property name="medicareNumber"/>
+ <key-property name="dependent"/>
+</composite-id>]]></programlisting>
+
+ <para>
+ å¨è¿ä¸ªä¾åä¸ï¼ç»åæ è¯ç¬¦ç±»<literal>MedicareId</literal>åå®ä½ç±»é½å«æ<literal>medicareNumber</literal>å<literal>dependent</literal>å±æ§ãæ è¯ç¬¦ç±»å¿
é¡»éè½½<literal>equals()</literal>å<literal>hashCode()</literal>并ä¸å®ç°<literal>Serializable</literal>æ¥å£ãè¿ç§æ¹æ³ç缺ç¹æ¯åºç°äºææ¾ç代ç éå¤ã
+ </para>
+
+ <para>
+ ä¸é¢ååºçå±æ§æ¯ç¨æ¥æå®ä¸ä¸ªæ å°å¼ç»åæ è¯ç¬¦çï¼
+ </para>
+
+ <itemizedlist spacing="compact">
+ <listitem>
+ <para>
+ <literal>mapped</literal> (å¯é, é»è®¤ä¸º<literal>false</literal>):
+ ææ使ç¨ä¸ä¸ªæ å°å¼ç»åæ è¯ç¬¦ï¼å
¶å
å«çå±æ§æ å°åæ¶å¨å®ä½ç±»åç»åæ è¯ç¬¦ç±»ä¸åºç°ã
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ <literal>class</literal> (å¯é,ä½å¯¹æ å°å¼ç»åæ è¯ç¬¦å¿
é¡»æå®):
+ ä½ä¸ºç»åæ è¯ç¬¦ç±»ä½¿ç¨çç±»å.
+ </para>
+ </listitem>
+ </itemizedlist>
+
+ <para>
+ å¨<xref linkend="components-compositeid"/>ä¸èä¸,æ们ä¼æ述第ä¸ç§æ¹å¼,é£å°±æ¯æç»åæ è¯ç¬¦å®ç°ä¸ºä¸ä¸ªç»ä»¶(component)ç±»,è¿æ¯æ´æ¹ä¾¿çæ¹æ³ãä¸é¢çå±æ§ä»
对第ä¸ç§æ¹æ³ææï¼
+ </para>
+
+ <itemizedlist spacing="compact">
+ <listitem>
+ <para>
+ <literal>name</literal> (å¯é,ä½å¯¹è¿ç§æ¹æ³èè¨å¿
é¡»): å
å«æ¤ç»ä»¶æ è¯ç¬¦çç»ä»¶ç±»åçåå (åé
第9ç« ).
+
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ <literal>access</literal> (å¯é - é»è®¤ä¸º<literal>property</literal>):
+ Hibernateåºè¯¥ä½¿ç¨ç访é®æ¤å±æ§å¼ççç¥
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ <literal>class</literal> (å¯é - é»è®¤ä¼ç¨åå°æ¥èªå¨å¤å®å±æ§ç±»å
+ ): ç¨æ¥ä½ä¸ºç»åæ è¯ç¬¦çç»ä»¶ç±»çç±»åï¼åé
ä¸ä¸èï¼
+
+ </para>
+ </listitem>
+ </itemizedlist>
+
+ <para>
+ 第ä¸ç§æ¹å¼ï¼è¢«ç§°ä¸º<emphasis>identifier component(æ è¯ç¬¦ç»ä»¶)</emphasis>æ¯æ们对å ä¹ææåºç¨é½æ¨è使ç¨çæ¹å¼ã
+ </para>
+
+ </sect2>
+
+ <sect2 id="mapping-declaration-discriminator" revision="3">
+ <title>é´å«å¨ï¼discriminatorï¼</title>
+
+ <para>
+ å¨"ä¸æ£µå¯¹è±¡ç»§æ¿æ 对åºä¸ä¸ªè¡¨"ççç¥ä¸,<literal><discriminator></literal>å
ç´ æ¯å¿
éç,
+ å®å®ä¹äºè¡¨çé´å«å¨å段ãé´å«å¨å段å
å«æ å¿å¼ï¼ç¨äºåç¥æä¹
åå±åºè¯¥ä¸ºæ个ç¹å®çè¡å建åªä¸ä¸ªåç±»çå®ä¾ã
+ å¦ä¸è¿äºåå°éå¶çç±»åå¯ä»¥ä½¿ç¨ï¼
+ <literal>string</literal>, <literal>character</literal>, <literal>integer</literal>,
+ <literal>byte</literal>, <literal>short</literal>, <literal>boolean</literal>,
+ <literal>yes_no</literal>, <literal>true_false</literal>.
+ </para>
+
+ <programlistingco>
+ <areaspec>
+ <area id="discriminator1" coords="2 60"/>
+ <area id="discriminator2" coords="3 60" />
+ <area id="discriminator3" coords="4 60" />
+ <area id="discriminator4" coords="5 60" />
+ <area id="discriminator5" coords="6 60" />
+ </areaspec>
+ <programlisting><![CDATA[<discriminator
+ column="discriminator_column"
+ type="discriminator_type"
+ force="true|false"
+ insert="true|false"
+ formula="arbitrary sql expression"
+/>]]></programlisting>
+ <calloutlist>
+ <callout arearefs="discriminator1">
+ <para>
+ <literal>column</literal> (å¯é - é»è®¤ä¸º <literal>class</literal>) é´å«å¨å段çåå
+ </para>
+ </callout>
+ <callout arearefs="discriminator2">
+ <para>
+ <literal>type</literal> (å¯é - é»è®¤ä¸º <literal>string</literal>) ä¸ä¸ªHibernateå段类åçåå
+ </para>
+ </callout>
+ <callout arearefs="discriminator3">
+ <para>
+ <literal>force(强å¶)</literal> (å¯é - é»è®¤ä¸º <literal>false</literal>)
+ "强å¶"Hibernateæå®å
许çé´å«å¨å¼,å³ä½¿å½åå¾çææå®ä¾é½æ¯æ ¹ç±»çã
+ </para>
+ </callout>
+ <callout arearefs="discriminator4">
+ <para>
+ <literal>insert</literal> (å¯é - é»è®¤ä¸º<literal>true</literal>)
+ å¦æä½ çé´å«å¨å段ä¹æ¯æ å°ä¸ºå¤åæ è¯ï¼composite identifierï¼çä¸é¨åï¼åéå°
+ è¿ä¸ªå¼è®¾ä¸º<literal>false</literal>ãï¼åè¯Hibernateå¨åSQL <literal>INSERT</literal>
+ æ¶ä¸å
å«è¯¥åï¼
+ </para>
+ </callout>
+ <callout arearefs="discriminator5">
+ <para>
+ <literal>formula</literal> (å¯é)
+ ä¸ä¸ªSQL表达å¼ï¼å¨ç±»åå¤æï¼å¤ææ¯ç¶ç±»è¿æ¯å
·ä½åç±»ï¼è¯æ³¨ï¼æ¶æ§è¡ãå¯ç¨äºåºäºå
容çé´å«å¨ã
+ </para>
+ </callout>
+ </calloutlist>
+ </programlistingco>
+
+ <para>
+ é´å«å¨å段çå®é
å¼æ¯æ ¹æ®<literal><class></literal>å<literal><subclass></literal>å
ç´ ä¸
+ ç<literal>discriminator-value</literal>å±æ§å¾æ¥çã
+ </para>
+
+ <para>
+ <literal>force</literal>å±æ§ä»
ä»
å¨è¿ç§æ
åµä¸æç¨çï¼è¡¨ä¸å
å«æ²¡æ被æ å°å°æä¹
åç±»çéå 辨å«å¨å¼ã
+ è¿ç§æ
åµä¸ä¼ç»å¸¸éå°ã
+ </para>
+
+ <para>
+ 使ç¨<literal>formula</literal>å±æ§ä½ å¯ä»¥å®ä¹ä¸ä¸ªSQL表达å¼ï¼ç¨æ¥å¤æä¸ä¸ªè¡æ°æ®çç±»åã
+ </para>
+
+ <programlisting><![CDATA[<discriminator
+ formula="case when CLASS_TYPE in ('a', 'b', 'c') then 0 else 1 end"
+ type="integer"/>]]></programlisting>
+
+ </sect2>
+
+ <sect2 id="mapping-declaration-version" revision="4">
+ <title>çæ¬ï¼versionï¼(å¯é)</title>
+
+ <para>
+ <literal><version></literal>å
ç´ æ¯å¯éçï¼è¡¨æ表ä¸å
å«é带çæ¬ä¿¡æ¯çæ°æ®ã
+ è¿å¨ä½ åå¤ä½¿ç¨<emphasis> é¿äºå¡ï¼long transactionsï¼</emphasis>çæ¶åç¹å«æç¨ãï¼è§åï¼
+ </para>
+
+ <programlistingco>
+ <areaspec>
+ <area id="version1" coords="2 70"/>
+ <area id="version2" coords="3 70"/>
+ <area id="version3" coords="4 70"/>
+ <area id="version4" coords="5 70"/>
+ <area id="version5" coords="6 70"/>
+ <area id="version6" coords="7 70"/>
+ <area id="version7" coords="8 70"/>
+ </areaspec>
+ <programlisting><![CDATA[<version
+ column="version_column"
+ name="propertyName"
+ type="typename"
+ access="field|property|ClassName"
+ unsaved-value="null|negative|undefined"
+ generated="never|always"
+ insert="true|false"
+ node="element-name|@attribute-name|element/@attribute|."
+/>]]></programlisting>
+ <calloutlist>
+ <callout arearefs="version1">
+ <para>
+ <literal>column</literal> (å¯é - é»è®¤ä¸ºå±æ§å): æå®ææçæ¬å·çå段åã
+ </para>
+ </callout>
+ <callout arearefs="version2">
+ <para>
+ <literal>name</literal>: æä¹
åç±»çå±æ§åã
+ </para>
+ </callout>
+ <callout arearefs="version3">
+ <para>
+ <literal>type</literal> (å¯é - é»è®¤æ¯ <literal>integer</literal>): çæ¬å·çç±»åã
+ </para>
+ </callout>
+ <callout arearefs="version4">
+ <para>
+ <literal>access</literal> (å¯é - é»è®¤æ¯ <literal>property</literal>):
+ Hibernateç¨äºè®¿é®å±æ§å¼ççç¥ã
+ </para>
+ </callout>
+ <callout arearefs="version5">
+ <para>
+ <literal>unsaved-value</literal> (å¯é - é»è®¤æ¯<literal>undefined</literal>):
+ ç¨äºæ ææ个å®ä¾æ¶åå被å®ä¾åçï¼å°æªä¿åï¼çæ¬å±æ§å¼ï¼ä¾é è¿ä¸ªå¼å°±å¯ä»¥æè¿ç§æ
åµ
+ åå·²ç»å¨å
åçsessionä¸ä¿åæè£
è½½çè±ç®¡ï¼detachedï¼å®ä¾åºåå¼æ¥ã
+ ï¼<literal>undefined</literal>ææåºè¢«ä½¿ç¨çæ è¯å±æ§å¼ãï¼
+ </para>
+ </callout>
+ <callout arearefs="version6">
+ <para>
+ <literal>generated</literal> (å¯é - é»è®¤æ¯ <literal>never</literal>):
+ 表ææ¤çæ¬å±æ§å¼æ¯å¦å®é
ä¸æ¯ç±æ°æ®åºçæçã请åé
<xref linkend="mapping-generated">generated properties</xref>é¨åç讨论ã
+ </para>
+ </callout>
+ <callout arearefs="version7">
+ <para>
+ <literal>insert</literal> (å¯é - é»è®¤æ¯ <literal>true</literal>):
+ 表ææ¤çæ¬ååºè¯¥å
å«å¨SQLæå
¥è¯å¥ä¸ãåªæå½æ°æ®åºå段æé»è®¤å¼<literal>0</literal>çæ¶åï¼æå¯ä»¥è®¾ç½®ä¸º<literal>false</literal>ã
+ </para>
+ </callout>
+ </calloutlist>
+ </programlistingco>
+
+ <para>
+ çæ¬å·å¿
é¡»æ¯ä»¥ä¸ç±»åï¼<literal>long</literal>, <literal>integer</literal>,
+ <literal>short</literal>, <literal>timestamp</literal>æè
<literal>calendar</literal>ã
+ </para>
+
+ <para>
+ ä¸ä¸ªè±ç®¡ï¼detachedï¼å®ä¾çversionætimestampå±æ§ä¸è½ä¸ºç©ºï¼nullï¼ï¼å 为Hibernateä¸ç®¡
+ <literal>unsaved-value</literal>被æå®ä¸ºä½ç§çç¥ï¼å®å°ä»»ä½å±æ§ä¸ºç©ºçversionætimestamp
+ å®ä¾çä½ä¸ºç¬æ¶ï¼transientï¼å®ä¾ã
+ <emphasis>é¿å
Hibernateä¸çä¼ éééï¼transitive reattachmentï¼é®é¢çä¸ä¸ªç®åæ¹æ³æ¯
+ å®ä¹ä¸ä¸ªä¸è½ä¸ºç©ºçversionætimestampå±æ§ï¼ç¹å«æ¯å¨äººä»¬ä½¿ç¨ç¨åºåé
çæ è¯ç¬¦ï¼assigned identifiersï¼
+ æå¤å主é®æ¶é常æç¨ï¼</emphasis>
+ </para>
+ </sect2>
+
+ <sect2 id="mapping-declaration-timestamp" revision="4">
+ <title>timestamp (å¯é)</title>
+
+ <para>
+ å¯éç<literal><timestamp></literal>å
ç´ ææäºè¡¨ä¸å
å«æ¶é´æ³æ°æ®ã
+ è¿ç¨æ¥ä½ä¸ºçæ¬çæ¿ä»£ãæ¶é´æ³æ¬è´¨ä¸æ¯ä¸ç§å¯¹ä¹è§éå®çä¸ç§ä¸æ¯ç¹å«å®å
¨çå®ç°ãå½ç¶ï¼
+ ææ¶ååºç¨ç¨åºå¯è½å¨å
¶ä»æ¹é¢ä½¿ç¨æ¶é´æ³ã
+ </para>
+
+ <programlistingco>
+ <areaspec>
+ <area id="timestamp1" coords="2 70"/>
+ <area id="timestamp2" coords="3 70" />
+ <area id="timestamp3" coords="4 70" />
+ <area id="timestamp4" coords="5 70" />
+ <area id="timestamp5" coords="6 70" />
+ <area id="timestamp6" coords="7 70" />
+ </areaspec>
+ <programlisting><![CDATA[<timestamp
+ column="timestamp_column"
+ name="propertyName"
+ access="field|property|ClassName"
+ unsaved-value="null|undefined"
+ source="vm|db"
+ generated="never|always"
+ node="element-name|@attribute-name|element/@attribute|."
+/>]]></programlisting>
+ <calloutlist>
+ <callout arearefs="timestamp1">
+ <para>
+ <literal>column</literal> (å¯é - é»è®¤ä¸ºå±æ§å): æææ¶é´æ³çå段åã
+ </para>
+ </callout>
+ <callout arearefs="timestamp2">
+ <para>
+ <literal>name</literal>: å¨æä¹
åç±»ä¸çJavaBeansé£æ ¼çå±æ§åï¼
+ å
¶Javaç±»åæ¯ <literal>Date</literal> æè
<literal>Timestamp</literal>çã
+ </para>
+ </callout>
+ <callout arearefs="timestamp3">
+ <para>
+ <literal>access</literal> (å¯é - é»è®¤æ¯ <literal>property</literal>):
+ Hibernateç¨äºè®¿é®å±æ§å¼ççç¥ã
+ </para>
+ </callout>
+ <callout arearefs="timestamp4">
+ <para>
+ <literal>unsaved-value</literal> (å¯é - é»è®¤æ¯<literal>null</literal>):
+ ç¨äºæ ææ个å®ä¾æ¶åå被å®ä¾åçï¼å°æªä¿åï¼çæ¬å±æ§å¼ï¼ä¾é è¿ä¸ªå¼å°±å¯ä»¥æè¿ç§æ
åµå
+ å·²ç»å¨å
åçsessionä¸ä¿åæè£
è½½çè±ç®¡ï¼detachedï¼å®ä¾åºåå¼æ¥ãï¼<literal>undefined</literal>
+ ææ使ç¨æ è¯å±æ§å¼è¿è¡è¿ç§å¤æãï¼
+ </para>
+ </callout>
+ <callout arearefs="timestamp5">
+ <para>
+ <literal>source</literal> (å¯é - é»è®¤æ¯ <literal>vm</literal>):
+ Hibernateå¦ä½æè½è·åå°æ¶é´æ³çå¼å¢ï¼ä»æ°æ®åºï¼è¿æ¯å½åJVMï¼ä»æ°æ®åºè·åä¼å¸¦æ¥ä¸äºè´æ
ï¼å 为Hibernateå¿
须访é®æ°æ®åºæ¥è·å¾âä¸ä¸ä¸ªå¼âï¼ä½æ¯å¨é群ç¯å¢ä¸ä¼æ´å®å
¨äºãè¿è¦æ³¨æï¼å¹¶ä¸æ¯ææç<literal>Dialectï¼æ¹è¨ï¼</literal>é½æ¯æè·å¾æ°æ®åºçå½åæ¶é´æ³çï¼èæ¯æçæ°æ®åºä¸åæä¸é¨åå 为精度ä¸è¶³,ç¨äºéå®æ¯ä¸å®å
¨çï¼ä¾å¦Oracle 8ï¼ã
+ </para>
+ </callout>
+ <callout arearefs="timestamp6">
+ <para>
+ <literal>generated</literal> (å¯é - é»è®¤æ¯ <literal>never</literal>):
+ æåºæ¶é´æ³å¼æ¯å¦å®é
ä¸æ¯ç±æ°æ®åºçæç.请åé
<xref linkend="mapping-generated">generated properties</xref>ç讨论ã
+ </para>
+ </callout>
+ </calloutlist>
+ </programlistingco>
+
+ <para>
+ 注æï¼<literal><timestamp></literal> å<literal><version type="timestamp"></literal>æ¯çä»·çã并ä¸<literal><timestamp source="db"></literal>å<literal><version type="dbtimestamp"></literal>æ¯çä»·çã
+ </para>
+ </sect2>
+
+
+ <sect2 id="mapping-declaration-property" revision="4">
+ <title>property</title>
+
+ <para>
+ <literal><property></literal>å
ç´ ä¸ºç±»å®ä¹äºä¸ä¸ªæä¹
åç,JavaBeané£æ ¼çå±æ§ã
+ </para>
+
+ <programlistingco>
+ <areaspec>
+ <area id="property1" coords="2 70"/>
+ <area id="property2" coords="3 70"/>
+ <area id="property3" coords="4 70"/>
+ <areaset id="property4-5" coords="">
+ <area id="property4" coords='5 70'/>
+ <area id="property5" coords='6 70'/>
+ </areaset>
+ <area id="property6" coords="7 70"/>
+ <area id="property7" coords="8 70"/>
+ <area id="property8" coords="9 70"/>
+ <area id="property9" coords="10 70"/>
+ <area id="property10" coords="11 70"/>
+ <area id="property11" coords="12 70"/>
+ <area id="property12" coords="13 70"/>
+ </areaspec>
+ <programlisting><![CDATA[<property
+ name="propertyName"
+ column="column_name"
+ type="typename"
+ update="true|false"
+ insert="true|false"
+ formula="arbitrary SQL expression"
+ access="field|property|ClassName"
+ lazy="true|false"
+ unique="true|false"
+ not-null="true|false"
+ optimistic-lock="true|false"
+ generated="never|insert|always"
+ node="element-name|@attribute-name|element/@attribute|."
+
+ index="index_name"
+ unique_key="unique_key_id"
+ length="L"
+ precision="P"
+ scale="S"
+/>]]></programlisting>
+ <calloutlist>
+ <callout arearefs="property1">
+ <para>
+ <literal>name</literal>: å±æ§çåå,以å°ååæ¯å¼å¤´ã
+ </para>
+ </callout>
+ <callout arearefs="property2">
+ <para>
+ <literal>column</literal> (å¯é - é»è®¤ä¸ºå±æ§åå): 对åºçæ°æ®åºå段åã
+ ä¹å¯ä»¥éè¿åµå¥ç<literal><column></literal>å
ç´ æå®ã
+ </para>
+ </callout>
+ <callout arearefs="property3">
+ <para>
+ <literal>type</literal> (å¯é): ä¸ä¸ªHibernateç±»åçååã
+ </para>
+ </callout>
+ <callout arearefs="property4-5">
+ <para>
+ <literal>update, insert</literal> (å¯é - é»è®¤ä¸º <literal>true</literal>) :
+ 表æç¨äº<literal>UPDATE</literal> å/æ <literal>INSERT</literal>
+ çSQLè¯å¥ä¸æ¯å¦å
å«è¿ä¸ªè¢«æ å°äºçå段ãè¿äºè
å¦æé½è®¾ç½®ä¸º<literal>false</literal>
+ å表æè¿æ¯ä¸ä¸ªâå¤æºæ§ï¼derivedï¼âçå±æ§ï¼å®çå¼æ¥æºäºæ å°å°åä¸ä¸ªï¼æå¤ä¸ªï¼
+ å段çæäºå
¶ä»å±æ§ï¼æè
éè¿ä¸ä¸ªtrigger(触åå¨ï¼æå
¶ä»ç¨åºçæã
+ </para>
+ </callout>
+ <callout arearefs="property6">
+ <para>
+ <literal>formula</literal> (å¯é): ä¸ä¸ªSQL表达å¼ï¼å®ä¹äºè¿ä¸ª<emphasis>计ç®
+ ï¼computedï¼</emphasis> å±æ§çå¼ã计ç®å±æ§æ²¡æåå®å¯¹åºçæ°æ®åºå段ã
+ </para>
+ </callout>
+ <callout arearefs="property7">
+ <para>
+ <literal>access</literal> (å¯é - é»è®¤å¼ä¸º <literal>property</literal>):
+ Hibernateç¨æ¥è®¿é®å±æ§å¼ççç¥ã
+ </para>
+ </callout>
+ <callout arearefs="property8">
+ <para>
+ <literal>lazy</literal> (å¯é - é»è®¤ä¸º <literal>false</literal>): æå®
+ æå®å®ä¾åé第ä¸æ¬¡è¢«è®¿é®æ¶ï¼è¿ä¸ªå±æ§æ¯å¦å»¶è¿æåï¼fetched lazilyï¼ï¼
+ éè¦è¿è¡æ¶åèç å¢å¼ºï¼ã
+ </para>
+ </callout>
+ <callout arearefs="property9">
+ <para>
+ <literal>unique</literal> (å¯é): 使ç¨DDL为该å段添å å¯ä¸ç约æã
+ åæ ·ï¼å
许å®ä½ä¸º<literal>property-ref</literal>å¼ç¨çç®æ ã
+ </para>
+ </callout>
+ <callout arearefs="property10">
+ <para>
+ <literal>not-null</literal> (å¯é): 使ç¨DDL为该å段添å å¯å¦ä¸ºç©ºï¼nullabilityï¼ç约æã
+ </para>
+ </callout>
+ <callout arearefs="property11">
+ <para>
+ <literal>optimistic-lock</literal> (å¯é - é»è®¤ä¸º <literal>true</literal>):
+ æå®è¿ä¸ªå±æ§å¨åæ´æ°æ¶æ¯å¦éè¦è·å¾ä¹è§éå®ï¼optimistic lockï¼ã
+ æ¢å¥è¯è¯´ï¼å®å³å®è¿ä¸ªå±æ§åçèæ°æ®æ¶çæ¬ï¼versionï¼çå¼æ¯å¦å¢é¿ã
+ </para>
+ </callout>
+ <callout arearefs="property12">
+ <para>
+ <literal>generated</literal> (å¯é - é»è®¤ä¸º <literal>never</literal>):
+ 表ææ¤å±æ§å¼æ¯å¦å®é
ä¸æ¯ç±æ°æ®åºçæçã请åé
<xref linkend="mapping-generated">generated properties</xref>ç讨论ã
+ </para>
+ </callout>
+ </calloutlist>
+ </programlistingco>
+
+ <para>
+ <emphasis>typename</emphasis>å¯ä»¥æ¯å¦ä¸å ç§ï¼
+ </para>
+
+ <orderedlist spacing="compact">
+ <listitem>
+ <para>
+ Hibernateåºæ¬ç±»ååï¼æ¯å¦ï¼<literal>integer, string, character,date, timestamp,
+ float, binary, serializable, object, blob</literal>ï¼ã
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ ä¸ä¸ªJavaç±»çååï¼è¿ä¸ªç±»å±äºä¸ç§é»è®¤åºç¡ç±»å
+ (æ¯å¦ï¼ <literal>int, float,char, java.lang.String, java.util.Date, java.lang.Integer,
+ java.sql.Clob</literal>)ã
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ ä¸ä¸ªå¯ä»¥åºååçJavaç±»çååã
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ ä¸ä¸ªèªå®ä¹ç±»åçç±»çååãï¼æ¯å¦ï¼ <literal>com.illflow.type.MyCustomType</literal>)ã
+ </para>
+ </listitem>
+ </orderedlist>
+
+ <para>
+ å¦æä½ æ²¡ææå®ç±»åï¼Hibernarteä¼ä½¿ç¨åå°æ¥å¾å°è¿ä¸ªååçå±æ§ï¼ä»¥æ¤æ¥çæµæ£ç¡®çHibernateç±»åã
+ Hibernateä¼æç
§è§å2,3,4ç顺åºå¯¹å±æ§è¯»åå¨(getteræ¹æ³ï¼çè¿åç±»è¿è¡è§£éãç¶èï¼è¿è¿ä¸å¤ã
+ å¨æäºæ
åµä¸ä½ ä»ç¶éè¦<literal>type</literal>å±æ§ãï¼æ¯å¦ï¼ä¸ºäºåºå«<literal>Hibernate.DATE</literal>
+ å<literal>Hibernate.TIMESTAMP</literal>,æè
为äºæå®ä¸ä¸ªèªå®ä¹ç±»åãï¼
+ </para>
+
+ <para>
+ <literal>access</literal>å±æ§ç¨æ¥è®©ä½ æ§å¶Hibernateå¦ä½å¨è¿è¡æ¶è®¿é®å±æ§ãå¨é»è®¤æ
åµä¸ï¼
+ Hibernateä¼ä½¿ç¨å±æ§çget/setæ¹æ³å¯¹ï¼pairï¼ãå¦æä½ ææ<literal>access="field"</literal>,
+ Hibernateä¼å¿½ç¥get/setæ¹æ³å¯¹ï¼ç´æ¥ä½¿ç¨åå°æ¥è®¿é®æååéãä½ ä¹å¯ä»¥æå®ä½ èªå·±ççç¥ï¼
+ è¿å°±éè¦ä½ èªå·±å®ç°<literal>org.hibernate.property.PropertyAccessor</literal>æ¥å£ï¼
+ åå¨accessä¸è®¾ç½®ä½ èªå®ä¹çç¥ç±»çååã
+ </para>
+
+ <para>
+ è¡çå±æ§ï¼derive propertieï¼æ¯ä¸ä¸ªç¹å«å¼ºå¤§çç¹å¾ãè¿äºå±æ§åºè¯¥å®ä¹ä¸ºåªè¯»ï¼å±æ§å¼å¨è£
è½½æ¶è®¡ç®çæã
+ ä½ ç¨ä¸ä¸ªSQL表达å¼çæ计ç®çç»æï¼å®ä¼å¨è¿ä¸ªå®ä¾è½¬è½½æ¶ç¿»è¯æä¸ä¸ªSQLæ¥è¯¢ç<literal>SELECT</literal>
+ åæ¥è¯¢è¯å¥ã
+ </para>
+
+ <programlisting><![CDATA[
+<property name="totalPrice"
+ formula="( SELECT SUM (li.quantity*p.price) FROM LineItem li, Product p
+ WHERE li.productId = p.productId
+ AND li.customerId = customerId
+ AND li.orderNumber = orderNumber )"/>]]></programlisting>
+
+ <para>
+ 注æï¼ä½ å¯ä»¥ä½¿ç¨å®ä½èªå·±ç表ï¼èä¸ç¨ä¸ºè¿ä¸ªç¹å«çåå®ä¹å«åï¼
+ ä¸é¢ä¾åä¸ç<literal>customerId</literal>ï¼ãåæ¶æ³¨æï¼å¦æä½ ä¸å欢使ç¨å±æ§ï¼
+ ä½ å¯ä»¥ä½¿ç¨åµå¥ç<literal><formula></literal>æ å°å
ç´ ã
+ </para>
+
+ </sect2>
+
+ <sect2 id="mapping-declaration-manytoone" revision="5">
+ <title>å¤å¯¹ä¸ï¼many-to-oneï¼</title>
+
+ <para>
+ éè¿<literal>many-to-one</literal>å
ç´ ,å¯ä»¥å®ä¹ä¸ç§å¸¸è§çä¸å¦ä¸ä¸ªæä¹
åç±»çå
³èã
+ è¿ç§å
³ç³»æ¨¡åæ¯å¤å¯¹ä¸å
³èï¼å®é
ä¸æ¯ä¸ä¸ªå¯¹è±¡å¼ç¨ï¼è¯æ³¨ï¼ï¼è¿ä¸ªè¡¨çä¸ä¸ªå¤é®å¼ç¨ç®æ 表ç
+ 主é®å段ã
+ </para>
+
+ <programlistingco>
+ <areaspec>
+ <area id="manytoone1" coords="2 70"/>
+ <area id="manytoone2" coords="3 70"/>
+ <area id="manytoone3" coords="4 70"/>
+ <area id="manytoone4" coords="5 70"/>
+ <area id="manytoone5" coords="6 70"/>
+ <areaset id="manytoone6-7" coords="">
+ <area id="manytoone6" coords='7 70'/>
+ <area id="manytoone7" coords='8 70'/>
+ </areaset>
+ <area id="manytoone8" coords="9 70"/>
+ <area id="manytoone9" coords="10 70"/>
+ <area id="manytoone10" coords="11 70"/>
+ <area id="manytoone11" coords="12 70"/>
+ <area id="manytoone12" coords="13 70"/>
+ <area id="manytoone13" coords="14 70"/>
+ <area id="manytoone14" coords="15 70"/>
+ <area id="manytoone15" coords="16 70"/>
+ <area id="manytoone16" coords="17 70"/>
+ </areaspec>
+ <programlisting><![CDATA[<many-to-one
+ name="propertyName"
+ column="column_name"
+ class="ClassName"
+ cascade="cascade_style"
+ fetch="join|select"
+ update="true|false"
+ insert="true|false"
+ property-ref="propertyNameFromAssociatedClass"
+ access="field|property|ClassName"
+ unique="true|false"
+ not-null="true|false"
+ optimistic-lock="true|false"
+ lazy="proxy|no-proxy|false"
+ not-found="ignore|exception"
+ entity-name="EntityName"
+ formula="arbitrary SQL expression"
+ node="element-name|@attribute-name|element/@attribute|."
+
+ embed-xml="true|false"
+ index="index_name"
+ unique_key="unique_key_id"
+ foreign-key="foreign_key_name"
+
+/>]]></programlisting>
+ <calloutlist>
+ <callout arearefs="manytoone1">
+ <para>
+ <literal>name</literal>: å±æ§åã
+ </para>
+ </callout>
+ <callout arearefs="manytoone2">
+ <para>
+ <literal>column</literal> (å¯é): å¤é´å段åãå®ä¹å¯ä»¥éè¿åµå¥ç
+ <literal><column></literal>å
ç´ æå®ã
+ </para>
+ </callout>
+ <callout arearefs="manytoone3">
+ <para>
+ <literal>class</literal> (å¯é - é»è®¤æ¯éè¿åå°å¾å°å±æ§ç±»å): å
³èçç±»çååã
+ </para>
+ </callout>
+ <callout arearefs="manytoone4">
+ <para>
+ <literal>cascadeï¼çº§èï¼</literal> (å¯é): ææåªäºæä½ä¼ä»ç¶å¯¹è±¡çº§èå°å
³èç对象ã
+ </para>
+ </callout>
+ <callout arearefs="manytoone5">
+ <para>
+ <literal>fetch</literal> (å¯é - é»è®¤ä¸º <literal>select</literal>):
+ å¨å¤è¿æ¥æåï¼outer-join fetchingï¼ååºåéæ©æåï¼sequential select fetchingï¼ä¸¤è
ä¸éæ©å
¶ä¸ã
+ </para>
+ </callout>
+ <callout arearefs="manytoone6">
+ <para>
+ <literal>update, insert</literal> (å¯é - é»è®¤ä¸º <literal>true</literal>)
+ æå®å¯¹åºçå段æ¯å¦å
å«å¨ç¨äº<literal>UPDATE</literal> å/æ <literal>INSERT</literal>
+ çSQLè¯å¥ä¸ãå¦æäºè
é½æ¯<literal>false</literal>,åè¿æ¯ä¸ä¸ªçº¯ç²¹ç
+ âå¤æºæ§ï¼derivedï¼âå
³èï¼å®çå¼æ¯éè¿æ å°å°åä¸ä¸ªï¼æå¤ä¸ªï¼å段çæäºå
¶ä»å±æ§å¾å°
+ æè
éè¿trigger(触åå¨ï¼ãæå
¶ä»ç¨åºçæã
+ </para>
+ </callout>
+ <callout arearefs="manytoone7">
+ <para>
+ <literal>property-ref</literal>: (å¯é) æå®å
³èç±»çä¸ä¸ªå±æ§ï¼è¿ä¸ªå±æ§å°ä¼åæ¬å¤é®ç¸å¯¹åºã
+ å¦æ没ææå®ï¼ä¼ä½¿ç¨å¯¹æ¹å
³èç±»ç主é®ã
+ </para>
+ </callout>
+ <callout arearefs="manytoone8">
+ <para>
+ <literal>access</literal> (å¯é - é»è®¤æ¯ <literal>property</literal>):
+ Hibernateç¨æ¥è®¿é®å±æ§ççç¥ã
+ </para>
+ </callout>
+ <callout arearefs="manytoone9">
+ <para>
+ <literal>unique</literal> (å¯é): 使ç¨DDL为å¤é®å段çæä¸ä¸ªå¯ä¸çº¦æãæ¤å¤ï¼
+ è¿ä¹å¯ä»¥ç¨ä½<literal>property-ref</literal>çç®æ å±æ§ãè¿ä½¿å
³èåæ¶å
·æ
+ ä¸å¯¹ä¸çææã
+ </para>
+ </callout>
+ <callout arearefs="manytoone10">
+ <para>
+ <literal>not-null</literal> (å¯é): 使ç¨DDL为å¤é®å段çæä¸ä¸ªé空约æã
+ </para>
+ </callout>
+ <callout arearefs="manytoone11">
+ <para>
+ <literal>optimistic-lock</literal> (å¯é - é»è®¤ä¸º <literal>true</literal>):
+ æå®è¿ä¸ªå±æ§å¨åæ´æ°æ¶æ¯å¦éè¦è·å¾ä¹è§éå®ï¼optimistic lockï¼ã
+ æ¢å¥è¯è¯´ï¼å®å³å®è¿ä¸ªå±æ§åçèæ°æ®æ¶çæ¬ï¼versionï¼çå¼æ¯å¦å¢é¿ã
+ </para>
+ </callout>
+ <callout arearefs="manytoone12">
+ <para>
+ <literal>lazy</literal> (å¯é - é»è®¤ä¸º <literal>proxy</literal>):
+ é»è®¤æ
åµä¸ï¼åç¹å
³èæ¯ç»è¿ä»£ççã<literal>lazy="no-proxy"</literal>æå®æ¤å±æ§åºè¯¥å¨å®ä¾åé第ä¸æ¬¡è¢«è®¿é®æ¶åºè¯¥å»¶è¿æåï¼fetche lazilyï¼ï¼éè¦è¿è¡æ¶åèç çå¢å¼ºï¼ã
+ <literal>lazy="false"</literal>æå®æ¤å
³èæ»æ¯è¢«é¢å
æåã
+ </para>
+ </callout>
+ <callout arearefs="manytoone13">
+ <para>
+ <literal>not-found</literal> (å¯é - é»è®¤ä¸º <literal>exception</literal>):
+ æå®å¤é®å¼ç¨çæ°æ®ä¸åå¨æ¶å¦ä½å¤çï¼
+ <literal>ignore</literal>ä¼å°è¡æ°æ®ä¸åå¨è§ä¸ºä¸ä¸ªç©ºï¼nullï¼å
³èã
+ </para>
+ </callout>
+ <callout arearefs="manytoone14">
+ <para>
+ <literal>entity-name</literal> (å¯é): 被å
³èçç±»çå®ä½åã
+ </para>
+ </callout>
+ <callout arearefs="manytoone15">
+ <para>
+ <literal>formula</literal> (å¯é):
+ SQL表达å¼ï¼ç¨äºå®ä¹<emphasis>computedï¼è®¡ç®åºçï¼</emphasis>å¤é®å¼ã
+ </para>
+ </callout>
+
+ </calloutlist>
+ </programlistingco>
+
+
+ <para>
+ <literal>cascade</literal>å±æ§è®¾ç½®ä¸ºé¤äº<literal>none</literal>以å¤ä»»ä½ææä¹çå¼ï¼
+ å®å°æç¹å®çæä½ä¼ éå°å
³è对象ä¸ãè¿ä¸ªå¼å°±ä»£è¡¨çHibernateåºæ¬æä½çå称ï¼
+ <literal>persist, merge, delete, save-update, evict, replicate, lock, refresh</literal>ï¼
+ 以åç¹å«çå¼<literal>delete-orphan</literal>å<literal>all</literal>ï¼å¹¶ä¸å¯ä»¥ç¨éå·åé符
+ æ¥ç»åè¿äºæä½ï¼ä¾å¦ï¼<literal>cascade="persist,merge,evict"</literal>æ
+ <literal>cascade="all,delete-orphan"</literal>ãæ´å
¨é¢ç解é请åè<xref linkend="objectstate-transitive"/>. 注æï¼åå¼å
³è (many-to-one å
+ one-to-one å
³è) ä¸æ¯æå é¤å¤å¿ï¼orphan deleteï¼å é¤ä¸å被å¼ç¨çå¼ï¼.
+
+
+ </para>
+
+ <para>
+ ä¸ä¸ªå
¸åçç®å<literal>many-to-one</literal>å®ä¹ä¾åï¼
+ </para>
+
+ <programlisting><![CDATA[<many-to-one name="product" class="Product" column="PRODUCT_ID"/>]]></programlisting>
+
+ <para>
+ <literal>property-ref</literal>å±æ§åªåºè¯¥ç¨æ¥å¯¹ä»éçä¸æ¥çæ°æ®åºç³»ç»ï¼
+ å¯è½æå¤é®æå对æ¹å
³è表çæ¯ä¸ªé主é®å段ï¼ä½æ¯åºè¯¥æ¯ä¸ä¸ªæä¸å
³é®åï¼çæ
åµä¸ã
+ è¿æ¯ä¸ç§ååä¸éçå
³ç³»æ¨¡åãæ¯å¦è¯´ï¼å设<literal>Product</literal>ç±»æä¸ä¸ªæä¸çåºåå·ï¼
+ å®å¹¶ä¸æ¯ä¸»é®ãï¼<literal>unique</literal>å±æ§æ§å¶Hibernateéè¿SchemaExportå·¥å
·è¿è¡çDDLçæãï¼
+ </para>
+
+
+ <programlisting><![CDATA[<property name="serialNumber" unique="true" type="string" column="SERIAL_NUMBER"/>]]></programlisting>
+
+ <para>
+ é£ä¹å
³äº<literal>OrderItem</literal> çæ å°å¯è½æ¯ï¼
+ </para>
+
+ <programlisting><![CDATA[<many-to-one name="product" property-ref="serialNumber" column="PRODUCT_SERIAL_NUMBER"/>]]></programlisting>
+
+ <para>
+ å½ç¶ï¼æ们å³ä¸é¼å±è¿ç§ç¨æ³ã
+ </para>
+
+
+ <para>
+ å¦æ被å¼ç¨çå¯ä¸ä¸»é®ç±å
³èå®ä½çå¤ä¸ªå±æ§ç»æï¼ä½ åºè¯¥å¨å称为<literal><properties></literal>çå
ç´
+ éé¢æ å°ææå
³èçå±æ§ã
+ </para>
+
+ <para>
+ åè¥è¢«å¼ç¨çå¯ä¸ä¸»é®æ¯ç»ä»¶çå±æ§ï¼ä½ å¯ä»¥æå®å±æ§è·¯å¾ï¼
+ </para>
+
+ <programlisting><![CDATA[<many-to-one name="owner" property-ref="identity.ssn" column="OWNER_SSN"/>]]></programlisting>
+
+ </sect2>
+
+<sect2 id="mapping-declaration-onetoone" revision="3">
+ <title>ä¸å¯¹ä¸</title>
+
+ <para>
+ æä¹
å对象ä¹é´ä¸å¯¹ä¸çå
³èå
³ç³»æ¯éè¿<literal>one-to-one</literal>å
ç´ å®ä¹çã
+ </para>
+
+ <programlistingco>
+ <areaspec>
+ <area id="onetoone1" coords="2 70"/>
+ <area id="onetoone2" coords="3 70"/>
+ <area id="onetoone3" coords="4 70"/>
+ <area id="onetoone4" coords="5 70"/>
+ <area id="onetoone5" coords="6 70"/>
+ <area id="onetoone6" coords="7 70"/>
+ <area id="onetoone7" coords="8 70"/>
+ <area id="onetoone8" coords="9 70"/>
+ <area id="onetoone9" coords="10 70"/>
+ <area id="onetoone10" coords="11 70"/>
+ </areaspec>
+ <programlisting><![CDATA[<one-to-one
+ name="propertyName"
+ class="ClassName"
+ cascade="cascade_style"
+ constrained="true|false"
+ fetch="join|select"
+ property-ref="propertyNameFromAssociatedClass"
+ access="field|property|ClassName"
+ formula="any SQL expression"
+ lazy="proxy|no-proxy|false"
+ entity-name="EntityName"
+ node="element-name|@attribute-name|element/@attribute|."
+
+ embed-xml="true|false"
+ foreign-key="foreign_key_name"
+/>]]></programlisting>
+ <calloutlist>
+ <callout arearefs="onetoone1">
+ <para>
+ <literal>name</literal>: å±æ§çååã
+ </para>
+ </callout>
+ <callout arearefs="onetoone2">
+ <para>
+ <literal>class</literal> (å¯é - é»è®¤æ¯éè¿åå°å¾å°çå±æ§ç±»å)ï¼è¢«å
³èçç±»çååã
+ </para>
+ </callout>
+ <callout arearefs="onetoone3">
+ <para>
+ <literal>cascade(级è)</literal> (å¯é) 表ææä½æ¯å¦ä»ç¶å¯¹è±¡çº§èå°è¢«å
³èç对象ã
+ </para>
+ </callout>
+ <callout arearefs="onetoone4">
+ <para>
+ <literal>constrained(约æ)</literal> (å¯é) 表æ该类对åºç表对åºçæ°æ®åºè¡¨ï¼å被å
³èç对象æ对åºçæ°æ®åºè¡¨ä¹é´ï¼éè¿ä¸ä¸ªå¤é®å¼ç¨å¯¹ä¸»é®è¿è¡çº¦æã
+ è¿ä¸ªé项影å<literal>save()</literal>å<literal>delete()</literal>å¨çº§èæ§è¡æ¶çå
å顺åºä»¥å
+ å³å®è¯¥å
³èè½å¦è¢«å§æ(ä¹å¨schema export toolä¸è¢«ä½¿ç¨).
+ </para>
+ </callout>
+ <callout arearefs="onetoone5">
+ <para>
+ <literal>fetch</literal> (å¯é - é»è®¤è®¾ç½®ä¸º<literal>éæ©</literal>):
+ å¨å¤è¿æ¥æåæè
åºåéæ©æåéæ©å
¶ä¸.
+ </para>
+ </callout>
+ <callout arearefs="onetoone6">
+ <para>
+ <literal>property-ref</literal>: (å¯é) æå®å
³èç±»çå±æ§åï¼è¿ä¸ªå±æ§å°ä¼åæ¬ç±»ç主é®ç¸å¯¹åºãå¦æ没ææå®ï¼ä¼ä½¿ç¨å¯¹æ¹å
³èç±»ç主é®ã
+ </para>
+ </callout>
+ <callout arearefs="onetoone7">
+ <para>
+ <literal>access</literal> (å¯é - é»è®¤æ¯ <literal>property</literal>): Hibernateç¨æ¥è®¿é®å±æ§ççç¥ã
+ </para>
+ </callout>
+ <callout arearefs="onetoone8">
+ <para>
+ <literal>formula </literal> (å¯é):ç»å¤§å¤æ°ä¸å¯¹ä¸çå
³èé½æåå
¶å®ä½ç主é®ãå¨ä¸äºå°è§çæ
åµä¸ï¼ ä½ å¯è½ä¼æåå
¶ä»çä¸ä¸ªæå¤ä¸ªå段ï¼æè
æ¯ä¸ä¸ªè¡¨è¾¾å¼ï¼è¿äºæ
åµä¸ï¼ä½ å¯ä»¥ç¨ä¸ä¸ªSQLå
¬å¼æ¥è¡¨ç¤ºã ï¼å¯ä»¥å¨org.hibernate.test.onetooneformulaæ¾å°ä¾åï¼
+
+ </para>
+ </callout>
+ <callout arearefs="onetoone9">
+ <para>
+ <literal>lazy</literal> (å¯é - é»è®¤ä¸º <literal>proxy</literal>):
+ é»è®¤æ
åµä¸ï¼åç¹å
³èæ¯ç»è¿ä»£ççã<literal>lazy="no-proxy"</literal>æå®æ¤å±æ§åºè¯¥å¨å®ä¾åé第ä¸æ¬¡è¢«è®¿é®æ¶åºè¯¥å»¶è¿æåï¼fetche lazilyï¼ï¼éè¦è¿è¡æ¶åèç çå¢å¼ºï¼ã
+ <literal>lazy="false"</literal>æå®æ¤å
³èæ»æ¯è¢«é¢å
æåã<emphasis>注æï¼å¦æ<literal>constrained="false"</literal>,
+ ä¸å¯è½ä½¿ç¨ä»£çï¼Hibernateä¼éåé¢å
æåï¼</emphasis>
+ </para>
+ </callout>
+ <callout arearefs="onetoone10">
+ <para>
+ <literal>entity-name</literal> (å¯é): 被å
³èçç±»çå®ä½åã
+ </para>
+ </callout>
+ </calloutlist>
+ </programlistingco>
+
+ <para>
+ æ两ç§ä¸åçä¸å¯¹ä¸å
³èï¼
+ </para>
+ <itemizedlist>
+ <listitem>
+ <para>
+ 主é®å
³è
+ </para></listitem>
+ <listitem>
+ <para>
+ æä¸å¤é®å
³è
+ </para></listitem>
+ </itemizedlist>
+
+ <para>
+ 主é®å
³èä¸éè¦é¢å¤ç表å段ï¼å¦æ两è¡æ¯éè¿è¿ç§ä¸å¯¹ä¸å
³ç³»ç¸å
³èçï¼é£ä¹è¿ä¸¤è¡å°±å
±äº«åæ ·ç主å
³é®åå¼ãæ以å¦æä½ å¸æ两个对象éè¿ä¸»é®ä¸å¯¹ä¸å
³èï¼ä½ å¿
须确认å®ä»¬è¢«èµäºåæ ·çæ è¯å¼ï¼
+ </para>
+
+ <para>
+ æ¯å¦è¯´ï¼å¯¹ä¸é¢ç<literal>Employee</literal>å<literal>Person</literal>è¿è¡ä¸»é®ä¸å¯¹ä¸å
³è:
+ </para>
+
+
+ <programlisting><![CDATA[<one-to-one name="person" class="Person"/>]]></programlisting>
+ <programlisting><![CDATA[<one-to-one name="employee" class="Employee" constrained="true"/>]]></programlisting>
+
+ <para>
+ ç°å¨æ们å¿
须确ä¿PERSONåEMPLOYEEä¸ç¸å
³çå段æ¯ç¸ççãæ们使ç¨ä¸ä¸ªè¢«æ为<literal>foreign</literal>çç¹æ®çhibernateæ è¯ç¬¦çæçç¥ï¼
+ </para>
+
+ <programlisting><![CDATA[<class name="person" table="PERSON">
+ <id name="id" column="PERSON_ID">
+ <generator class="foreign">
+ <param name="property">employee</param>
+ </generator>
+ </id>
+ ...
+ <one-to-one name="employee"
+ class="Employee"
+ constrained="true"/>
+</class>]]></programlisting>
+
+ <para>
+ ä¸ä¸ªååä¿åç<literal>Person</literal>å®ä¾è¢«èµäºå该<literal>Person</literal>ç<literal>employee</literal>å±æ§ææåç<literal>Employee</literal>å®ä¾åæ ·çå
³é®åå¼ã
+ </para>
+
+ <para>
+ å¦ä¸ç§æ¹å¼æ¯ä¸ä¸ªå¤é®åä¸ä¸ªæä¸å
³é®å对åºï¼ä¸é¢ç<literal>Employee</literal>å<literal>Person</literal>çä¾åï¼å¦æ使ç¨è¿ç§å
³èæ¹å¼ï¼å¯ä»¥è¡¨è¾¾æï¼
+ </para>
+
+ <programlisting><![CDATA[<many-to-one name="person" class="Person" column="PERSON_ID" unique="true"/>]]></programlisting>
+
+ <para>
+ å¦æå¨<literal>Person</literal>çæ å°å å
¥ä¸é¢å å¥ï¼è¿ç§å
³èå°±æ¯ååçï¼
+ </para>
+
+ <programlisting><![CDATA[<one-to-one name="employee" class="Employee" property-ref="person"/>]]></programlisting>
+
+ </sect2>
+
+ <sect2 id="mapping-declaration-naturalid">
+ <title>èªç¶ID(natural-id)</title>
+
+ <programlisting><![CDATA[<natural-id mutable="true|false"/>
+ <property ... />
+ <many-to-one ... />
+ ......
+</natural-id>]]></programlisting>
+
+ <para>
+ æ们建议使ç¨ä»£ç¨é®ï¼é®å¼ä¸å
·å¤å®é
æä¹ï¼ä½ä¸ºä¸»é®ï¼æ们ä»ç¶åºè¯¥å°è¯ä¸ºææçå®ä½éç¨èªç¶çé®å¼ä½ä¸ºï¼éå ââè¯è
注ï¼æ 示ãèªç¶é®ï¼natural keyï¼æ¯å个æç»åå±æ§ï¼ä»ä»¬å¿
é¡»å¯ä¸ä¸é空ãå¦æå®è¿æ¯ä¸å¯åçé£å°±æ´çæ³äºãå¨<literal><natural-id></literal>å
ç´ ä¸ååºèªç¶é®çå±æ§ãHibernateä¼å¸®ä½ çæå¿
é¡»çå¯ä¸é®å¼åé空约æï¼ä½ çæ å°ä¼æ´å çææ¾ææï¼åææ¯self-documentingï¼èªæ注解ï¼ã
+ </para>
+
+ <para>
+ æ们强çå»ºè®®ä½ å®ç°<literal>equals()</literal> å<literal>hashCode()</literal>æ¹æ³,æ¥æ¯è¾å®ä½çèªç¶é®å±æ§ã
+ </para>
+
+ <para>
+ è¿ä¸æ å°ä¸æ¯ä¸ºäºæèªç¶é®ä½ä¸ºä¸»é®èåå¤çã
+ </para>
+
+ <itemizedlist spacing="compact">
+ <listitem>
+ <para>
+ <literal>mutable</literal> (å¯é, é»è®¤ä¸º<literal>false</literal>):
+ é»è®¤æ
åµä¸ï¼èªç¶æ è¯å±æ§è¢«åå®ä¸ºä¸å¯åçï¼å¸¸éï¼ã
+ </para>
+ </listitem>
+ </itemizedlist>
+
+ </sect2>
+
+
+ <sect2 id="mapping-declaration-component" revision="2">
+ <title>ç»ä»¶(component), å¨æç»ä»¶(dynamic-component)</title>
+
+ <para>
+ <literal><component></literal>å
ç´ æå对象çä¸äºå
ç´ ä¸ç¶ç±»å¯¹åºç表çä¸äºå段æ å°èµ·æ¥ã ç¶åç»ä»¶å¯ä»¥å®ä¹å®ä»¬èªå·±çå±æ§ãç»ä»¶æè
éåãåè§åé¢çâComponentsâä¸ç« ã
+ </para>
+
+ <programlistingco>
+ <areaspec>
+ <area id="component1" coords="2 45"/>
+ <area id="component2" coords="3 45"/>
+ <area id="component3" coords="4 45"/>
+ <area id="component4" coords="5 45"/>
+ <area id="component5" coords="6 45"/>
+ <area id="component6" coords="7 45"/>
+ <area id="component7" coords="8 45"/>
+ <area id="component8" coords="9 45"/>
+ </areaspec>
+ <programlisting><![CDATA[<component
+ name="propertyName"
+ class="className"
+ insert="true|false"
+ update="true|false"
+ access="field|property|ClassName"
+ lazy="true|false"
+ optimistic-lock="true|false"
+ unique="true|false"
+ node="element-name|."
+>
+
+ <property ...../>
+ <many-to-one .... />
+ ........
+</component>]]></programlisting>
+ <calloutlist>
+ <callout arearefs="component1">
+ <para>
+ <literal>name</literal>: å±æ§å
+ </para>
+
+ </callout>
+ <callout arearefs="component2">
+ <para>
+ <literal>class</literal> (å¯é - é»è®¤ä¸ºéè¿åå°å¾å°çå±æ§ç±»å):ç»ä»¶(å)ç±»çååã
+ </para>
+ </callout>
+ <callout arearefs="component3">
+ <para>
+ <literal>insert</literal>: 被æ å°çå段æ¯å¦åºç°å¨SQLç<literal>INSERT</literal>è¯å¥ä¸?
+ </para>
+ </callout>
+ <callout arearefs="component4">
+ <para>
+ <literal>update</literal>: 被æ å°çå段æ¯å¦åºç°å¨SQLç<literal>UPDATE</literal>è¯å¥ä¸?
+ </para>
+ </callout>
+ <callout arearefs="component5">
+ <para>
+ <literal>access</literal> (å¯é - é»è®¤æ¯ <literal>property</literal>): Hibernateç¨æ¥è®¿é®å±æ§ççç¥ã
+ </para>
+ </callout>
+ <callout arearefs="component6">
+ <para>
+ <literal>lazy</literal> (å¯é - é»è®¤æ¯ <literal>false</literal>): 表ææ¤ç»ä»¶åºå¨å®ä¾åé第ä¸æ¬¡è¢«è®¿é®çæ¶å延è¿å è½½(éè¦ç¼è¯æ¶åèç è£
ç½®å¨)
+ </para>
+ </callout>
+ <callout arearefs="component7">
+ <para>
+ <literal>optimistic-lock</literal> (å¯é - é»è®¤æ¯ <literal>true</literal>):表ææ´æ°æ¤ç»ä»¶æ¯å¦éè¦è·åä¹è§éãæ¢å¥è¯è¯´ï¼å½è¿ä¸ªå±æ§åèæ¶ï¼æ¯å¦å¢å çæ¬å·(Version)
+ </para>
+ </callout>
+ <callout arearefs="component8">
+ <para>
+ <literal>unique</literal> (å¯é - é»è®¤æ¯ <literal>false</literal>):表æç»ä»¶æ å°çææå段ä¸é½æå¯ä¸æ§çº¦æ
+ </para>
+ </callout>
+ </calloutlist>
+ </programlistingco>
+
+ <para>
+ å
¶<literal><property></literal>åæ ç¾ä¸ºåç±»çä¸äºå±æ§ä¸è¡¨å段ä¹é´å»ºç«æ å°ã
+ </para>
+
+ <para>
+ <literal><component></literal>å
ç´ å
许å å
¥ä¸ä¸ª<literal><parent></literal>åå
ç´ ï¼å¨ç»ä»¶ç±»å
é¨å°±å¯ä»¥æä¸ä¸ªæåå
¶å®¹å¨çå®ä½çååå¼ç¨ã
+ </para>
+
+ <para>
+ <literal><dynamic-component></literal>å
ç´ å
许æä¸ä¸ª<literal>Map</literal>æ å°ä¸ºç»ä»¶ï¼å
¶å±æ§å对åºmapçé®å¼ã
+ åè§<xref linkend="components-dynamic"/>.
+ </para>
+
+ </sect2>
+
+ <sect2 id="mapping-declaration-properties" revision="2">
+ <title>properties</title>
+
+ <para>
+ <literal><properties></literal> å
ç´ å
许å®ä¹ä¸ä¸ªå½åçé»è¾åç»(grouping)å
å«ä¸ä¸ªç±»ä¸çå¤ä¸ªå±æ§ã
+ è¿ä¸ªå
ç´ æéè¦çç¨å¤æ¯å
许å¤ä¸ªå±æ§çç»åä½ä¸º<literal>property-ref</literal>çç®æ (target)ã
+ è¿ä¹æ¯å®ä¹å¤å段å¯ä¸çº¦æçä¸ç§æ¹ä¾¿éå¾ã
+ </para>
+
+ <programlistingco>
+ <areaspec>
+ <area id="properties1" coords="2 45"/>
+ <area id="properties2" coords="3 45"/>
+ <area id="properties3" coords="4 45"/>
+ <area id="properties4" coords="5 45"/>
+ <area id="properties5" coords="6 45"/>
+ </areaspec>
+ <programlisting><![CDATA[<properties
+ name="logicalName"
+ insert="true|false"
+ update="true|false"
+ optimistic-lock="true|false"
+ unique="true|false"
+>
+
+ <property ...../>
+ <many-to-one .... />
+ ........
+</properties>]]></programlisting>
+ <calloutlist>
+ <callout arearefs="properties1">
+ <para>
+ <literal>name</literal>: åç»çé»è¾å称 -
+ <emphasis>ä¸æ¯</emphasis> å®é
å±æ§çå称.
+ </para>
+ </callout>
+ <callout arearefs="properties2">
+ <para>
+ <literal>insert</literal>: 被æ å°çå段æ¯å¦åºç°å¨SQLç
+ <literal>INSERT</literal>è¯å¥ä¸?
+ </para>
+ </callout>
+ <callout arearefs="properties3">
+ <para>
+ <literal>update</literal>: 被æ å°çå段æ¯å¦åºç°å¨SQLç
+ <literal>UPDATE</literal>è¯å¥ä¸?
+ </para>
+ </callout>
+ <callout arearefs="properties4">
+ <para>
+ <literal>optimistic-lock</literal> (å¯é - é»è®¤æ¯ <literal>true</literal>):表ææ´æ°æ¤ç»ä»¶æ¯å¦éè¦è·åä¹è§éãæ¢å¥è¯è¯´ï¼å½è¿ä¸ªå±æ§åèæ¶ï¼æ¯å¦å¢å çæ¬å·(Version)
+ </para>
+ </callout>
+ <callout arearefs="properties5">
+ <para>
+ <literal>unique</literal> (å¯é - é»è®¤æ¯ <literal>false</literal>):表æç»ä»¶æ å°çææå段ä¸é½æå¯ä¸æ§çº¦æ
+ </para>
+ </callout>
+ </calloutlist>
+ </programlistingco>
+
+ <para>
+ ä¾å¦ï¼å¦ææ们æå¦ä¸ç<literal><properties></literal>æ å°:
+ </para>
+
+ <programlisting><![CDATA[<class name="Person">
+ <id name="personNumber"/>
+ ...
+ <properties name="name"
+ unique="true" update="false">
+ <property name="firstName"/>
+ <property name="initial"/>
+ <property name="lastName"/>
+ </properties>
+</class>]]></programlisting>
+
+ <para>
+ ç¶åï¼æ们å¯è½æä¸äºéççæ°æ®å
³èï¼å¼ç¨ <literal>Person</literal>表çè¿ä¸ªå¯ä¸é®ï¼èä¸æ¯ä¸»é®ã
+ </para>
+ <programlisting><![CDATA[<many-to-one name="person"
+ class="Person" property-ref="name">
+ <column name="firstName"/>
+ <column name="initial"/>
+ <column name="lastName"/>
+</many-to-one>]]></programlisting>
+
+ <para>
+ æ们并ä¸æ¨èè¿æ ·ä½¿ç¨ï¼é¤éå¨æ å°éçæ°æ®çæ
åµä¸ã
+ </para>
+
+ </sect2>
+
+ <sect2 id="mapping-declaration-subclass" revision="4">
+ <title>åç±»(subclass)</title>
+
+ <para>
+ æåï¼å¤ææä¹
åéè¦ä¸ºç¶ç±»çæ¯ä¸ªåç±»é½è¿è¡å®ä¹ã对äºâæ¯ä¸æ£µç±»ç»§æ¿æ 对åºä¸ä¸ªè¡¨âççç¥æ¥è¯´ï¼å°±éè¦ä½¿ç¨<literal><subclass></literal>å®ä¹ã
+ </para>
+
+ <programlistingco>
+ <areaspec>
+ <area id="subclass1" coords="2 55"/>
+ <area id="subclass2" coords="3 55"/>
+ <area id="subclass3" coords="4 55"/>
+ <area id="subclass4" coords="5 55"/>
+ </areaspec>
+ <programlisting><![CDATA[<subclass
+ name="ClassName"
+ discriminator-value="discriminator_value"
+ proxy="ProxyInterface"
+ lazy="true|false"
+ dynamic-update="true|false"
+ dynamic-insert="true|false"
+ entity-name="EntityName"
+ node="element-name"
+ extends="SuperclassName">
+
+ <property .... />
+ .....
+</subclass>]]></programlisting>
+ <calloutlist>
+ <callout arearefs="subclass1">
+ <para>
+ <literal>name</literal>: åç±»çå
¨éå®åã
+ </para>
+ </callout>
+ <callout arearefs="subclass2">
+ <para>
+ <literal>discriminator-value(辨å«æ å¿)</literal> (å¯é - é»è®¤ä¸ºç±»å):ä¸ä¸ªç¨äºåºåæ¯ä¸ªç¬ç«çåç±»çå¼ã
+ </para>
+ </callout>
+ <callout arearefs="subclass3">
+ <para>
+ <literal>proxy(代ç)</literal> (å¯é): æå®ä¸ä¸ªç±»æè
æ¥å£ï¼å¨å»¶è¿è£
è½½æ¶ä½ä¸ºä»£ç使ç¨ã
+ </para>
+ </callout>
+ <callout arearefs="subclass4">
+ <para>
+ <literal>lazy</literal> (å¯é, é»è®¤æ¯<literal>true</literal>): 设置为
+ <literal>lazy="false"</literal> ç¦æ¢ä½¿ç¨å»¶è¿æå
+ </para>
+ </callout>
+ </calloutlist>
+ </programlistingco>
+
+ <para>
+ æ¯ä¸ªåç±»é½åºè¯¥å®ä¹å®èªå·±çæä¹
åå±æ§ååç±»ã
+ <literal><version></literal> å<literal><id></literal> å±æ§å¯ä»¥ä»æ ¹ç¶ç±»ç»§æ¿ä¸æ¥ãå¨ä¸æ£µç»§æ¿æ ä¸çæ¯ä¸ªåç±»é½å¿
é¡»å®ä¹ä¸ä¸ªå¯ä¸ç<literal>discriminator-value</literal>ãå¦æ没ææå®ï¼å°±ä¼ä½¿ç¨Javaç±»çå
¨éå®åã
+ </para>
+
+
+ <para>
+ æ´å¤å
³äºç»§æ¿æ å°çä¿¡æ¯, åè <xref linkend="inheritance"/>ç« è.
+ </para>
+ </sect2>
+
+ <sect2 id="mapping-declaration-joinedsubclass" revision="3">
+ <title>è¿æ¥çåç±»(joined-subclass)</title>
+
+ <para>
+ æ¤å¤ï¼æ¯ä¸ªåç±»å¯è½è¢«æ å°å°ä»èªå·±ç表ä¸(æ¯ä¸ªåç±»ä¸ä¸ªè¡¨ççç¥)ã被继æ¿çç¶æéè¿åè¶
ç±»ç表å
³èå¾å°ãæ们使ç¨<literal><joined-subclass></literal>å
ç´ ã
+ </para>
+ <programlistingco>
+ <areaspec>
+ <area id="joinedsubclass1" coords="2 45"/>
+ <area id="joinedsubclass2" coords="3 45"/>
+ <area id="joinedsubclass3" coords="4 45"/>
+ <area id="joinedsubclass4" coords="5 45"/>
+ </areaspec>
+ <programlisting><![CDATA[<joined-subclass
+ name="ClassName"
+ table="tablename"
+ proxy="ProxyInterface"
+ lazy="true|false"
+ dynamic-update="true|false"
+ dynamic-insert="true|false"
+ schema="schema"
+ catalog="catalog"
+ extends="SuperclassName"
+ persister="ClassName"
+ subselect="SQL expression"
+ entity-name="EntityName"
+ node="element-name">
+
+ <key .... >
+
+ <property .... />
+ .....
+</joined-subclass>]]></programlisting>
+ <calloutlist>
+ <callout arearefs="joinedsubclass1">
+ <para>
+ <literal>name</literal>: åç±»çå
¨éå®åã
+ </para>
+ </callout>
+ <callout arearefs="joinedsubclass2">
+ <para>
+ <literal>table</literal>: åç±»ç表å.
+ </para>
+ </callout>
+ <callout arearefs="joinedsubclass3">
+ <para>
+ <literal>proxy</literal> (å¯é): æå®ä¸ä¸ªç±»æè
æ¥å£ï¼å¨å»¶è¿è£
è½½æ¶ä½ä¸ºä»£ç使ç¨ã
+ </para>
+ </callout>
+ <callout arearefs="joinedsubclass4">
+ <para>
+ <literal>lazy</literal> (å¯é, é»è®¤æ¯ <literal>true</literal>): 设置为
+ <literal>lazy="false"</literal> ç¦æ¢ä½¿ç¨å»¶è¿è£
è½½ã
+ </para>
+ </callout>
+ </calloutlist>
+ </programlistingco>
+
+ <para>
+ è¿ç§æ å°çç¥ä¸éè¦æå®è¾¨å«æ å¿(discriminator)å段ãä½æ¯ï¼æ¯ä¸ä¸ªåç±»é½å¿
须使ç¨<literal><key></literal>å
ç´ æå®ä¸ä¸ªè¡¨å段æ¥ææ对象çæ è¯ç¬¦ãæ¬ç« å¼å§çæ å°å¯ä»¥è¢«ç¨å¦ä¸æ¹å¼éåï¼
+ </para>
+
+ <programlisting><![CDATA[<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC
+ "-//Hibernate/Hibernate Mapping DTD//EN"
+ "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<hibernate-mapping package="eg">
+
+ <class name="Cat" table="CATS">
+ <id name="id" column="uid" type="long">
+ <generator class="hilo"/>
+ </id>
+ <property name="birthdate" type="date"/>
+ <property name="color" not-null="true"/>
+ <property name="sex" not-null="true"/>
+ <property name="weight"/>
+ <many-to-one name="mate"/>
+ <set name="kittens">
+ <key column="MOTHER"/>
+ <one-to-many class="Cat"/>
+ </set>
+ <joined-subclass name="DomesticCat" table="DOMESTIC_CATS">
+ <key column="CAT"/>
+ <property name="name" type="string"/>
+ </joined-subclass>
+ </class>
+
+ <class name="eg.Dog">
+ <!-- mapping for Dog could go here -->
+ </class>
+
+</hibernate-mapping>]]></programlisting>
+
+ <para>
+ æ´å¤å
³äºç»§æ¿æ å°çä¿¡æ¯ï¼åè<xref linkend="inheritance"/>ã
+ </para>
+ </sect2>
+
+ <sect2 id="mapping-declaration-unionsubclass" revision="2">
+ <title>èååç±»(union-subclass)</title>
+
+ <para>
+ 第ä¸ç§éæ©æ¯ä»
ä»
æ å°ç±»ç»§æ¿æ ä¸å
·ä½ç±»é¨åå°è¡¨ä¸(æ¯ä¸ªå
·ä½ç±»ä¸å¼ 表ççç¥)ãå
¶ä¸ï¼æ¯å¼ 表å®ä¹äºç±»çæææä¹
åç¶æï¼å
æ¬ç»§æ¿çç¶æãå¨ Hibernate ä¸ï¼å¹¶ä¸éè¦å®å
¨æ¾å¼å°æ å°è¿æ ·ç继æ¿æ ãä½ å¯ä»¥ç®åå°ä½¿ç¨åç¬ç<literal><class></literal>å®ä¹æ å°æ¯ä¸ªç±»ãç¶èï¼å¦æä½ æ³ä½¿ç¨å¤æå
³è(ä¾å¦ï¼ä¸ä¸ªå¯¹ç±»ç»§æ¿æ ä¸è¶
ç±»çå
³è)ï¼ä½ éè¦ä½¿ç¨<literal><union-subclass></literal>æ å°ã
+ </para>
+ <programlistingco>
+ <areaspec>
+ <area id="unionsubclass1" coords="2 45"/>
+ <area id="unionsubclass2" coords="3 45"/>
+ <area id="unionsubclass3" coords="4 45"/>
+ <area id="unionsubclass4" coords="5 45"/>
+ </areaspec>
+ <programlisting><![CDATA[<union-subclass
+ name="ClassName"
+ table="tablename"
+ proxy="ProxyInterface"
+ lazy="true|false"
+ dynamic-update="true|false"
+ dynamic-insert="true|false"
+ schema="schema"
+ catalog="catalog"
+ extends="SuperclassName"
+ abstract="true|false"
+ persister="ClassName"
+ subselect="SQL expression"
+ entity-name="EntityName"
+ node="element-name">
+
+ <property .... />
+ .....
+</union-subclass>]]></programlisting>
+ <calloutlist>
+ <callout arearefs="unionsubclass1">
+ <para>
+ <literal>name</literal>: åç±»çå
¨éå®åã
+ </para>
+ </callout>
+ <callout arearefs="unionsubclass2">
+ <para>
+ <literal>table</literal>: åç±»ç表å
+ </para>
+ </callout>
+ <callout arearefs="unionsubclass3">
+ <para>
+ <literal>proxy</literal> (å¯é): æå®ä¸ä¸ªç±»æè
æ¥å£ï¼å¨å»¶è¿è£
è½½æ¶ä½ä¸ºä»£ç使ç¨ã
+ </para>
+ </callout>
+ <callout arearefs="unionsubclass4">
+ <para>
+ <literal>lazy</literal> (å¯é, é»è®¤æ¯ <literal>true</literal>): 设置为
+ <literal>lazy="false"</literal> ç¦æ¢ä½¿ç¨å»¶è¿è£
è½½ã
+ </para>
+ </callout>
+ </calloutlist>
+ </programlistingco>
+
+ <para>
+ è¿ç§æ å°çç¥ä¸éè¦æå®è¾¨å«æ å¿(discriminator)å段ã
+ </para>
+ <para>
+ æ´å¤å
³äºç»§æ¿æ å°çä¿¡æ¯ï¼åè<xref linkend="inheritance"/>ã
+ </para>
+ </sect2>
+
+ <sect2 id="mapping-declaration-join" revision="3">
+ <title>è¿æ¥(join)</title>
+
+ <para>
+ ä½¿ç¨ <literal><join></literal> å
ç´ ï¼åè¥å¨è¡¨ä¹é´åå¨ä¸å¯¹ä¸å
³è,å¯ä»¥å°ä¸ä¸ªç±»çå±æ§æ å°å°å¤å¼ 表ä¸ã
+ </para>
+
+ <programlistingco>
+ <areaspec>
+ <area id="join1" coords="2 50"/>
+ <area id="join2" coords="3 50"/>
+ <area id="join3" coords="4 50"/>
+ <area id="join4" coords="5 50"/>
+ <area id="join5" coords="6 50"/>
+ <area id="join6" coords="7 50"/>
+ </areaspec>
+ <programlisting><![CDATA[<join
+ table="tablename"
+ schema="owner"
+ catalog="catalog"
+ fetch="join|select"
+ inverse="true|false"
+ optional="true|false">
+
+ <key ... />
+
+ <property ... />
+ ...
+</join>]]></programlisting>
+
+ <calloutlist>
+ <callout arearefs="join1">
+ <para>
+ <literal>table</literal>: 被è¿æ¥è¡¨çå称ã
+ </para>
+ </callout>
+ <callout arearefs="join2">
+ <para>
+ <literal>schema</literal> (å¯é):è¦çç±æ ¹<literal><hibernate-mapping></literal>å
ç´ æå®ç模å¼å称ã
+ </para>
+ </callout>
+ <callout arearefs="join3">
+ <para>
+ <literal>catalog</literal> (å¯é): è¦çç±æ ¹ <literal><hibernate-mapping></literal>å
ç´ æå®çç®å½å称ã
+ </para>
+ </callout>
+ <callout arearefs="join4">
+ <para>
+ <literal>fetch</literal> (å¯é - é»è®¤æ¯ <literal>join</literal>):
+ å¦æ设置为é»è®¤å¼<literal>join</literal>ï¼ Hibernate å°ä½¿ç¨ä¸ä¸ªå
è¿æ¥æ¥å¾å°è¿ä¸ªç±»æå
¶è¶
ç±»å®ä¹ç<literal><join></literal>ï¼è使ç¨ä¸ä¸ªå¤è¿æ¥æ¥å¾å°å
¶åç±»å®ä¹ç<literal><join></literal>ãå¦æ设置为<literal>select</literal>ï¼å Hibernate å°ä¸ºåç±»å®ä¹ç <literal><join></literal>使ç¨é¡ºåºéæ©ãè¿ä»
å¨ä¸è¡æ°æ®è¡¨ç¤ºä¸ä¸ªåç±»ç对象çæ¶åæä¼åçã对è¿ä¸ªç±»åå
¶è¶
ç±»å®ä¹ç<literal><join></literal>ï¼ä¾ç¶ä¼ä½¿ç¨å
è¿æ¥å¾å°ã
+ </para>
+ </callout>
+ <callout arearefs="join5">
+ <para>
+ <literal>inverse</literal> (å¯é - é»è®¤æ¯ <literal>false</literal>):
+ å¦ææå¼ï¼Hibernate ä¸ä¼æå
¥æè
æ´æ°æ¤è¿æ¥å®ä¹çå±æ§ã
+ </para>
+ </callout>
+ <callout arearefs="join6">
+ <para>
+ <literal>optional</literal> (å¯é - é»è®¤æ¯ <literal>false</literal>):
+ å¦ææå¼ï¼Hibernate åªä¼å¨æ¤è¿æ¥å®ä¹çå±æ§é空æ¶æå
¥ä¸è¡æ°æ®ï¼å¹¶ä¸æ»æ¯ä½¿ç¨ä¸ä¸ªå¤è¿æ¥æ¥å¾å°è¿äºå±æ§ã
+ </para>
+ </callout>
+ </calloutlist>
+ </programlistingco>
+
+ <para>
+ ä¾å¦ï¼ä¸ä¸ªäºº(person)çå°å(address)ä¿¡æ¯å¯ä»¥è¢«æ å°å°åç¬ç表ä¸(并ä¿çææå±æ§çå¼ç±»åè¯ä¹)ï¼
+ </para>
+
+ <programlisting><![CDATA[<class name="Person"
+ table="PERSON">
+
+ <id name="id" column="PERSON_ID">...</id>
+
+ <join table="ADDRESS">
+ <key column="ADDRESS_ID"/>
+ <property name="address"/>
+ <property name="zip"/>
+ <property name="country"/>
+ </join>
+ ...]]></programlisting>
+
+ <para>
+ æ¤ç¹æ§å¸¸å¸¸å¯¹éçæ°æ®æ¨¡åæç¨ï¼æ们æ¨è表个æ°æ¯ç±»ä¸ªæ°å°ï¼ä»¥åç»ç²åº¦çé¢å模åãç¶èï¼å¨åç¬ç继æ¿æ ä¸åæ¢ç»§æ¿æ å°çç¥æ¯æç¨çï¼åé¢ä¼è§£éè¿ç¹ã
+ </para>
+ </sect2>
+
+ <sect2 id="mapping-declaration-key">
+ <title>é®(key)</title>
+
+ <para>
+ æ们ç®åå·²ç»è§å°è¿<literal><key></literal>å
ç´ å¤æ¬¡äºã è¿ä¸ªå
ç´ å¨ç¶æ å°å
ç´ å®ä¹äºå¯¹æ°è¡¨çè¿æ¥ï¼å¹¶ä¸å¨è¢«è¿æ¥è¡¨ä¸å®ä¹äºä¸ä¸ªå¤é®å¼ç¨å表ç主é®çæ
åµä¸ç»å¸¸ä½¿ç¨ã
+ </para>
+
+ <programlistingco>
+ <areaspec>
+ <area id="key1" coords="2 50"/>
+ <area id="key2" coords="3 50"/>
+ <area id="key3" coords="4 50"/>
+ <area id="key4" coords="5 50"/>
+ <area id="key5" coords="6 50"/>
+ <area id="key6" coords="7 50"/>
+ </areaspec>
+ <programlisting><![CDATA[<key
+ column="columnname"
+ on-delete="noaction|cascade"
+ property-ref="propertyName"
+ not-null="true|false"
+ update="true|false"
+ unique="true|false"
+/>]]></programlisting>
+
+ <calloutlist>
+ <callout arearefs="key1">
+ <para>
+ <literal>column</literal> (å¯é): å¤é®å段çå称ãä¹å¯ä»¥éè¿åµå¥ç <literal><column></literal>æå®ã
+ </para>
+ </callout>
+ <callout arearefs="key2">
+ <para>
+ <literal>on-delete</literal> (å¯é, é»è®¤æ¯ <literal>noaction</literal>):
+ 表æå¤é®å
³èæ¯å¦æå¼æ°æ®åºçº§å«ç级èå é¤ã
+ </para>
+ </callout>
+ <callout arearefs="key3">
+ <para>
+ <literal>property-ref</literal> (å¯é): 表æå¤é®å¼ç¨çå段ä¸æ¯å表ç主é®(æä¾ç»éçæ°æ®)ã
+ </para>
+ </callout>
+ <callout arearefs="key4">
+ <para>
+ <literal>not-null</literal> (å¯é): 表æå¤é®çå段ä¸å¯ä¸ºç©º(è¿æå³çæ 论ä½æ¶å¤é®é½æ¯ä¸»é®çä¸é¨å)ã
+ </para>
+ </callout>
+ <callout arearefs="key5">
+ <para>
+ <literal>update</literal> (å¯é): 表æå¤é®å³ä¸åºè¯¥è¢«æ´æ°(è¿æå³çæ 论ä½æ¶å¤é®é½æ¯ä¸»é®çä¸é¨å)ã
+ </para>
+ </callout>
+ <callout arearefs="key6">
+ <para>
+ <literal>unique</literal> (å¯é): 表æå¤é®åºæå¯ä¸æ§çº¦æ (è¿æå³çæ 论ä½æ¶å¤é®é½æ¯ä¸»é®çä¸é¨å)ã
+ </para>
+ </callout>
+ </calloutlist>
+ </programlistingco>
+
+ <para>
+ 对é£äºçéå é¤æ§è½çç³»ç»ï¼æ们æ¨èææçé®é½åºè¯¥å®ä¹ä¸º<literal>on-delete="cascade"</literal>ï¼è¿æ · Hibernate å°ä½¿ç¨æ°æ®åºçº§ç<literal>ON CASCADE DELETE</literal>约æï¼èä¸æ¯å¤ä¸ª<literal>DELETE</literal>è¯å¥ã 注æï¼è¿ä¸ªç¹æ§ä¼ç»è¿ Hibernate é常对çæ¬æ°æ®(versioned data)éç¨çä¹è§éçç¥ã
+ </para>
+ <para>
+ <literal>not-null</literal> å <literal>update</literal> å±æ§å¨æ å°ååä¸å¯¹å¤å
³èçæ¶åæç¨ãå¦æä½ æ å°ä¸ä¸ªååä¸å¯¹å¤å
³èå°é空ç(non-nullable)å¤é®ï¼ä½ <emphasis>å¿
é¡»</emphasis> ç¨<literal><key not-null="true"></literal>å®ä¹æ¤é®å段ã
+ </para>
+ </sect2>
+
+ <sect2 id="mapping-column" revision="4">
+ <title>å段åè§åå
ç´ ï¼column and formula elementsï¼</title>
+ <para>
+ ä»»ä½æ¥å<literal>column</literal>å±æ§çæ å°å
ç´ é½å¯ä»¥éæ©æ¥å<literal><column></literal> åå
ç´ ãåæ ·çï¼<literal>formula</literal>åå
ç´ ä¹å¯ä»¥æ¿æ¢<literal><formula></literal>å±æ§ã
+ </para>
+ <programlisting><![CDATA[<column
+ name="column_name"
+ length="N"
+ precision="N"
+ scale="N"
+ not-null="true|false"
+ unique="true|false"
+ unique-key="multicolumn_unique_key_name"
+ index="index_name"
+ sql-type="sql_type_name"
+ check="SQL expression"
+ default="SQL expression"/>]]></programlisting>
+
+ <programlisting><![CDATA[<formula>SQL expression</formula>]]></programlisting>
+ <para>
+ <literal>column</literal> å <literal>formula</literal> å±æ§çè³å¯ä»¥å¨åä¸ä¸ªå±æ§æå
³èæ å°ä¸è¢«å并æ¥è¡¨è¾¾ï¼ä¾å¦ï¼ä¸äºå¥å¼çè¿æ¥æ¡ä»¶ã
+ </para>
+ <programlisting><![CDATA[<many-to-one name="homeAddress" class="Address"
+ insert="false" update="false">
+ <column name="person_id" not-null="true" length="10"/>
+ <formula>'MAILING'</formula>
+</many-to-one>]]></programlisting>
+
+ </sect2>
+
+ <sect2 id="mapping-declaration-import">
+ <title>å¼ç¨(import)</title>
+
+ <para>
+ åè®¾ä½ çåºç¨ç¨åºæ两个åæ ·ååçæä¹
åç±»ï¼ä½æ¯ä½ ä¸æ³å¨Hibernateæ¥è¯¢ä¸ä½¿ç¨ä»ä»¬çå
¨éå®åãé¤äºä¾èµ<literal>auto-import="true"</literal>以å¤ï¼ç±»ä¹å¯ä»¥è¢«æ¾å¼å°âimport(å¼ç¨)âãä½ çè³å¯ä»¥å¼ç¨æ²¡æ被æç¡®æ å°çç±»åæ¥å£ã
+ </para>
+
+ <programlisting><![CDATA[<import class="java.lang.Object" rename="Universe"/>]]></programlisting>
+
+ <programlistingco>
+ <areaspec>
+ <area id="import1" coords="2 40"/>
+ <area id="import2" coords="3 40"/>
+ </areaspec>
+ <programlisting><![CDATA[<import
+ class="ClassName"
+ rename="ShortName"
+/>]]></programlisting>
+ <calloutlist>
+ <callout arearefs="import1">
+ <para>
+ <literal>class</literal>: ä»»ä½Javaç±»çå
¨éå®åã
+ </para>
+ </callout>
+ <callout arearefs="import2">
+ <para>
+ <literal>rename</literal> (å¯é - é»è®¤ä¸ºç±»çå
¨éå®å):
+ å¨æ¥è¯¢è¯å¥ä¸å¯ä»¥ä½¿ç¨çååã
+ </para>
+ </callout>
+ </calloutlist>
+ </programlistingco>
+
+ </sect2>
+
+ <sect2 id="mapping-types-anymapping" revision="2">
+ <title>any</title>
+ <para>
+ è¿æ¯å±æ§æ å°çåä¸ç§ç±»åã<literal><any></literal> æ å°å
ç´ å®ä¹äºä¸ç§ä»å¤ä¸ªè¡¨å°ç±»çå¤æå
³èãè¿ç§ç±»åçæ å°å¸¸å¸¸éè¦å¤äºä¸ä¸ªå段ã第ä¸ä¸ªå段ææ被å
³èå®ä½çç±»åï¼å
¶ä»çå段æææ è¯ç¬¦ã对è¿ç§ç±»åçå
³èæ¥è¯´ï¼ä¸å¯è½æå®ä¸ä¸ªå¤é®çº¦æï¼æ以è¿å½ç¶ä¸æ¯æ å°(å¤æ)å
³èçé常çæ¹å¼ãä½ åªåºè¯¥å¨é常ç¹æ®çæ
åµä¸ä½¿ç¨å®(æ¯å¦ï¼å®¡è®¡logï¼ç¨æ·ä¼è¯æ°æ®çç)ã
+ </para>
+ <para>
+ <literal>meta-type</literal> å±æ§ä½¿å¾åºç¨ç¨åºè½æå®ä¸ä¸ªå°æ°æ®åºå段çå¼æ å°å°æä¹
åç±»çèªå®ä¹ç±»åãè¿ä¸ªæä¹
åç±»å
å«æç¨<literal>id-type</literal>æå®çæ è¯ç¬¦å±æ§ã
+ ä½ å¿
é¡»æå®ä»meta-typeçå¼å°ç±»åçæ å°ã
+ </para>
+
+ <programlisting><![CDATA[<any name="being" id-type="long" meta-type="string">
+ <meta-value value="TBL_ANIMAL" class="Animal"/>
+ <meta-value value="TBL_HUMAN" class="Human"/>
+ <meta-value value="TBL_ALIEN" class="Alien"/>
+ <column name="table_name"/>
+ <column name="id"/>
+</any>]]></programlisting>
+
+ <programlistingco>
+ <areaspec>
+ <area id="any1" coords="2 50"/>
+ <area id="any2" coords="3 50"/>
+ <area id="any3" coords="4 50"/>
+ <area id="any4" coords="5 50"/>
+ <area id="any5" coords="6 50"/>
+ <area id="any6" coords="7 50"/>
+ </areaspec>
+ <programlisting><![CDATA[<any
+ name="propertyName"
+ id-type="idtypename"
+ meta-type="metatypename"
+ cascade="cascade_style"
+ access="field|property|ClassName"
+ optimistic-lock="true|false"
+>
+ <meta-value ... />
+ <meta-value ... />
+ .....
+ <column .... />
+ <column .... />
+ .....
+</any>]]></programlisting>
+ <calloutlist>
+ <callout arearefs="any1">
+ <para>
+ <literal>name</literal>: å±æ§å
+ </para>
+ </callout>
+ <callout arearefs="any2">
+ <para>
+ <literal>id-type</literal>: æ è¯ç¬¦ç±»å
+ </para>
+ </callout>
+ <callout arearefs="any3">
+ <para>
+ <literal>meta-type</literal> (å¯é -é»è®¤æ¯ <literal>string</literal>):
+ å
许辨å«æ å¿(discriminator)æ å°çä»»ä½ç±»å
+ </para>
+ </callout>
+ <callout arearefs="any4">
+ <para>
+ <literal>cascade</literal> (å¯é -é»è®¤æ¯<literal>none</literal>):
+ 级èçç±»å
+ </para>
+ </callout>
+ <callout arearefs="any5">
+ <para>
+ <literal>access</literal> (å¯é -é»è®¤æ¯ <literal>property</literal>): Hibernate ç¨æ¥è®¿é®å±æ§å¼ççç¥ã
+ </para>
+ </callout>
+ <callout arearefs="any6">
+ <para>
+ <literal>optimistic-lock</literal> (å¯é -é»è®¤æ¯ <literal>true</literal>): 表ææ´æ°æ¤ç»ä»¶æ¯å¦éè¦è·åä¹è§éãæ¢å¥è¯è¯´ï¼å½è¿ä¸ªå±æ§åèæ¶ï¼æ¯å¦å¢å çæ¬å·(Version)
+ </para>
+ </callout>
+ </calloutlist>
+ </programlistingco>
+
+ </sect2>
+
+ </sect1>
+
+ <sect1 id="mapping-types">
+ <title>Hibernate çç±»å</title>
+ <sect2 id="mapping-types-entitiesvalues" revision="1">
+ <title>å®ä½(Entities)åå¼(values)</title>
+
+ <para>
+ 为äºç解å¾å¤ä¸æä¹
åæå¡ç¸å
³çJavaè¯è¨çº§å¯¹è±¡çè¡ä¸ºï¼æ们éè¦æå®ä»¬å为两类ï¼
+ </para>
+
+ <para>
+ <emphasis>å®ä½entity</emphasis> ç¬ç«äºä»»ä½ææå®ä½å¼ç¨ç对象ãä¸é常çJava模åç¸æ¯ï¼ä¸å被å¼ç¨ç对象ä¼è¢«å½ä½åå¾æ¶éæãå®ä½å¿
须被æ¾å¼çä¿ååå é¤(é¤éä¿ååå é¤æ¯ä»ç¶å®ä½ååå®ä½å¼åç<emphasis>级è</emphasis>)ãè¿åODMG模åä¸å
³äºå¯¹è±¡éè¿å¯è§¦åä¿ææä¹
æ§æä¸äºä¸åââæ¯è¾èµ·æ¥æ´å æ¥è¿åºç¨ç¨åºå¯¹è±¡é常å¨ä¸ä¸ªå¤§ç³»ç»ä¸ç使ç¨æ¹æ³ãå®ä½æ¯æ循ç¯å¼ç¨å交åå¼ç¨ï¼å®ä»¬ä¹å¯ä»¥å ä¸çæ¬ä¿¡æ¯ã
+ </para>
+
+ <para>
+ ä¸ä¸ªå®ä½çæä¹
ç¶æå
å«æåå
¶ä»å®ä½å<emphasis>å¼</emphasis>ç±»åå®ä¾çå¼ç¨ãå¼å¯ä»¥æ¯åå§ç±»åï¼éå(ä¸æ¯éåä¸ç对象)ï¼ç»ä»¶æè
ç¹å®çä¸å¯å对象ãä¸å®ä½ä¸åï¼å¼(ç¹å«æ¯éååç»ä»¶)æ¯éè¿å¯è§¦åæ§æ¥è¿è¡æä¹
ååå é¤çãå 为å¼å¯¹è±¡(ååå§ç±»åæ°æ®)æ¯éçå
å«ä»ä»¬çå®ä½è被æä¹
ååå é¤çï¼ä»ä»¬ä¸è½è¢«ç¬ç«çå ä¸çæ¬ä¿¡æ¯ãå¼æ²¡æç¬ç«çæ è¯ï¼æ以ä»ä»¬ä¸è½è¢«ä¸¤ä¸ªå®ä½æè
éåå
±äº«ã
+ </para>
+
+ <para>
+ ç´å°ç°å¨ï¼æ们é½ä¸ç´ä½¿ç¨æ¯è¯âæä¹
ç±»â(persistent class)æ¥ä»£è¡¨å®ä½ãæ们ä»ç¶ä¼è¿ä¹åã ç¶èä¸¥æ ¼è¯´æ¥ï¼ä¸æ¯ææçç¨æ·èªå®ä¹çï¼å¸¦ææä¹
åç¶æçç±»é½æ¯å®ä½ã<emphasis>ç»ä»¶</emphasis>å°±æ¯ç¨æ·èªå®ä¹ç±»ï¼å´æ¯å¼è¯ä¹çã<literal>java.lang.String</literal>ç±»åçjavaå±æ§ä¹æ¯å¼è¯ä¹çãç»äºè¿ä¸ªå®ä¹ä»¥åï¼æ们å¯ä»¥è¯´ææJDKæä¾çç±»å(ç±»)é½æ¯å¼ç±»åçè¯ä¹ï¼èç¨äºèªå®ä¹ç±»åå¯è½è¢«æ å°ä¸ºå®ä½ç±»åæå¼ç±»åè¯ä¹ãéç¨åªç§ç±»åçè¯ä¹åå³äºå¼å人åãå¨é¢å模åä¸ï¼å¯»æ¾å®ä½ç±»çä¸ä¸ªå¥½çº¿ç´¢æ¯å
±äº«å¼ç¨æåè¿ä¸ªç±»çåä¸å®ä¾ï¼èç»åæèåé常被转å为å¼ç±»åã
+ </para>
+
+ <para>
+ æ们ä¼å¨æ¬ææ¡£ä¸éå¤ç¢°å°è¿ä¸¤ä¸ªæ¦å¿µã
+ </para>
+
+ <para>
+ ææå¨äºå°javaç±»åç³»ç»(åå¼åè
å®ä¹çå®ä½åå¼ç±»å)æ å°å° SQL/æ°æ®åºç±»åç³»ç»ãHibernateæä¾äºè¿æ¥ä¸¤ä¸ªç³»ç»ä¹é´çæ¡¥æ¢ï¼å¯¹äºå®ä½ç±»åï¼æ们使ç¨<literal><class></literal>, <literal><subclass></literal> ççã对äºå¼ç±»åï¼æä»¬ä½¿ç¨ <literal><property></literal>, <literal><component></literal> åå
¶ä»ï¼é常è·éç<literal>type</literal>å±æ§ãè¿ä¸ªå±æ§çå¼æ¯Hibernate ç<emphasis>æ å°ç±»å</emphasis>çååãHibernateæä¾äºè®¸å¤ç°æçæ å°(æ åçJDKå¼ç±»å)ãä½ ä¹å¯ä»¥ç¼åèªå·±çæ å°ç±»å并å®ç°èªå®ä¹çåæ¢çç¥ï¼éåæ们ä¼çå°è¿ç¹ã
+ </para>
+ <para>
+ ææçHibernateå
建类åï¼é¤äºcollections以å¤ï¼é½æ¯æ空(null)è¯ä¹ã
+ </para>
+ </sect2>
+
+ <sect2 id="mapping-types-basictypes" revision="3">
+ <title>åºæ¬å¼ç±»å</title>
+
+ <para>
+ å
建ç <emphasis>åºæ¬æ å°ç±»å</emphasis>å¯ä»¥å¤§è´å为
+ <variablelist>
+ <varlistentry>
+ <term><literal>integer, long, short, float, double, character, byte,
+ boolean, yes_no, true_false</literal></term>
+ <listitem>
+ <para>
+ è¿äºç±»åé½å¯¹åºJavaçåå§ç±»åæè
å
¶å°è£
ç±»ï¼æ¥ç¬¦å(ç¹å®ååç)SQL å段类åã<literal>boolean, yes_no</literal> å <literal>true_false</literal>é½æ¯Java ä¸<literal>boolean</literal> æè
<literal>java.lang.Boolean</literal>çå¦å¤è¯´æ³ã
+ </para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term><literal>string</literal></term>
+ <listitem>
+ <para>
+ ä»<literal>java.lang.String</literal> å°
+ <literal>VARCHAR</literal> (æè
Oracleç <literal>VARCHAR2</literal>)çæ å°ã
+ </para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term><literal>date, time, timestamp</literal></term>
+ <listitem>
+ <para>
+ ä»<literal>java.util.Date</literal>åå
¶åç±»å°SQLç±»å<literal>DATE</literal>, <literal>TIME</literal> å<literal>TIMESTAMP</literal> (æçä»·ç±»å)çæ å°ã
+ </para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term><literal>calendar, calendar_date</literal></term>
+ <listitem>
+ <para>
+ ä»<literal>java.util.Calendar</literal> å°SQL ç±»å<literal>TIMESTAMP</literal>å <literal>DATE</literal>(æçä»·ç±»å)çæ å°ã
+ </para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term><literal>big_decimal, big_integer</literal></term>
+ <listitem>
+ <para>
+ ä»<literal>java.math.BigDecimal</literal>å<literal>java.math.BigInteger</literal>å°<literal>NUMERIC</literal> (æè
Oracle ç<literal>NUMBER</literal>ç±»å)çæ å°ã
+ </para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term><literal>locale, timezone, currency</literal></term>
+ <listitem>
+ <para>
+ ä»<literal>java.util.Locale</literal>, <literal>java.util.TimeZone</literal> å<literal>java.util.Currency</literal> å°<literal>VARCHAR</literal> (æè
Oracle ç<literal>VARCHAR2</literal>ç±»å)çæ å°.
+ <literal>Locale</literal>å <literal>Currency</literal> çå®ä¾è¢«æ å°ä¸ºå®ä»¬çISO代ç ã<literal>TimeZone</literal>çå®ä¾è¢«å½±å°ä¸ºå®ç<literal>ID</literal>ã
+ </para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term><literal>class</literal></term>
+ <listitem>
+ <para>
+ ä»<literal>java.lang.Class</literal> å°
+ <literal>VARCHAR</literal> (æè
Oracle ç<literal>VARCHAR2</literal>ç±»å)çæ å°ã<literal>Class</literal>被æ å°ä¸ºå®çå
¨éå®åã
+ </para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term><literal>binary</literal></term>
+ <listitem>
+ <para>
+ æåèæ°ç»(byte arrays)æ å°ä¸ºå¯¹åºç SQLäºè¿å¶ç±»åã
+ </para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term><literal>text</literal></term>
+ <listitem>
+ <para>
+ æé¿Javaå符串æ å°ä¸ºSQLç<literal>CLOB</literal>æè
<literal>TEXT</literal>ç±»åã
+ </para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term><literal>serializable</literal></term>
+ <listitem>
+ <para>
+ æå¯åºååçJavaç±»åæ å°å°å¯¹åºçSQLäºè¿å¶ç±»åãä½ ä¹å¯ä»¥ä¸ºä¸ä¸ªå¹¶éé»è®¤ä¸ºåºæ¬ç±»åçå¯åºååJavaç±»æè
æ¥å£æå®Hibernateç±»å<literal>serializable</literal>ã
+ </para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term><literal>clob, blob</literal></term>
+ <listitem>
+ <para>
+ JDBC ç±» <literal>java.sql.Clob</literal> å <literal>java.sql.Blob</literal>çæ å°ãæäºç¨åºå¯è½ä¸éå使ç¨è¿ä¸ªç±»åï¼å 为blobåclob对象å¯è½å¨ä¸ä¸ªäºå¡ä¹å¤æ¯æ æ³éç¨çã(èä¸, 驱å¨ç¨åºå¯¹è¿ç§ç±»åçæ¯æå
满çè¡¥ä¸åååçç¾ã)
+ </para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>
+ <literal>imm_date, imm_time, imm_timestamp, imm_calendar, imm_calendar_date,
+ imm_serializable, imm_binary</literal>
+ </term>
+ <listitem>
+ <para>
+ ä¸è¬æ¥è¯´ï¼æ å°ç±»å被åå®ä¸ºæ¯å¯åçJavaç±»åï¼åªæ对ä¸å¯åJavaç±»åï¼Hibernateä¼éåç¹å®çä¼åæªæ½ï¼åºç¨ç¨åºä¼æè¿äºå¯¹è±¡ä½ä¸ºä¸å¯å对象å¤çãæ¯å¦ï¼ä½ ä¸åºè¯¥å¯¹ä½ä¸º<literal>imm_timestamp</literal>æ å°çDateæ§è¡<literal>Date.setTime()</literal>ãè¦æ¹åå±æ§çå¼ï¼å¹¶ä¸ä¿åè¿ä¸æ¹åï¼åºç¨ç¨åºå¿
须对è¿ä¸å±æ§éæ°è®¾ç½®ä¸ä¸ªæ°çï¼ä¸ä¸æ ·çï¼å¯¹è±¡ã
+ </para>
+ </listitem>
+ </varlistentry>
+
+ </variablelist>
+
+ </para>
+
+ <para>
+ å®ä½åå
¶éåçå¯ä¸æ è¯å¯ä»¥æ¯é¤äº<literal>binary</literal>ã <literal>blob</literal> å <literal>clob</literal>ä¹å¤çä»»ä½åºç¡ç±»åã(èåæ è¯ä¹æ¯å
许çï¼åé¢ä¼è¯´å°ã)
+ </para>
+
+ <para>
+ å¨<literal>org.hibernate.Hibernate</literal>ä¸ï¼å®ä¹äºåºç¡ç±»å对åºç<literal>Type</literal>常éãæ¯å¦ï¼<literal>Hibernate.STRING</literal>代表<literal>string</literal> ç±»åã
+ </para>
+
+ </sect2>
+
+ <sect2 id="mapping-types-custom" revision="2">
+ <title>èªå®ä¹å¼ç±»å</title>
+
+ <para>
+ å¼åè
å建å±äºä»ä»¬èªå·±çå¼ç±»åä¹æ¯å¾å®¹æçãæ¯å¦è¯´ï¼ä½ å¯è½å¸ææä¹
å<literal>java.lang.BigInteger</literal>ç±»åçå±æ§ï¼æä¹
åæ为<literal>VARCHAR</literal>å段ãHibernate没æå
ç½®è¿æ ·ä¸ç§ç±»åãèªå®ä¹ç±»åè½å¤æ å°ä¸ä¸ªå±æ§(æéåå
ç´ )å°ä¸æ¢ä¸ä¸ªæ°æ®åºè¡¨å段ãæ¯å¦è¯´ï¼ä½ å¯è½æè¿æ ·çJavaå±æ§ï¼<literal>getName()</literal>/<literal>setName()</literal>ï¼è¿æ¯<literal>java.lang.String</literal>ç±»åçï¼å¯¹åºçæä¹
åå°ä¸ä¸ªå段ï¼<literal>FIRST_NAME</literal>, <literal>INITIAL</literal>, <literal>SURNAME</literal>ã
+ </para>
+
+ <para>
+ è¦å®ç°ä¸ä¸ªèªå®ä¹ç±»åï¼å¯ä»¥å®ç°<literal>org.hibernate.UserType</literal>æ<literal>org.hibernate.CompositeUserType</literal>ä¸çä»»ä¸ä¸ªï¼å¹¶ä¸ä½¿ç¨ç±»åçJavaå
¨éå®ç±»åæ¥å®ä¹å±æ§ã请æ¥ç<literal>org.hibernate.test.DoubleStringType</literal>è¿ä¸ªä¾åï¼ççå®æ¯æä¹åçã
+ </para>
+
+ <programlisting><![CDATA[<property name="twoStrings" type="org.hibernate.test.DoubleStringType">
+ <column name="first_string"/>
+ <column name="second_string"/>
+</property>]]></programlisting>
+
+ <para>
+ 注æ使ç¨<literal><column></literal>æ ç¾æ¥æä¸ä¸ªå±æ§æ å°å°å¤ä¸ªå段çåæ³ã
+ </para>
+
+ <para>
+ <literal>CompositeUserType</literal>, <literal>EnhancedUserType</literal>,
+ <literal>UserCollectionType</literal>, å <literal>UserVersionType</literal> æ¥å£ä¸ºæ´ç¹æ®ç使ç¨æ¹å¼æä¾æ¯æã
+ </para>
+ <para>
+ ä½ çè³å¯ä»¥å¨ä¸ä¸ªæ å°æ件ä¸æä¾åæ°ç»ä¸ä¸ª<literal>UserType</literal>ã 为äºè¿æ ·åï¼ä½ ç<literal>UserType</literal>å¿
é¡»å®ç°<literal>org.hibernate.usertype.ParameterizedType</literal>æ¥å£ã为äºç»èªå®ä¹ç±»åæä¾åæ°ï¼ä½ å¯ä»¥å¨æ å°æ件ä¸ä½¿ç¨<literal><type></literal>å
ç´ ã
+ </para>
+ <programlisting><![CDATA[<property name="priority">
+ <type name="com.mycompany.usertypes.DefaultValueIntegerType">
+ <param name="default">0</param>
+ </type>
+</property>]]></programlisting>
+
+ <para>
+ ç°å¨ï¼<literal>UserType</literal> å¯ä»¥ä»ä¼ å
¥ç<literal>Properties</literal>对象ä¸å¾å°<literal>default</literal> åæ°çå¼ã
+ </para>
+ <para>
+ å¦æä½ é常é¢ç¹å°ä½¿ç¨æä¸<literal>UserType</literal>ï¼å¯ä»¥ä¸ºä»å®ä¹ä¸ä¸ªç®ç§°ãè¿å¯ä»¥éè¿ä½¿ç¨ <literal><typedef></literal>å
ç´ æ¥å®ç°ãTypedefs为ä¸èªå®ä¹ç±»åèµäºä¸ä¸ªå称ï¼å¹¶ä¸å¦ææ¤ç±»åæ¯åæ°åçï¼è¿å¯ä»¥å
å«ä¸ç³»åé»è®¤çåæ°å¼ã
+ </para>
+ <programlisting><![CDATA[<typedef class="com.mycompany.usertypes.DefaultValueIntegerType" name="default_zero">
+ <param name="default">0</param>
+</typedef>]]></programlisting>
+
+ <programlisting><![CDATA[<property name="priority" type="default_zero"/>]]></programlisting>
+
+ <para>
+ ä¹å¯ä»¥æ ¹æ®å
·ä½æ¡ä¾éè¿å±æ§æ å°ä¸çç±»ååæ°è¦çå¨typedefä¸æä¾çåæ°ã
+ </para>
+ <para>
+ 尽管 Hibernate å
建ç丰å¯çç±»åå对ç»ä»¶çæ¯ææå³çä½ å¯è½å¾å° <emphasis>éè¦</emphasis>使ç¨èªå®ä¹ç±»åãä¸è¿ï¼ä¸ºé£äºå¨ä½ çåºç¨ä¸ç»å¸¸åºç°ç(éå®ä½)类使ç¨èªå®ä¹ç±»åä¹æ¯ä¸ä¸ªå¥½æ¹æ³ãä¾å¦ï¼ä¸ä¸ª<literal>MonetaryAmount</literal>类使ç¨<literal>CompositeUserType</literal>æ¥æ å°æ¯ä¸éçéæ©ï¼è½ç¶ä»å¯ä»¥å¾å®¹æå°è¢«æ å°æç»ä»¶ãè¿æ ·åçå¨æºä¹ä¸æ¯æ½è±¡ã使ç¨èªå®ä¹ç±»åï¼ä»¥ååè¥ä½ æ¹å表示éé¢çæ¹æ³æ¶ï¼å®å¯ä»¥ä¿è¯æ å°æ件ä¸éè¦ä¿®æ¹ã
+ </para>
+ </sect2>
+
+ </sect1>
+
+ <sect1 id="mapping-entityname">
+ <title>å¤æ¬¡æ å°åä¸ä¸ªç±»</title>
+ <para>
+ 对ç¹å®çæä¹
åç±»ï¼æ å°å¤æ¬¡æ¯å
许çãè¿ç§æ
å½¢ä¸ï¼ä½ å¿
é¡»æå®<emphasis>entity name</emphasis>æ¥åºå«ä¸åæ å°å®ä½ç对象å®ä¾ãï¼é»è®¤æ
åµä¸ï¼å®ä½åååç±»åæ¯ç¸åçãï¼
+ Hibernateå¨æä½æä¹
å对象ãç¼åæ¥è¯¢æ¡ä»¶ï¼æè
æå
³èæ å°å°æå®å®ä½æ¶ï¼å
è®¸ä½ æå®è¿ä¸ªentity nameï¼å®ä½ååï¼ã
+ </para>
+
+ <programlisting><![CDATA[<class name="Contract" table="Contracts"
+ entity-name="CurrentContract">
+ ...
+ <set name="history" inverse="true"
+ order-by="effectiveEndDate desc">
+ <key column="currentContractId"/>
+ <one-to-many entity-name="HistoricalContract"/>
+ </set>
+</class>
+
+<class name="Contract" table="ContractHistory"
+ entity-name="HistoricalContract">
+ ...
+ <many-to-one name="currentContract"
+ column="currentContractId"
+ entity-name="CurrentContract"/>
+</class>]]></programlisting>
+
+ <para>
+ 注æè¿éå
³èæ¯å¦ä½ç¨<literal>entity-name</literal>æ¥ä»£æ¿<literal>class</literal>çã
+ </para>
+
+ </sect1>
+
+ <sect1 id="mapping-quotedidentifiers">
+ <title>SQLä¸å¼å·å
å´çæ è¯ç¬¦</title>
+ <para>
+ ä½ å¯éè¿å¨æ å°ææ¡£ä¸ä½¿ç¨ååå¼å·(`)æ表åæè
å段åå
å´èµ·æ¥ï¼ä»¥å¼ºå¶Hibernateå¨çæçSQLä¸ææ è¯ç¬¦ç¨å¼å·å
å´èµ·æ¥ãHibernateä¼ä½¿ç¨ç¸åºçSQL<literal>Dialect</literal>(æ¹è¨)æ¥ä½¿ç¨æ£ç¡®çå¼å·é£æ ¼(é常æ¯åå¼å·ï¼ä½æ¯å¨SQL Serverä¸æ¯æ¬å·ï¼MySQLä¸æ¯ååå¼å·)ã
+ </para>
+
+ <programlisting><![CDATA[<class name="LineItem" table="`Line Item`">
+ <id name="id" column="`Item Id`"/><generator class="assigned"/></id>
+ <property name="itemNumber" column="`Item #`"/>
+ ...
+</class>]]></programlisting>
+
+ </sect1>
+
+
+ <sect1 id="mapping-alternatives">
+ <title>å
¶ä»å
æ°æ®(Metadata)</title>
+
+ <para>
+ XML 并ä¸éç¨äºææ人, å æ¤æå
¶ä»å®ä¹Hibernate O/R æ å°å
æ°æ®(metadata)çæ¹æ³ã
+ </para>
+
+ <sect2 id="mapping-xdoclet">
+ <title>ä½¿ç¨ XDoclet æ è®°</title>
+
+ <para>
+ å¾å¤Hibernate使ç¨è
æ´å欢使ç¨XDoclet<literal>@hibernate.tags</literal>å°æ å°ä¿¡æ¯ç´æ¥åµå
¥å°æºä»£ç ä¸ãæ们ä¸ä¼å¨æ¬ææ¡£ä¸æ¶åè¿ä¸ªæ¹æ³ï¼å ä¸ºä¸¥æ ¼è¯´æ¥ï¼è¿å±äºXDocletçä¸é¨åãç¶èï¼æ们å
å«äºå¦ä¸ä½¿ç¨XDocletæ å°ç<literal>Cat</literal>ç±»çä¾åã
+ </para>
+ <programlisting><![CDATA[package eg;
+import java.util.Set;
+import java.util.Date;
+
+/**
+ * @hibernate.class
+ * table="CATS"
+ */
+public class Cat {
+ private Long id; // identifier
+ private Date birthdate;
+ private Cat mother;
+ private Set kittens
+ private Color color;
+ private char sex;
+ private float weight;
+
+ /*
+ * @hibernate.id
+ * generator-class="native"
+ * column="CAT_ID"
+ */
+ public Long getId() {
+ return id;
+ }
+ private void setId(Long id) {
+ this.id=id;
+ }
+
+ /**
+ * @hibernate.many-to-one
+ * column="PARENT_ID"
+ */
+ public Cat getMother() {
+ return mother;
+ }
+ void setMother(Cat mother) {
+ this.mother = mother;
+ }
+
+ /**
+ * @hibernate.property
+ * column="BIRTH_DATE"
+ */
+ public Date getBirthdate() {
+ return birthdate;
+ }
+ void setBirthdate(Date date) {
+ birthdate = date;
+ }
+ /**
+ * @hibernate.property
+ * column="WEIGHT"
+ */
+ public float getWeight() {
+ return weight;
+ }
+ void setWeight(float weight) {
+ this.weight = weight;
+ }
+
+ /**
+ * @hibernate.property
+ * column="COLOR"
+ * not-null="true"
+ */
+ public Color getColor() {
+ return color;
+ }
+ void setColor(Color color) {
+ this.color = color;
+ }
+ /**
+ * @hibernate.set
+ * inverse="true"
+ * order-by="BIRTH_DATE"
+ * @hibernate.collection-key
+ * column="PARENT_ID"
+ * @hibernate.collection-one-to-many
+ */
+ public Set getKittens() {
+ return kittens;
+ }
+ void setKittens(Set kittens) {
+ this.kittens = kittens;
+ }
+ // addKitten not needed by Hibernate
+ public void addKitten(Cat kitten) {
+ kittens.add(kitten);
+ }
+
+ /**
+ * @hibernate.property
+ * column="SEX"
+ * not-null="true"
+ * update="false"
+ */
+ public char getSex() {
+ return sex;
+ }
+ void setSex(char sex) {
+ this.sex=sex;
+ }
+}]]></programlisting>
+
+ <para>
+ åèHibernateç½ç«æ´å¤çXdocletåHibernateçä¾å
+ </para>
+ </sect2>
+
+ <sect2 id="mapping-annotations" revision="2">
+ <title>ä½¿ç¨ JDK 5.0 ç注解(Annotation)</title>
+
+ <para>
+ JDK 5.0 å¨è¯è¨çº§å«å¼å
¥äº XDoclet é£æ ¼çæ 注ï¼å¹¶ä¸æ¯ç±»åå®å
¨çï¼å¨ç¼è¯æè¿è¡æ£æ¥ãè¿ä¸æºå¶æ¯XDocletç注解æ´ä¸ºå¼ºå¤§ï¼ææ´å¥½çå·¥å
·åIDEæ¯æãä¾å¦ï¼ IntelliJ IDEAï¼æ¯æJDK 5.0注解çèªå¨å®æåè¯æ³é«äº® ãEJBè§èçæ°ä¿®è®¢ç(JSR-220)ä½¿ç¨ JDK 5.0ç注解ä½ä¸ºentity beansç主è¦å
æ°æ®(metadata)æºå¶ãHibernate 3 å®ç°äºJSR-220 (the persistence API)ç<literal>EntityManager</literal>ï¼æ¯æéè¿<emphasis>Hibernate Annotations</emphasis>å
å®ä¹æ å°å
æ°æ®ãè¿ä¸ªå
ä½ä¸ºåç¬çé¨åä¸è½½ï¼æ¯æEJB3 (JSR-220)åHibernate3çå
æ°æ®ã
+ </para>
+ <para>
+ è¿æ¯ä¸ä¸ªè¢«æ³¨è§£ä¸ºEJB entity bean çPOJOç±»çä¾å
+ </para>
+ <programlisting><![CDATA[@Entity(access = AccessType.FIELD)
+public class Customer implements Serializable {
+
+ @Id;
+ Long id;
+
+ String firstName;
+ String lastName;
+ Date birthday;
+
+ @Transient
+ Integer age;
+
+ @Embedded
+ private Address homeAddress;
+
+ @OneToMany(cascade=CascadeType.ALL)
+ @JoinColumn(name="CUSTOMER_ID")
+ Set<Order> orders;
+
+ // Getter/setter and business methods
+}]]></programlisting>
+
+ <para>
+ 注æï¼å¯¹ JDK 5.0 注解 (å JSR-220)æ¯æçå·¥ä½ä»ç¶å¨è¿è¡ä¸,并æªå®æãæ´å¤ç»è请åé
Hibernate Annotations 模åã
+ </para>
+ </sect2>
+ </sect1>
+ <sect1 id="mapping-generated" revision="1">
+ <title>æ°æ®åºçæå±æ§ï¼Generated Propertiesï¼</title>
+ <para>
+ Generated propertiesæçæ¯å
¶å¼ç±æ°æ®åºçæçå±æ§ãä¸è¬æ¥è¯´ï¼å¦æ对象æä»»ä½å±æ§ç±æ°æ®åºçæå¼ï¼Hibernateåºç¨ç¨åºéè¦è¿è¡<literal>å·æ°(refresh)</literal>ãä½å¦ææå±æ§æ æ为generatedï¼å°±å¯ä»¥è½¬ç±Hibernateæ¥è´è´£è¿ä¸ªå¨ä½ãå®é
ä¸ã对å®ä¹äºgenerated propertiesçå®ä½,æ¯å½Hibernateæ§è¡ä¸æ¡SQL INSERTæè
UPDATEè¯å¥ï¼ä¼ç«å»æ§è¡ä¸æ¡selectæ¥è·å¾çæçå¼ã
+ </para>
+ <para>
+ 被æ æ为generatedçå±æ§è¿å¿
é¡»æ¯ non-insertableå non-updateableçãåªæ<xref linkend="mapping-declaration-version">versions</xref>ï¼<xref linkend="mapping-declaration-timestamp">timestamps</xref>å<xref linkend="mapping-declaration-property">ç®åå±æ§ï¼simple propertiesï¼</xref>å¯ä»¥è¢«æ æ为generatedã
+ </para>
+ <para>
+ <literal>never</literal> (é»è®¤) æ ææ¤å±æ§å¼ä¸æ¯ä»æ°æ®åºä¸çæã
+ </para>
+ <para>
+ <literal>insert</literal> - æ ææ¤å±æ§å¼å¨insertçæ¶åçæï¼ä½æ¯ä¸ä¼å¨éåçupdateæ¶éæ°çæãæ¯å¦è¯´å建æ¥æå°±å½å±äºè¿ç±»ã注æè½ç¶<xref linkend="mapping-declaration-version">version</xref>å<xref linkend="mapping-declaration-timestamp">timestamp</xref>å±æ§å¯ä»¥è¢«æ 注为generatedï¼ä½æ¯ä¸éç¨è¿ä¸ªé项...
+ </para>
+ <para>
+ <literal>always</literal> - æ ææ¤å±æ§å¼å¨insertåupdateæ¶é½ä¼è¢«çæã
+ </para>
+ </sect1>
+
+ <sect1 id="mapping-database-object">
+ <title>è¾
å©æ°æ®åºå¯¹è±¡(Auxiliary Database Objects)</title>
+ <para>
+ Allows CREATE and DROP of arbitrary database objects, in conjunction with
+ Hibernate's schema evolution tools, to provide the ability to fully define
+ a user schema within the Hibernate mapping files. Although designed specifically
+ for creating and dropping things like triggers or stored procedures, really any
+ SQL command that can be run via a <literal>java.sql.Statement.execute()</literal>
+ method is valid here (ALTERs, INSERTS, etc). There are essentially two modes for
+ defining auxiliary database objects...
+ 帮å©CREATEåDROPä»»ææ°æ®åºå¯¹è±¡ï¼ä¸Hibernateçschema交äºå·¥å
·ç»åèµ·æ¥ï¼å¯ä»¥æä¾å¨Hibernateæ å°æ件ä¸å®å
¨å®ä¹ç¨æ·schemaçè½åãè½ç¶è¿æ¯ä¸ºå建åéæ¯trigger(触åå¨ï¼æstored procedure(åå¨è¿ç¨ï¼çç¹å«è®¾è®¡çï¼å®é
ä¸ä»»ä½å¯ä»¥å¨<literal>java.sql.Statement.execute()</literal>æ¹æ³ä¸æ§è¡çSQLå½ä»¤é½å¯ä»¥å¨æ¤ä½¿ç¨ï¼æ¯å¦ALTER, INSERTï¼ççï¼ãæ¬è´¨ä¸æ两ç§æ¨¡å¼æ¥å®ä¹è¾
å©æ°æ®åºå¯¹è±¡...
+ </para>
+ <para>
+ 第ä¸ç§æ¨¡å¼æ¯å¨æ å°æ件ä¸æ¾å¼å£°æCREATEåDROPå½ä»¤ï¼
+ </para>
+ <programlisting><![CDATA[<hibernate-mapping>
+ ...
+ <database-object>
+ <create>CREATE TRIGGER my_trigger ...</create>
+ <drop>DROP TRIGGER my_trigger</drop>
+ </database-object>
+</hibernate-mapping>]]></programlisting>
+ <para>
+ 第äºç§æ¨¡å¼æ¯æä¾ä¸ä¸ªç±»ï¼è¿ä¸ªç±»ç¥éå¦ä½ç»ç»CREATEåDROPå½ä»¤ãè¿ä¸ªç¹å«ç±»å¿
é¡»å®ç°<literal>org.hibernate.mapping.AuxiliaryDatabaseObject</literal>æ¥å£ã
+ </para>
+ <programlisting><![CDATA[<hibernate-mapping>
+ ...
+ <database-object>
+ <definition class="MyTriggerDefinition"/>
+ </database-object>
+</hibernate-mapping>]]></programlisting>
+ <para>
+ è¿æï¼è¿äºæ°æ®åºå¯¹è±¡å¯ä»¥ç¹å«æå®ä¸ºä»
å¨ç¹å®çæ¹è¨ä¸æ使ç¨ã
+ </para>
+ <programlisting><![CDATA[<hibernate-mapping>
+ ...
+ <database-object>
+ <definition class="MyTriggerDefinition"/>
+ <dialect-scope name="org.hibernate.dialect.Oracle9Dialect"/>
+ <dialect-scope name="org.hibernate.dialect.OracleDialect"/>
+ </database-object>
+</hibernate-mapping>]]></programlisting>
+ </sect1>
+
+</chapter>
+
Copied: core/trunk/documentation/manual/zh-CN/src/main/docbook/content/batch.xml (from rev 14080, core/trunk/documentation/manual/zh-CN/src/main/docbook/modules/batch.xml)
===================================================================
--- core/trunk/documentation/manual/zh-CN/src/main/docbook/content/batch.xml (rev 0)
+++ core/trunk/documentation/manual/zh-CN/src/main/docbook/content/batch.xml 2007-10-09 20:10:34 UTC (rev 14081)
@@ -0,0 +1,282 @@
+<chapter id="batch">
+ <title>æ¹éå¤çï¼Batch processingï¼</title>
+ <para>
+ 使ç¨Hibernateå° 100 000 æ¡è®°å½æå
¥å°æ°æ®åºçä¸ä¸ªå¾èªç¶çåæ³å¯è½æ¯è¿æ ·ç
+ </para>
+
+<programlisting><![CDATA[Session session = sessionFactory.openSession();
+Transaction tx = session.beginTransaction();
+for ( int i=0; i<100000; i++ ) {
+ Customer customer = new Customer(.....);
+ session.save(customer);
+}
+tx.commit();
+session.close();]]></programlisting>
+
+ <para>
+ è¿æ®µç¨åºå¤§æ¦è¿è¡å° 50 000 æ¡è®°å½å·¦å³ä¼å¤±è´¥å¹¶æåº <literal>å
å溢åºå¼å¸¸ï¼OutOfMemoryExceptionï¼</literal> ã
+ è¿æ¯å 为 Hibernate ææææ°æå
¥ç <literal>客æ·ï¼Customerï¼</literal>å®ä¾å¨ session级å«çç¼ååºè¿è¡äºç¼åçç¼æ
ã
+ </para>
+
+ <para>
+ æ们ä¼å¨æ¬ç« åè¯ä½ å¦ä½é¿å
æ¤ç±»é®é¢ãé¦å
ï¼å¦æä½ è¦æ§è¡æ¹éå¤ç并ä¸æ³è¦è¾¾å°ä¸ä¸ªçæ³çæ§è½ï¼
+ é£ä¹ä½¿ç¨JDBCçæ¹éï¼batchingï¼åè½æ¯è³å
³éè¦ãå°JDBCçæ¹éæåæ°éï¼batch sizeï¼åæ°è®¾ç½®å°ä¸ä¸ªåéå¼
+ ï¼æ¯å¦ï¼10-50ä¹é´ï¼ï¼
+ </para>
+
+<programlisting><![CDATA[hibernate.jdbc.batch_size 20]]></programlisting>
+
+ <para id="disablebatching" revision="1">
+ 注æ,åè¥ä½ 使ç¨äº<literal>identiy</literal>æ è¯ç¬¦çæå¨,Hibernateå¨JDBC级å«éæçå
³éæå
¥è¯å¥çæ¹éæ§è¡ã
+ </para>
+
+ <para>
+ ä½ ä¹å¯è½æ³å¨æ§è¡æ¹éå¤çæ¶å
³éäºçº§ç¼åï¼
+ </para>
+
+<programlisting><![CDATA[hibernate.cache.use_second_level_cache false]]></programlisting>
+ <para>
+ ä½æ¯ï¼è¿ä¸æ¯ç»å¯¹å¿
é¡»çï¼å 为æ们å¯ä»¥æ¾å¼è®¾ç½®<literal>CacheMode</literal>æ¥å
³éä¸äºçº§ç¼åç交äºã
+ </para>
+
+
+ <sect1 id="batch-inserts">
+ <title>æ¹éæå
¥ï¼Batch insertsï¼</title>
+
+ <para>
+ å¦æè¦å°å¾å¤å¯¹è±¡æä¹
åï¼ä½ å¿
é¡»éè¿ç»å¸¸çè°ç¨ <literal>flush()</literal> 以åç¨åè°ç¨
+ <literal>clear()</literal> æ¥æ§å¶ç¬¬ä¸çº§ç¼åç大å°ã
+ </para>
+
+<programlisting><![CDATA[Session session = sessionFactory.openSession();
+Transaction tx = session.beginTransaction();
+
+for ( int i=0; i<100000; i++ ) {
+ Customer customer = new Customer(.....);
+ session.save(customer);
+ if ( i % 20 == 0 ) { //20, same as the JDBC batch size //20,ä¸JDBCæ¹é设置ç¸å
+ //flush a batch of inserts and release memory:
+ //å°æ¬æ¹æå
¥ç对象ç«å³åå
¥æ°æ®åºå¹¶éæ¾å
å
+ session.flush();
+ session.clear();
+ }
+}
+
+tx.commit();
+session.close();]]></programlisting>
+
+ </sect1>
+
+ <sect1 id="batch-update" >
+ <title>æ¹éæ´æ°ï¼Batch updatesï¼</title>
+
+ <para>
+ æ¤æ¹æ³åæ ·éç¨äºæ£ç´¢åæ´æ°æ°æ®ãæ¤å¤ï¼å¨è¿è¡ä¼è¿åå¾å¤è¡æ°æ®çæ¥è¯¢æ¶ï¼
+ ä½ éè¦ä½¿ç¨ <literal>scroll()</literal> æ¹æ³ä»¥ä¾¿å
åå©ç¨æå¡å¨ç«¯æ¸¸æ æ带æ¥ç好å¤ã
+ </para>
+
+<programlisting><![CDATA[Session session = sessionFactory.openSession();
+Transaction tx = session.beginTransaction();
+
+ScrollableResults customers = session.getNamedQuery("GetCustomers")
+ .setCacheMode(CacheMode.IGNORE)
+ .scroll(ScrollMode.FORWARD_ONLY);
+int count=0;
+while ( customers.next() ) {
+ Customer customer = (Customer) customers.get(0);
+ customer.updateStuff(...);
+ if ( ++count % 20 == 0 ) {
+ //flush a batch of updates and release memory:
+ session.flush();
+ session.clear();
+ }
+}
+
+tx.commit();
+session.close();]]></programlisting>
+
+ </sect1>
+
+ <sect1 id="batch-statelesssession">
+ <title>StatelessSession (æ ç¶æsession)æ¥å£</title>
+ <para>
+ ä½ä¸ºéæ©ï¼Hibernateæä¾äºåºäºå½ä»¤çAPIï¼å¯ä»¥ç¨detached objectçå½¢å¼ææ°æ®ä»¥æµçæ¹æ³å å
¥å°æ°æ®åºï¼æä»æ°æ®åºè¾åºã<literal>StatelessSession</literal>没ææä¹
åä¸ä¸æï¼ä¹ä¸æä¾å¤å°é«å±ççå½å¨æè¯ä¹ãç¹å«æ¯ï¼æ ç¶æsessionä¸å®ç°ç¬¬ä¸çº§cache,ä¹ä¸å第äºçº§ç¼åï¼æè
æ¥è¯¢ç¼å交äºãå®ä¸å®ç°äºå¡ååï¼ä¹ä¸å®ç°èæ°æ®æ£æ¥ãç¨stateless sessionè¿è¡çæä½çè³ä¸çº§èå°å
³èå®ä¾ãstateless session忽ç¥éåç±»(Collections)ãéè¿stateless sessionè¿è¡çæä½ä¸è§¦åHibernateçäºä»¶æ¨¡ååæ¦æªå¨ãæ ç¶æsession对æ°æ®çæ··æ·ç°è±¡å
ç«ï¼å 为å®æ²¡æ第ä¸çº§ç¼åãæ ç¶æsessionæ¯ä½å±çæ½è±¡ï¼åä½å±JDBCç¸å½æ¥è¿ã
+ </para>
+
+<programlisting><![CDATA[StatelessSession session = sessionFactory.openStatelessSession();
+Transaction tx = session.beginTransaction();
+
+ScrollableResults customers = session.getNamedQuery("GetCustomers")
+ .scroll(ScrollMode.FORWARD_ONLY);
+while ( customers.next() ) {
+ Customer customer = (Customer) customers.get(0);
+ customer.updateStuff(...);
+ session.update(customer);
+}
+
+tx.commit();
+session.close();]]></programlisting>
+
+ <para>
+ 注æå¨ä¸é¢çä¾åä¸ï¼æ¥è¯¢è¿åç<literal>Customer</literal>å®ä¾ç«å³è¢«è±ç®¡(detach)ãå®ä»¬ä¸ä»»ä½æä¹
åä¸ä¸æé½æ²¡æå
³ç³»ã
+ </para>
+
+ <para>
+ <literal>StatelessSession</literal> æ¥å£å®ä¹ç<literal>insert(), update()</literal> å <literal>delete()</literal>æä½æ¯ç´æ¥çæ°æ®åºè¡çº§å«æä½ï¼å
¶ç»ææ¯ç«å»æ§è¡ä¸æ¡<literal>INSERT, UPDATE</literal> æ <literal>DELETE</literal> è¯å¥ãå æ¤ï¼å®ä»¬çè¯ä¹å<literal>Session</literal> æ¥å£å®ä¹ç<literal>save(), saveOrUpdate()</literal> å<literal>delete()</literal> æä½æå¾å¤§çä¸åã
+ </para>
+
+ </sect1>
+
+ <sect1 id="batch-direct" revision="3">
+ <title>DML(æ°æ®æä½è¯è¨)é£æ ¼çæä½(DML-style operations)</title>
+
+ <para>
+ hence manipulating (using the SQL <literal>Data Manipulation Language</literal>
+ (DML) statements: <literal>INSERT</literal>, <literal>UPDATE</literal>, <literal>DELETE</literal>)
+ data directly in the database will not affect in-memory state. However, Hibernate provides methods
+ for bulk SQL-style DML statement execution which are performed through the
+ Hibernate Query Language (<xref linkend="queryhql">HQL</xref>).
+
+
+ å°±åå·²ç»è®¨è®ºçé£æ ·ï¼èªå¨åéæç 对象/å
³ç³» æ å°ï¼object/relational mappingï¼å
³æ³¨äºç®¡ç对象çç¶æã
+ è¿å°±æå³ç对象çç¶æåå¨äºå
åï¼å æ¤ç´æ¥æä½ (ä½¿ç¨ SQL <literal>Data Manipulation Language</literal>(DML,æ°æ®æä½è¯è¨ï¼è¯å¥ ï¼<literal>INSERT</literal> ,<literal>UPDATE</literal> å
+ <literal>DELETE</literal>) æ°æ®åºä¸çæ°æ®å°ä¸ä¼å½±åå
åä¸ç对象ç¶æå对象æ°æ®ã
+ ä¸è¿ï¼Hibernateæä¾éè¿Hibernateæ¥è¯¢è¯è¨ï¼<xref linkend="queryhql">HQL</xref>ï¼æ¥æ§è¡å¤§æ¹
+ éSQLé£æ ¼çDMLè¯å¥çæ¹æ³ã
+ </para>
+
+ <para>
+ <literal>UPDATE</literal> å <literal>DELETE</literal>è¯å¥çè¯æ³ä¸ºï¼
+ <literal>( UPDATE | DELETE ) FROM? EntityName (WHERE where_conditions)?</literal>
+ æå ç¹è¯´æï¼
+ </para>
+
+ <itemizedlist spacing="compact">
+ <listitem>
+ <para>
+ å¨FROMåå¥ï¼from-clauseï¼ä¸ï¼FROMå
³é®åæ¯å¯éç
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ å¨FROMåå¥ï¼from-clauseï¼ä¸åªè½æä¸ä¸ªå®ä½åï¼å®å¯ä»¥æ¯å«åãå¦æå®ä½åæ¯å«åï¼é£ä¹ä»»ä½è¢«å¼ç¨çå±æ§é½å¿
é¡»å ä¸æ¤å«åçåç¼ï¼å¦æä¸æ¯å«åï¼é£ä¹ä»»ä½æåç¼çå±æ§å¼ç¨é½æ¯éæ³çã
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ ä¸è½å¨å¤§æ¹éHQLè¯å¥ä¸ä½¿ç¨<xref linkend="queryhql-joins-forms">è¿æ¥(join)</xref>ï¼æ¾å¼æè
éå¼çé½ä¸è¡ï¼ãä¸è¿å¨WHEREåå¥ä¸å¯ä»¥ä½¿ç¨åæ¥è¯¢ãå¯ä»¥å¨whereåå¥ä¸ä½¿ç¨åæ¥è¯¢ï¼åæ¥è¯¢æ¬èº«å¯ä»¥å
å«joinã
+
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ æ´ä¸ªWHEREåå¥æ¯å¯éçã
+ </para>
+ </listitem>
+ </itemizedlist>
+
+ <para>
+ 举个ä¾åï¼ä½¿ç¨<literal>Query.executeUpdate()</literal>æ¹æ³æ§è¡ä¸ä¸ªHQL
+ <literal>UPDATE</literal>è¯å¥(ï¼
+ (æ¹æ³å½åæ¯æ¥æºäºJDBC's <literal>PreparedStatement.executeUpdate()</literal>):
+ </para>
+
+ <programlisting><![CDATA[Session session = sessionFactory.openSession();
+ Transaction tx = session.beginTransaction();
+
+ String hqlUpdate = "update Customer c set c.name = :newName where c.name = :oldName";
+ // or String hqlUpdate = "update Customer set name = :newName where name = :oldName";
+ int updatedEntities = s.createQuery( hqlUpdate )
+ .setString( "newName", newName )
+ .setString( "oldName", oldName )
+ .executeUpdate();
+ tx.commit();
+ session.close();]]></programlisting>
+
+ <para>
+ HQL <literal>UPDATE</literal>è¯å¥ï¼é»è®¤ä¸ä¼å½±åæ´æ°å®ä½ç<xref linkend="mapping-declaration-version">version</xref>æè
<xref linkend="mapping-declaration-timestamp">timestamp</xref>å±æ§å¼ãè¿åEJB3è§èæ¯ä¸è´çãä½æ¯ï¼éè¿ä½¿ç¨<literal>versioned update</literal>ï¼ä½ å¯ä»¥å¼ºå¶Hibernateæ£ç¡®çéç½®<literal>version</literal>æè
<literal>timestamp</literal>å±æ§å¼ãè¿éè¿å¨<literal>UPDATE</literal>å
³é®ååé¢å¢å <literal>VERSIONED</literal>å
³é®åæ¥å®ç°çã
+ </para>
+<programlisting><![CDATA[Session session = sessionFactory.openSession();
+Transaction tx = session.beginTransaction();
+String hqlVersionedUpdate = "update versioned Customer set name = :newName where name = :oldName";
+int updatedEntities = s.createQuery( hqlUpdate )
+ .setString( "newName", newName )
+ .setString( "oldName", oldName )
+ .executeUpdate();
+tx.commit();
+session.close();]]></programlisting>
+
+ <para>
+ 注æï¼èªå®ä¹ççæ¬ç±»å(<literal>org.hibernate.usertype.UserVersionType</literal>)ä¸å
许å<literal>update versioned</literal>è¯å¥èç¨ã
+ </para>
+
+ <para>
+ æ§è¡ä¸ä¸ªHQL <literal>DELETE</literal>ï¼åæ ·ä½¿ç¨ <literal>Query.executeUpdate()</literal> æ¹æ³:
+ </para>
+
+ <programlisting><![CDATA[Session session = sessionFactory.openSession();
+ Transaction tx = session.beginTransaction();
+
+ String hqlDelete = "delete Customer c where c.name = :oldName";
+ // or String hqlDelete = "delete Customer where name = :oldName";
+ int deletedEntities = s.createQuery( hqlDelete )
+ .setString( "oldName", oldName )
+ .executeUpdate();
+ tx.commit();
+ session.close();]]></programlisting>
+
+ <para>
+ ç±<literal>Query.executeUpdate()</literal>æ¹æ³è¿åç<literal>æ´å</literal>å¼è¡¨æäºåæ¤æä½å½±åçè®°å½æ°éã
+ 注æè¿ä¸ªæ°å¼å¯è½ä¸æ°æ®åºä¸è¢«ï¼æåä¸æ¡SQLè¯å¥ï¼å½±åäºçâè¡âæ°æå
³ï¼ä¹å¯è½æ²¡æãä¸ä¸ªå¤§æ¹éHQLæä½å¯è½å¯¼è´å¤æ¡å®é
çSQLè¯å¥è¢«æ§è¡ï¼
+ 举个ä¾åï¼å¯¹joined-subclassæ å°æ¹å¼çç±»è¿è¡çæ¤ç±»æä½ãè¿ä¸ªè¿åå¼ä»£è¡¨äºå®é
被è¯å¥å½±åäºçè®°å½æ°éãå¨é£ä¸ªjoined-subclassçä¾åä¸ï¼
+ 对ä¸ä¸ªåç±»çå é¤å®é
ä¸å¯è½ä¸ä»
ä»
ä¼å é¤åç±»æ å°å°ç表èä¸ä¼å½±åâæ ¹â表ï¼è¿æå¯è½å½±åä¸ä¹æ继æ¿å
³ç³»çjoined-subclassæ å°æ¹å¼çåç±»ç表ã
+ </para>
+
+ <para>
+ <literal>INSERT</literal>è¯å¥ç伪ç æ¯:
+ <literal>INSERT INTO EntityName properties_list select_statement</literal>.
+ è¦æ³¨æçæ¯:
+ </para>
+
+ <itemizedlist spacing="compact">
+ <listitem>
+ <para>
+ åªæ¯æINSERT INTO ... SELECT ...å½¢å¼,ä¸æ¯æINSERT INTO ... VALUES ...å½¢å¼.
+ </para>
+ <para>
+ properties_liståSQL <literal>INSERT</literal>è¯å¥ä¸ç<literal>å段å®ä¹(column speficiation)</literal>类似ã对åä¸ç»§æ¿æ æ å°çå®ä½èè¨ï¼åªæç´æ¥å®ä¹å¨ç»å®ç类级å«çå±æ§æè½ç´æ¥å¨properties_listä¸ä½¿ç¨ãè¶
ç±»çå±æ§ä¸è¢«æ¯æï¼åç±»çå±æ§æ æä¹ãæ¢å¥è¯è¯´ï¼<literal>INSERT</literal>天çä¸æ¯æå¤æã
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ select_statementå¯ä»¥æ¯ä»»ä½åæ³çHQLéæ©æ¥è¯¢ï¼ä¸è¿è¦ä¿è¯è¿åç±»åå¿
é¡»åè¦æå
¥çç±»åå®å
¨å¹é
ãç®åï¼è¿ä¸æ£æ¥æ¯å¨æ¥è¯¢ç¼è¯çæ¶åè¿è¡çï¼èä¸æ¯æå®äº¤ç»æ°æ®åºã注æï¼å¨Hibernate<literal>Type</literal>é´å¦æåªæ¯<emphasis>çä»·ï¼equivalentï¼</emphasis>èé<emphasis>ç¸ç(equal)</emphasis>ï¼ä¼å¯¼è´é®é¢ãå®ä¹ä¸º<literal>org.hibernate.type.DateType</literal>å<literal>org.hibernate.type.TimestampType</literal>ç两个å±æ§å¯è½ä¼äº§çç±»åä¸å¹é
é误ï¼è½ç¶æ°æ®åºçº§å¯è½ä¸å åºåæè
å¯ä»¥å¤çè¿ç§è½¬æ¢ã
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ 对idå±æ§æ¥è¯´,insertè¯å¥ç»ä½ 两个éæ©ãä½ å¯ä»¥æç¡®å°å¨properties_list表ä¸æå®idå±æ§ï¼è¿æ ·å®çå¼æ¯ä»å¯¹åºçselect表达å¼ä¸è·å¾ï¼ï¼æè
å¨properties_listä¸çç¥å®ï¼æ¤æ¶ä½¿ç¨çææï¼ãåä¸ç§éæ©åªæå½ä½¿ç¨å¨æ°æ®åºä¸çæå¼çid产çå¨æ¶æè½ä½¿ç¨ï¼å¦ææ¯âå
åâä¸è®¡ç®çç±»åçæå¨ï¼å¨è§£ææ¶ä¼æåºä¸ä¸ªå¼å¸¸ã注æï¼ä¸ºäºè¯´æè¿ä¸é®é¢ï¼æ°æ®åºäº§çå¼ççæå¨æ¯<literal>org.hibernate.id.SequenceGenerator</literal>ï¼åå®çåç±»ï¼ï¼ä»¥åä»»ä½<literal>org.hibernate.id.PostInsertIdentifierGenerator</literal>æ¥å£çå®ç°ãè¿å¿æå¼å¾æ³¨æçæå¤æ¯<literal>org.hibernate.id.TableHiLoGenerator</literal>ï¼å®ä¸è½å¨æ¤ä½¿ç¨ï¼å 为å®æ²¡æå¾å°å
¶å¼çéå¾ã
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ 对æ å°ä¸º<literal>version</literal> æ <literal>timestamp</literal>çå±æ§æ¥è¯´ï¼insertè¯å¥ä¹ç»ä½ 两个éæ©ï¼ä½ å¯ä»¥å¨properties_list表ä¸æå®ï¼æ¤æ¶å
¶å¼ä»å¯¹åºçselect表达å¼ä¸è·å¾ï¼ï¼æè
å¨properties_listä¸çç¥å®ï¼æ¤æ¶ï¼ä½¿ç¨å¨<literal>org.hibernate.type.VersionType</literal> ä¸å®ä¹ç<literal>seed value(ç§åå¼)</literal>ï¼ã
+ </para>
+ </listitem>
+ </itemizedlist>
+
+ <para>
+ æ§è¡HQL <literal>INSERT</literal>è¯å¥çä¾åå¦ä¸ï¼
+ </para>
+
+<programlisting><![CDATA[Session session = sessionFactory.openSession();
+Transaction tx = session.beginTransaction();
+
+String hqlInsert = "insert into DelinquentAccount (id, name) select c.id, c.name from Customer c where ...";
+int createdEntities = s.createQuery( hqlInsert )
+ .executeUpdate();
+tx.commit();
+session.close();]]></programlisting>
+
+ </sect1>
+
+</chapter>
\ No newline at end of file
Copied: core/trunk/documentation/manual/zh-CN/src/main/docbook/content/best_practices.xml (from rev 14080, core/trunk/documentation/manual/zh-CN/src/main/docbook/modules/best_practices.xml)
===================================================================
--- core/trunk/documentation/manual/zh-CN/src/main/docbook/content/best_practices.xml (rev 0)
+++ core/trunk/documentation/manual/zh-CN/src/main/docbook/content/best_practices.xml 2007-10-09 20:10:34 UTC (rev 14081)
@@ -0,0 +1,175 @@
+<chapter id="best-practices" revision="2">
+ <title>æä½³å®è·µ(Best Practices)</title>
+
+ <variablelist spacing="compact">
+ <varlistentry>
+ <term>设计ç»é¢ç²åº¦çæä¹
类并ä¸ä½¿ç¨<literal><component></literal>æ¥å®ç°æ å°ã</term>
+ <listitem>
+ <para>
+ 使ç¨ä¸ä¸ª<literal>Address</literal>æä¹
ç±»æ¥å°è£
<literal>street</literal>,
+ <literal>suburb</literal>, <literal>state</literal>, <literal>postcode</literal>.
+ è¿å°æå©äºä»£ç éç¨åç®å代ç éæ(refactoring)çå·¥ä½ã
+ </para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>对æä¹
类声ææ è¯ç¬¦å±æ§( identifier properties)ã</term>
+ <listitem>
+ <para>
+ Hibernateä¸æ è¯ç¬¦å±æ§æ¯å¯éçï¼ä¸è¿æå¾å¤åå æ¥è¯´æä½ åºè¯¥ä½¿ç¨æ è¯ç¬¦å±æ§ãæ们建议æ è¯ç¬¦åºè¯¥æ¯â人é âç(èªå¨çæï¼ä¸æ¶åä¸å¡å«ä¹)ã
+ </para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>使ç¨èªç¶é®(natural keys)æ è¯</term>
+ <listitem>
+ <para>
+ 对ææçå®ä½é½æ è¯åºèªç¶é®ï¼ç¨<literal><natural-id></literal>è¿è¡æ å°ãå®ç°<literal>equals()</literal>å<literal>hashCode()</literal>ï¼å¨å
¶ä¸ç¨ç»æèªç¶é®çå±æ§è¿è¡æ¯è¾ã
+ </para>
+ </listitem>
+ Y00008051221000980 2.7ï¼89ï¼100ä¸
+ </varlistentry>
+
+ <varlistentry>
+ <term>为æ¯ä¸ªæä¹
ç±»åä¸ä¸ªæ å°æ件</term>
+ <listitem>
+ <para>
+ ä¸è¦æææçæä¹
ç±»æ å°é½åå°ä¸ä¸ªå¤§æ件ä¸ãæ <literal>com.eg.Foo</literal> æ å°å°<literal>com/eg/Foo.hbm.xml</literal>ä¸ï¼ å¨å¢éå¼åç¯å¢ä¸ï¼è¿ä¸ç¹æ¾å¾ç¹å«ææä¹ã
+ </para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>ææ å°æ件ä½ä¸ºèµæºå è½½</term>
+ <listitem>
+ <para>
+ ææ å°æ件åä»ä»¬çæ å°ç±»æ¾å¨ä¸èµ·è¿è¡é¨ç½²ã
+ </para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>èèææ¥è¯¢å符串æ¾å¨ç¨åºå¤é¢</term>
+ <listitem>
+ <para>
+ å¦æä½ çæ¥è¯¢ä¸è°ç¨äºéANSIæ åçSQLå½æ°ï¼é£ä¹è¿æ¡å®è·µç»éªå¯¹ä½ éç¨ãææ¥è¯¢å符串æ¾å¨æ å°æ件ä¸å¯ä»¥è®©ç¨åºå
·ææ´å¥½çå¯ç§»æ¤æ§ã
+ </para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>使ç¨ç»å®åé</term>
+ <listitem>
+ <para>
+ å°±åå¨JDBCç¼ç¨ä¸ä¸æ ·ï¼åºè¯¥æ»æ¯ç¨å ä½ç¬¦"?"æ¥æ¿æ¢é常éå¼ï¼ä¸è¦å¨æ¥è¯¢ä¸ç¨å符串å¼æ¥æé é常éå¼ï¼æ´å¥½çåæ³æ¯å¨æ¥è¯¢ä¸ä½¿ç¨å½ååæ°ã
+ </para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>ä¸è¦èªå·±æ¥ç®¡çJDBC connections</term>
+ <listitem>
+ <para>
+ Hibernateå
许åºç¨ç¨åºèªå·±æ¥ç®¡çJDBC connectionsï¼ä½æ¯åºè¯¥ä½ä¸ºæå没æåæ³çåæ³ãå¦æä½ ä¸è½ä½¿ç¨Hibernateå
建çconnections providersï¼é£ä¹èèå®ç°èªå·±æ¥å®ç°<literal>org.hibernate.connection.ConnectionProvider</literal>
+ </para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>èè使ç¨ç¨æ·èªå®ä¹ç±»å(custom type)</term>
+ <listitem>
+ <para>
+ åè®¾ä½ æä¸ä¸ªJavaç±»åï¼æ¥èªæäºç±»åºï¼éè¦è¢«æä¹
åï¼ä½æ¯è¯¥ç±»æ²¡ææä¾æ å°æä½éè¦çååæ¹æ³ãé£ä¹ä½ åºè¯¥èèå®ç°<literal>org.hibernate.UserType</literal>æ¥å£ãè¿ç§åæ³ä½¿ç¨åºä»£ç åèµ·æ¥æ´å èªå¦ï¼ä¸åéè¦èèç±»ä¸Hibernate typeä¹é´çç¸äºè½¬æ¢ã
+ </para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>å¨æ§è½ç¶é¢çå°æ¹ä½¿ç¨ç¡¬ç¼ç çJDBC</term>
+ <listitem>
+ <para>
+ In performance-critical areas of the system, some kinds of operations might benefit from
+ direct JDBC. But please, wait until you <emphasis>know</emphasis> something is a bottleneck.
+ And don't assume that direct JDBC is necessarily faster. If you need to use direct JDBC, it might
+ be worth opening a Hibernate <literal>Session</literal> and using that JDBC connection. That
+ way you can still use the same transaction strategy and underlying connection provider.
+
+ å¨ç³»ç»ä¸å¯¹æ§è½è¦æ±å¾ä¸¥æ ¼çä¸äºé¨åï¼æäºæä½ä¹è®¸ç´æ¥ä½¿ç¨JDBCä¼æ´å¥½ãä½æ¯è¯·å
<emphasis>确认</emphasis>è¿çç¡®æ¯ä¸ä¸ªç¶é¢ï¼å¹¶ä¸ä¸è¦æ³å½ç¶è®¤ä¸ºJDBCä¸å®ä¼æ´å¿«ãå¦æç¡®å®éè¦ç´æ¥ä½¿ç¨JDBCï¼é£ä¹æ好æå¼ä¸ä¸ª
+Hibernate <literal>Session</literal> ç¶åä» <literal>Session</literal>è·å¾connectionï¼æç
§è¿ç§åæ³ä½ ä»ç¶å¯ä»¥ä½¿ç¨åæ ·çtransactionçç¥ååºå±çconnection providerã
+ </para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>ç解<literal>Session</literal>æ¸
æ´ï¼ flushingï¼</term>
+ <listitem>
+ <para>
+ Sessionä¼ä¸æ¶çåæ°æ®åºåæ¥æä¹
åç¶æï¼å¦æè¿ç§æä½è¿è¡çè¿äºé¢ç¹ï¼æ§è½ä¼åå°ä¸å®çå½±åãææ¶åä½ å¯ä»¥éè¿ç¦æ¢èªå¨flushingï¼å°½éæå°åéå¿
è¦çflushingæä½ï¼æè
æ´è¿ä¸æ¥ï¼å¨ä¸ä¸ªç¹å®çtransactionä¸æ¹åæ¥è¯¢åå
¶å®æä½ç顺åºã
+ </para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>å¨ä¸å±ç»æä¸ï¼èè使ç¨æ管对象ï¼detached objectï¼</term>
+ <listitem>
+ <para>
+ å½ä½¿ç¨ä¸ä¸ªservlet / session bean ç±»åçæ¶æçæ¶å, ä½ å¯ä»¥æå·²å è½½çæä¹
对象å¨session beanå±åservlet / JSP å±ä¹é´æ¥åä¼ éã使ç¨æ°çsessionæ¥ä¸ºæ¯ä¸ªè¯·æ±æå¡ï¼ä½¿ç¨ <literal>Session.merge()</literal> æè
<literal>Session.saveOrUpdate()</literal>æ¥ä¸æ°æ®åºåæ¥ã
+ </para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>å¨ä¸¤å±ç»æä¸ï¼èè使ç¨é¿æä¹
ä¸ä¸æ(long persistence contexts).</term>
+ <listitem>
+ <para>
+ 为äºå¾å°æä½³çå¯ä¼¸ç¼©æ§ï¼æ°æ®åºäºå¡(Database Transaction)åºè¯¥å°½å¯è½ççãä½æ¯ï¼ç¨åºå¸¸å¸¸éè¦å®ç°é¿æ¶é´è¿è¡ç<emphasis>âåºç¨ç¨åºäºå¡(Application Transaction)â</emphasis>ï¼å
å«ä¸ä¸ªä»ç¨æ·çè§ç¹æ¥ççååæä½ãè¿ä¸ªåºç¨ç¨åºäºå¡å¯è½è·¨è¶å¤æ¬¡ä»ç¨æ·è¯·æ±å°å¾å°åé¦ç循ç¯ãç¨è±ç®¡å¯¹è±¡(ä¸sessionè±ç¦»ç对象)æ¥å®ç°åºç¨ç¨åºäºå¡æ¯å¸¸è§çãæè
ï¼å°¤å
¶å¨ä¸¤å±ç»æä¸ï¼æHibernate Sessionä»JDBCè¿æ¥ä¸è±ç¦»å¼ï¼ä¸æ¬¡éè¦ç¨çæ¶ååè¿æ¥ä¸ãç»ä¸è¦æä¸ä¸ªSessionç¨å¨å¤ä¸ªåºç¨ç¨åºäºå¡(Application Transaction)ä¸ï¼å¦åä½ çæ°æ®å¯è½ä¼è¿æ失æã
+ </para>
+
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>ä¸è¦æå¼å¸¸çæå¯æ¢å¤ç</term>
+ <listitem>
+ <para>
+ è¿ä¸ç¹çè³æ¯âæä½³å®è·µâè¿è¦éè¦ï¼è¿æ¯âå¿
å¤å¸¸è¯âãå½å¼å¸¸åççæ¶åï¼å¿
é¡»è¦åæ» <literal>Transaction</literal> ï¼å
³é<literal>Session</literal>ãå¦æä½ ä¸è¿æ ·åçè¯ï¼Hibernateæ æ³ä¿è¯å
åç¶æ精确çååºæä¹
ç¶æãå°¤å
¶ä¸è¦ä½¿ç¨<literal>Session.load()</literal>æ¥å¤æä¸ä¸ªç»å®æ è¯ç¬¦ç对象å®ä¾å¨æ°æ®åºä¸æ¯å¦åå¨ï¼åºè¯¥ä½¿ç¨<literal>Session.get()</literal>æè
è¿è¡ä¸æ¬¡æ¥è¯¢.
+ </para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>对äºå
³èä¼å
èèlazy fetching </term>
+ <listitem>
+ <para>
+ è°¨æ
ç使ç¨ä¸»å¨æå(eager fetching)ã对äºå
³èæ¥è¯´ï¼è¥å
¶ç®æ æ¯æ æ³å¨ç¬¬äºçº§ç¼åä¸å®å
¨ç¼åææå®ä¾çç±»ï¼åºè¯¥ä½¿ç¨ä»£ç(proxies)ä¸/æå
·æ延è¿å è½½å±æ§çéå(lazy collections)ãè¥ç®æ æ¯å¯ä»¥è¢«ç¼åçï¼å°¤å
¶æ¯ç¼åçå½ä¸çé常é«çæ
åµä¸ï¼åºè¯¥ä½¿ç¨<literal>lazy="false"</literal>ï¼æç¡®çç¦æ¢æeager fetchingãå¦æé£äºç¹æ®çç¡®å®éå使ç¨join fetch çåºåï¼è¯·å¨æ¥è¯¢ä¸ä½¿ç¨<literal>left join fetch</literal>ã
+ </para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>
+ 使ç¨<emphasis>open session in view</emphasis>模å¼ï¼æè
æ§è¡ä¸¥æ ¼ç<emphasis>è£
é
æ(assembly phase)</emphasis>çç¥æ¥é¿å
å次æåæ°æ®å¸¦æ¥çé®é¢
+ </term>
+ <listitem>
+ <para>
+
+ Hibernate让å¼åè
们æè±äºç¹çç<emphasis>Data Transfer Objects</emphasis> (DTO)ãå¨ä¼ ç»çEJBç»æä¸ï¼DTOæåéä½ç¨ï¼é¦å
ï¼ä»ä»¬è§£å³äºentity beanæ æ³åºååçé®é¢ï¼å
¶æ¬¡ï¼ä»ä»¬éå«å°å®ä¹äºä¸ä¸ªè£
é
æï¼å¨æ¤æé´ï¼ææå¨viewå±éè¦ç¨å°çæ°æ®ï¼é½è¢«æåãéä¸å°äºDTOä¸ï¼ç¶åæ§å¶æ被è£
å°è¡¨ç¤ºå±ãHibernateç»ç»äºç¬¬ä¸ä¸ªä½ç¨ãç¶èï¼é¤éä½ å好äºå¨æ´ä¸ªæ¸²æè¿ç¨ä¸é½ç»´æ¤ä¸ä¸ªæå¼çæä¹
åä¸ä¸æ(session)çåå¤ï¼ä½ ä»ç¶éè¦ä¸ä¸ªè£
é
æï¼æ³è±¡ä¸ä¸ï¼ä½ çä¸å¡æ¹æ³ä¸ä½ ç表示å±æä¸¥æ ¼çå¥çº¦ï¼æ°æ®æ»æ¯è¢«æ¾ç½®å°æ管对象ä¸ï¼ãè¿å¹¶éæ¯Hibernateçéå¶ï¼è¿æ¯å®ç°å®å
¨çäºå¡åæ°æ®è®¿é®çåºæ¬éæ±ã
+ </para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>èèæHibernate代ç ä»ä¸å¡é»è¾ä»£ç ä¸æ½è±¡åºæ¥</term>
+ <listitem>
+ <para>
+ æHibernateçæ°æ®åå代ç éèå°æ¥å£(interface)çåé¢ï¼ç»å使ç¨<emphasis>DAO</emphasis>å<emphasis>Thread Local Session</emphasis>模å¼ãéè¿Hibernateç<literal>UserType</literal>ï¼ä½ çè³å¯ä»¥ç¨ç¡¬ç¼ç çJDBCæ¥æä¹
åé£äºæ¬è¯¥è¢«Hibernateæä¹
åçç±»ã (该建议æ´éç¨äºè§æ¨¡è¶³å¤å¤§åºç¨è½¯ä»¶ä¸ï¼å¯¹äºé£äºåªæ5å¼ è¡¨çåºç¨ç¨åºå¹¶ä¸éåã)
+ </para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>ä¸è¦ç¨æªå¼çè¿æ¥æ å°</term>
+ <listitem>
+ <para>
+ å¤å¯¹å¤è¿æ¥ç¨å¾å¥½çä¾åå®é
ä¸ç¸å½å°è§ã大å¤æ°æ¶åä½ å¨âè¿æ¥è¡¨âä¸éè¦ä¿åé¢å¤çä¿¡æ¯ãè¿ç§æ
åµä¸ï¼ç¨ä¸¤ä¸ªæåä¸ä»ç±»çä¸å¯¹å¤çè¿æ¥æ¯è¾å¥½ãå®é
ä¸ï¼æ们认为ç»å¤§å¤æ°çè¿æ¥æ¯ä¸å¯¹å¤åå¤å¯¹ä¸çï¼ä½ åºè¯¥è°¨æ
使ç¨å
¶å®è¿æ¥é£æ ¼ï¼ç¨ä¹åé®èªå·±ä¸å¥ï¼æ¯å¦ççå¿
é¡»è¿ä¹åã
+ </para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>åç±ååå
³è</term>
+ <listitem>
+ <para>
+ ååå
³èæ´å é¾äºæ¥è¯¢ãå¨å¤§ååºç¨ä¸ï¼å ä¹ææçå
³èå¿
é¡»å¨æ¥è¯¢ä¸å¯ä»¥åå导èªã
+ </para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+
+</chapter>
+
Copied: core/trunk/documentation/manual/zh-CN/src/main/docbook/content/collection_mapping.xml (from rev 14080, core/trunk/documentation/manual/zh-CN/src/main/docbook/modules/collection_mapping.xml)
===================================================================
--- core/trunk/documentation/manual/zh-CN/src/main/docbook/content/collection_mapping.xml (rev 0)
+++ core/trunk/documentation/manual/zh-CN/src/main/docbook/content/collection_mapping.xml 2007-10-09 20:10:34 UTC (rev 14081)
@@ -0,0 +1,1081 @@
+ <chapter id="collections">
+ <title>éåç±»(Collections)æ å°</title>
+
+
+ <sect1 id="collections-persistent" revision="3">
+ <title>æä¹
åéåç±»(Persistent collections)</title>
+
+ <para id="collections-persistent-translate-comment">
+ (è¯è
注ï¼å¨é
读æ¬ç« çæ¶åï¼ä»¥åæ´ä¸ªæåçé
读è¿ç¨ä¸ï¼æ们é½ä¼é¢ä¸´ä¸ä¸ªåè¯æ¹é¢çé®é¢ï¼é£å°±æ¯âéåâã"Collections"å"Set"å¨ä¸æé对åºé½è¢«ç¿»è¯ä¸ºâéåâï¼ä½æ¯ä»ä»¬çå«ä¹å¾ä¸ä¸æ ·ãCollectionsæ¯ä¸ä¸ªè¶
éï¼Setæ¯å
¶ä¸çä¸ç§ã大é¨åæ
åµä¸ï¼æ¬è¯ç¨¿ä¸æ³æçæªå è±æ注æçâéåâï¼é½åºå½ç解为âCollectionsâãå¨æäºäºè
åæ¶åºç°ï¼å¯è½é ææ··æ·çå°æ¹ï¼æ们ç¨âéåç±»âæ¥ç¹æâCollecionsâ,âéå(Set)âæ¥æ"Set"ï¼ä¸è¬é½ä¼å¨åé¢çæ¬å·ä¸ç»åºè±æãå¸æ大家å¨é
读æ¶èç³»ä¸ä¸æç解ï¼ä¸è¦é æ误解ã
+ ä¸æ¤åæ¶ï¼âå
ç´ âä¸è¯å¯¹åºçè±æâelementâï¼ä¹æ两个ä¸åçå«ä¹ãå
¶ä¸ä¸ºéåçå
ç´ ï¼æ¯å
åä¸çä¸ä¸ªåéï¼å¦ä¸å«ä¹åæ¯XMLææ¡£ä¸çä¸ä¸ªæ ç¾æ代表çå
ç´ ãä¹è¯·æ³¨æåºå«ã
+ æ¬ç« ä¸,ç¹å«æ¯ååé¨åæ¯éè¦åå¤é
读æè½ç解æ¸
æ¥çãå¦æéå°ä»»ä½çé®,请记ä½,è±æçæ¬çreferenceæ¯æä¸æ åçåèèµæã)
+ </para>
+
+ <para>
+ Hibernateè¦æ±æä¹
åéåå¼å段å¿
须声æ为æ¥å£ï¼æ¯å¦ï¼
+ </para>
+
+ <programlisting><![CDATA[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; }
+}]]></programlisting>
+
+ <para>
+ å®é
çæ¥å£å¯è½æ¯<literal>java.util.Set</literal>,
+ <literal>java.util.Collection</literal>, <literal>java.util.List</literal>,
+ <literal>java.util.Map</literal>, <literal>java.util.SortedSet</literal>,
+ <literal>java.util.SortedMap</literal> æè
...ä»»ä½ä½ å欢çç±»åï¼("ä»»ä½ä½ å欢çç±»å" ä»£è¡¨ä½ éè¦ç¼å <literal>org.hibernate.usertype.UserCollectionType</literal>çå®ç°.)
+ </para>
+
+ <para>
+ 注ææ们æ¯å¦ä½ç¨ä¸ä¸ª<literal>HashSet</literal>å®ä¾æ¥åå§åå®ä¾åéç.è¿æ¯ç¨äºåå§åæ°å建(å°æªæä¹
å)çç±»å®ä¾ä¸éåå¼å±æ§çæä½³æ¹æ³ãå½ä½ æä¹
åè¿ä¸ªå®ä¾æ¶ââæ¯å¦éè¿è°ç¨<literal>persist()</literal>ââHibernate ä¼èªå¨æ<literal>HashSet</literal>æ¿æ¢ä¸ºHibernateèªå·±ç<literal>Set</literal>å®ç°ãè§å¯ä¸é¢çé误ï¼
+ </para>
+
+
+ <programlisting><![CDATA[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!]]></programlisting>
+
+ <para>
+ æ ¹æ®ä¸åçæ¥å£ç±»åï¼è¢«Hibernate注å°çæä¹
åéåç±»ç表ç°ç±»ä¼¼<literal>HashMap</literal>, <literal>HashSet</literal>,
+ <literal>TreeMap</literal>, <literal>TreeSet</literal> or
+ <literal>ArrayList</literal>ã
+ </para>
+
+ <para>
+ éåç±»å®ä¾å
·æå¼ç±»åçé常è¡ä¸ºãå½è¢«æä¹
å对象å¼ç¨åï¼ä»ä»¬ä¼èªå¨è¢«æä¹
åï¼å½ä¸å被å¼ç¨åï¼èªå¨è¢«å é¤ãåè¥å®ä¾è¢«ä»ä¸ä¸ªæä¹
åå¯¹è±¡ä¼ éå°å¦ä¸ä¸ªï¼å®çå
ç´ å¯è½ä»ä¸ä¸ªè¡¨è½¬ç§»å°å¦ä¸ä¸ªè¡¨ã两个å®ä½ä¸è½å
±äº«åä¸ä¸ªéåç±»å®ä¾çå¼ç¨ãå 为åºå±å
³ç³»æ°æ®åºæ¨¡åçåå ï¼éåå¼å±æ§æ æ³æ¯æ空å¼è¯ä¹ï¼Hibernate对空çéåå¼ç¨å空éåä¸å åºå«ã
+ </para>
+
+ <para>
+ ä½ ä¸éè¦è¿å¤ç为æ¤æ
å¿ãå°±å¦åä½ å¹³æ¶ä½¿ç¨æ®éçJavaéåç±»ä¸æ ·æ¥ä½¿ç¨æä¹
åéåç±»ãåªæ¯è¦ç¡®è®¤ä½ ç解äºååå
³èçè¯ä¹ï¼åæ讨论ï¼ã
+ </para>
+
+ </sect1>
+
+ <sect1 id="collections-mapping" revision="4">
+ <title>éåæ å°ï¼ Collection mappings ï¼</title>
+
+ <para>
+ ç¨äºæ å°éåç±»çHibernateæ å°å
ç´ åå³äºæ¥å£çç±»åãæ¯å¦ï¼ <literal><set></literal> å
ç´ ç¨æ¥æ å°<literal>Set</literal>ç±»åçå±æ§ã
+ </para>
+
+ <programlisting><![CDATA[<class name="Product">
+ <id name="serialNumber" column="productSerialNumber"/>
+ <set name="parts">
+ <key column="productSerialNumber" not-null="true"/>
+ <one-to-many class="Part"/>
+ </set>
+</class>]]></programlisting>
+
+ <para>
+ é¤äº<literal><set></literal>,è¿æ<literal><list></literal>, <literal><map></literal>, <literal><bag></literal>, <literal><array></literal> å
+ <literal><primitive-array></literal> æ å°å
ç´ ã<literal><map></literal>å
·æ代表æ§ï¼
+ </para>
+
+
+ <programlistingco>
+ <areaspec>
+ <area id="mappingcollection1" coords="2 65"/>
+ <area id="mappingcollection2" coords="3 65"/>
+ <area id="mappingcollection3" coords="4 65"/>
+ <area id="mappingcollection4" coords="5 65"/>
+ <area id="mappingcollection5" coords="6 65"/>
+ <area id="mappingcollection6" coords="7 65"/>
+ <area id="mappingcollection7" coords="8 65"/>
+ <area id="mappingcollection8" coords="9 65"/>
+ <area id="mappingcollection9" coords="10 65"/>
+ <area id="mappingcollection10" coords="11 65"/>
+ <area id="mappingcollection11" coords="12 65"/>
+ <area id="mappingcollection12" coords="13 65"/>
+ <area id="mappingcollection13" coords="14 65"/>
+ <area id="mappingcollection14" coords="15 65"/>
+
+ </areaspec>
+ <programlisting><![CDATA[<map
+ name="propertyName"
+ table="table_name"
+ schema="schema_name"
+ lazy="true|extra|false"
+ inverse="true|false"
+ cascade="all|none|save-update|delete|all-delete-orphan|delete-orphan"
+ sort="unsorted|natural|comparatorClass"
+ order-by="column_name asc|desc"
+ where="arbitrary sql where condition"
+ fetch="join|select|subselect"
+ batch-size="N"
+ access="field|property|ClassName"
+ optimistic-lock="true|false"
+ mutable="true|false"
+ node="element-name|."
+ embed-xml="true|false"
+>
+
+ <key .... />
+ <map-key .... />
+ <element .... />
+</map>]]></programlisting>
+ <calloutlist>
+ <callout arearefs="mappingcollection1">
+ <para>
+ <literal>name</literal> éåå±æ§çå称
+ </para>
+ </callout>
+ <callout arearefs="mappingcollection2">
+ <para>
+ <literal>table</literal> ï¼å¯éââé»è®¤ä¸ºå±æ§çå称ï¼è¿ä¸ªéå表çå称(ä¸è½å¨ä¸å¯¹å¤çå
³èå
³ç³»ä¸ä½¿ç¨)
+ </para>
+ </callout>
+ <callout arearefs="mappingcollection3">
+ <para>
+ <literal>schema</literal> (å¯é) 表çschemaçå称, ä»å°è¦çå¨æ ¹å
ç´ ä¸å®ä¹çschema
+ </para>
+ </callout>
+ <callout arearefs="mappingcollection4">
+ <para>
+ <literal>lazy</literal> (å¯é--é»è®¤ä¸ºtrue) å¯ä»¥ç¨æ¥å
³é延è¿å è½½(false)ï¼æå®ä¸ç´ä½¿ç¨é¢å
æå,æè
æå¼"extra-lazy" æåï¼æ¤æ¶å¤§å¤æ°æä½ä¸ä¼åå§åéåç±»(éç¨äºé常大çéå)
+ </para>
+ </callout>
+ <callout arearefs="mappingcollection5">
+ <para>
+ <literal>inverse</literal> (å¯éââé»è®¤ä¸º<literal>false</literal>)
+ æ è®°è¿ä¸ªéåä½ä¸ºååå
³èå
³ç³»ä¸çæ¹åä¸ç«¯ã
+
+ </para>
+ </callout>
+ <callout arearefs="mappingcollection6">
+ <para>
+ <literal>cascade</literal> (å¯éââé»è®¤ä¸º<literal>none</literal>)
+ 让æä½çº§èå°åå®ä½
+ </para>
+ </callout>
+ <callout arearefs="mappingcollection7">
+ <para>
+ <literal>sort</literal>(å¯é)æå®éåçæåºé¡ºåº, å
¶å¯ä»¥ä¸ºèªç¶ç(<literal>natural</literal>)æè
ç»å®ä¸ä¸ªç¨æ¥æ¯è¾çç±»ã
+
+ </para>
+ </callout>
+ <callout arearefs="mappingcollection8">
+ <para>
+ <literal>order-by</literal> (å¯é, ä»
ç¨äºjdk1.4) æå®è¡¨çå段(ä¸ä¸ªæå 个)åå ä¸ascæè
desc(å¯é), å®ä¹Map,SetåBagçè¿ä»£é¡ºåº
+ </para>
+ </callout>
+ <callout arearefs="mappingcollection9">
+ <para>
+ <literal>where</literal> (å¯é) æå®ä»»æçSQL whereæ¡ä»¶, 该æ¡ä»¶å°å¨éæ°è½½å
¥æè
å é¤è¿ä¸ªéåæ¶ä½¿ç¨(å½éåä¸çæ°æ®ä»
ä»
æ¯ææå¯ç¨æ°æ®çä¸ä¸ªåéæ¶è¿ä¸ªæ¡ä»¶é常æç¨)
+ </para>
+ </callout>
+ <callout arearefs="mappingcollection10">
+ <para>
+ <literal>fetch</literal> (å¯é, é»è®¤ä¸º<literal>select</literal>) ç¨äºå¨å¤è¿æ¥æåãéè¿åç»selectæååéè¿åç»subselectæåä¹é´éæ©ã
+ </para>
+ </callout>
+ <callout arearefs="mappingcollection11">
+ <para>
+ <literal>batch-size</literal> (å¯é, é»è®¤ä¸º<literal>1</literal>) æå®éè¿å»¶è¿å è½½åå¾éåå®ä¾çæ¹å¤çå大å°ï¼"batch size"ï¼ã
+ </para>
+ </callout>
+ <callout arearefs="mappingcollection12">
+ <para>
+ <literal>access</literal>(å¯é-é»è®¤ä¸ºå±æ§property):Hibernateåå¾éåå±æ§å¼æ¶ä½¿ç¨ççç¥
+ </para>
+ </callout>
+ <callout arearefs="mappingcollection13">
+ <para>
+ <literal>ä¹è§é</literal> (å¯é - é»è®¤ä¸º <literal>true</literal>):
+ 对éåçç¶æçæ¹åä¼æ¯å¦å¯¼è´å
¶æå±çå®ä½ççæ¬å¢é¿ã (对ä¸å¯¹å¤å
³èæ¥è¯´ï¼å
³éè¿ä¸ªå±æ§å¸¸å¸¸æ¯æçç)
+ </para>
+ </callout>
+ <callout arearefs="mappingcollection14">
+ <para>
+ <literal>mutable(å¯åï¼</literal> (å¯é - é»è®¤ä¸º<literal>true</literal>):
+ è¥å¼ä¸º<literal>false</literal>,表æéåä¸çå
ç´ ä¸ä¼æ¹åï¼å¨æäºæ
åµä¸å¯ä»¥è¿è¡ä¸äºå°çæ§è½ä¼åï¼ã
+ </para>
+ </callout>
+
+ </calloutlist>
+ </programlistingco>
+
+ <sect2 id="collections-foreignkeys" >
+ <title>éåå¤é®(Collection foreign keys)</title>
+
+ <para>
+ éåå®ä¾å¨æ°æ®åºä¸ä¾é ææéåçå®ä½çå¤é®å 以辨å«ãæ¤å¤é®ä½ä¸º<emphasis>éåå
³é®å段ï¼collection key columnï¼</emphasis>ï¼æå¤ä¸ªå段ï¼å 以å¼ç¨ãéåå
³é®å段éè¿<literal><key></literal> å
ç´ æ å°ã
+ </para>
+
+ <para>
+ å¨å¤é®å段ä¸å¯è½å
·æé空约æã对äºå¤§å¤æ°éåæ¥è¯´ï¼è¿æ¯éå«çã对ååä¸å¯¹å¤å
³èæ¥è¯´ï¼å¤é®å段é»è®¤æ¯å¯ä»¥ä¸ºç©ºçï¼å æ¤ä½ å¯è½éè¦ææ <literal>not-null="true"</literal>ã
+ </para>
+
+ <programlisting><![CDATA[<key column="productSerialNumber" not-null="true"/>]]></programlisting>
+
+ <para>
+ å¤é®çº¦æå¯ä»¥ä½¿ç¨<literal>ON DELETE CASCADE</literal>ã
+ </para>
+
+ <programlisting><![CDATA[<key column="productSerialNumber" on-delete="cascade"/>]]></programlisting>
+
+ <para>
+ 对<literal><key></literal> å
ç´ çå®æ´å®ä¹ï¼è¯·åé
åé¢çç« èã
+ </para>
+
+ </sect2>
+
+ <sect2 id="collections-elements" >
+ <title>éåå
ç´ ï¼Collection elementsï¼</title>
+
+ <para>
+ éåå ä¹å¯ä»¥å
å«ä»»ä½å
¶ä»çHibernateç±»åï¼å
æ¬ææçåºæ¬ç±»åãèªå®ä¹ç±»åãç»ä»¶ï¼å½ç¶è¿æ对å
¶ä»å®ä½çå¼ç¨ãåå¨ä¸ä¸ªéè¦çåºå«ï¼ä½äºéåä¸ç对象å¯è½æ¯æ ¹æ®âå¼âè¯ä¹æ¥æä½ï¼å
¶å£°æå¨æå®å
¨ä¾èµäºéåææè
ï¼ï¼æè
å®å¯è½æ¯æåå¦ä¸ä¸ªå®ä½çå¼ç¨ï¼å
·æå
¶èªå·±ççå½å¨æãå¨åè
çæ
åµä¸ï¼è¢«ä½ä¸ºéåææçç¶æèèçï¼åªæ两个对象ä¹é´çâè¿æ¥âã
+ </para>
+
+
+ <para>
+ 被å
容çç±»å被称为<emphasis>éåå
ç´ ç±»åï¼collection element typeï¼</emphasis>ãéåå
ç´ éè¿<literal><element></literal>æ<literal><composite-element></literal>æ å°ï¼æå¨å
¶æ¯å®ä½å¼ç¨çæ¶åï¼éè¿<literal><one-to-many></literal> æ<literal><many-to-many></literal>æ å°ãå两ç§ç¨äºä½¿ç¨å¼è¯ä¹æ å°å
ç´ ï¼å两ç§ç¨äºæ å°å®ä½å
³èã
+ </para>
+
+ </sect2>
+
+ <sect2 id="collections-indexed">
+ <title>ç´¢å¼éåç±»(Indexed collections)</title>
+
+
+ <para>
+ ææçéåæ å°ï¼é¤äºsetåbagè¯ä¹ç以å¤ï¼é½éè¦æå®ä¸ä¸ªéå表ç<emphasis>ç´¢å¼å段(index column)</emphasis>ââç¨äºå¯¹åºå°æ°ç»ç´¢å¼ï¼æè
<literal>List</literal>çç´¢å¼ï¼æè
<literal>Map</literal>çå
³é®åãéè¿<literal><map-key></literal>,<literal>Map</literal> çç´¢å¼å¯ä»¥æ¯ä»»ä½åºç¡ç±»åï¼è¥éè¿<literal><map-key-many-to-many></literal>ï¼å®ä¹å¯ä»¥æ¯ä¸ä¸ªå®ä½å¼ç¨ï¼è¥éè¿<literal><composite-map-key></literal>ï¼å®è¿å¯ä»¥æ¯ä¸ä¸ªç»åç±»åãæ°ç»æå表çç´¢å¼å¿
é¡»æ¯<literal>integer</literal>ç±»åï¼å¹¶ä¸ä½¿ç¨ <literal><list-index></literal>å
ç´ å®ä¹æ å°ã被æ å°çå段å
å«æ顺åºæåçæ´æ°ï¼é»è®¤ä»0å¼å§ï¼ã
+ </para>
+
+
+ <programlistingco>
+ <areaspec>
+ <area id="mapkey1" coords="2 45"/>
+ <area id="mapkey2" coords="3 45"/>
+ <area id="mapkey3" coords="4 45"/>
+ </areaspec>
+ <programlisting><![CDATA[<map-key
+ column="column_name"
+ formula="any SQL expression"
+ type="type_name"
+ node="@attribute-name"
+ length="N"/>]]></programlisting>
+ <calloutlist>
+ <callout arearefs="mapkey1">
+ <para>
+ <literal>column</literal>(å¯é):ä¿åéåç´¢å¼å¼çå段åã
+ </para>
+ </callout>
+ <callout arearefs="mapkey2">
+ <para>
+ <literal>formula</literal> (å¯é): ç¨äºè®¡ç®mapå
³é®åçSQLå
¬å¼
+ </para>
+ </callout>
+
+ <callout arearefs="mapkey3">
+ <para>
+ <literal>type</literal> (å¿
é¡»):æ å°é®(map key)çç±»åã
+ </para>
+ </callout>
+ </calloutlist>
+ </programlistingco>
+
+ <programlistingco>
+ <areaspec>
+ <area id="indexmanytomany1" coords="2 45"/>
+ <area id="indexmanytomany2" coords="3 45"/>
+ <area id="indexmanytomany3" coords="3 45"/>
+ </areaspec>
+ <programlisting><![CDATA[<map-key-many-to-many
+ column="column_name"
+ formula="any SQL expression"
+ class="ClassName"
+/>]]></programlisting>
+ <calloutlist>
+ <callout arearefs="indexmanytomany1">
+ <para>
+ <literal>column</literal>(å¯é):éåç´¢å¼å¼ä¸å¤é®å段çå称
+ </para>
+ </callout>
+ <callout arearefs="indexmanytomany2">
+ <para>
+ <literal>formula</literal> (å¯é): ç¨äºè®¡ç®mapå
³é®åçå¤é®çSQLå
¬å¼
+ </para>
+ </callout>
+ <callout arearefs="indexmanytomany3">
+ <para>
+ <literal>class</literal> (å¿
é):æ å°çé®(map key)使ç¨çå®ä½ç±»ã
+ </para>
+ </callout>
+ </calloutlist>
+ </programlistingco>
+
+ <para>
+ åè¥ä½ ç表没æä¸ä¸ªç´¢å¼å段,å½ä½ ä»ç¶å¸æ使ç¨<literal>List</literal>ä½ä¸ºå±æ§ç±»å,ä½ åºè¯¥ææ¤å±æ§æ å°ä¸ºHibernate <emphasis><bag></emphasis>ãä»æ°æ®åºä¸è·åçæ¶åï¼bagä¸ç»´æ¤å
¶é¡ºåºï¼ä½ä¹å¯éæ©æ§çè¿è¡æåºã
+ </para>
+
+ </sect2>
+
+
+ <para>
+ ä»éåç±»å¯ä»¥äº§çå¾å¤§ä¸é¨åæ å°ï¼è¦çäºå¾å¤å¸¸è§çå
³ç³»æ¨¡åãæä»¬å»ºè®®ä½ è¯éªschemaçæå·¥å
·ï¼æ¥ä½ä¼ä¸ä¸ä¸åçæ å°å£°ææ¯å¦ä½è¢«ç¿»è¯ä¸ºæ°æ®åºè¡¨çã
+ </para>
+
+ <sect2 id="collections-ofvalues" revision="2">
+ <title>å¼éåäºå¤å¯¹å¤å
³è(Collections of values and many-to-many associations)</title>
+
+
+ <para>
+ ä»»ä½å¼éåæè
å¤å¯¹å¤å
³èéè¦ä¸ç¨çå
·æä¸ä¸ªæå¤ä¸ªå¤é®å段ç<emphasis>collection table</emphasis>ãä¸ä¸ªæå¤ä¸ª<emphasis>collection element column</emphasis>ï¼ä»¥åè¿å¯è½æä¸ä¸ªæå¤ä¸ªç´¢å¼å段ã
+ </para>
+
+
+ <para>
+ 对äºä¸ä¸ªå¼éå, æ们使ç¨<literal><element></literal>æ ç¾ã
+ </para>
+
+ <programlistingco>
+ <areaspec>
+ <area id="element1b" coords="2 50"/>
+ <area id="element2b" coords="3 50"/>
+ <area id="element3b" coords="4 50"/>
+ </areaspec>
+ <programlisting><![CDATA[<element
+ column="column_name"
+ formula="any SQL expression"
+ type="typename"
+ length="L"
+ precision="P"
+ scale="S"
+ not-null="true|false"
+ unique="true|false"
+ node="element-name"
+/>]]></programlisting>
+ <calloutlist>
+ <callout arearefs="element1b">
+ <para>
+ <literal>column</literal>(å¯é):ä¿åéåå
ç´ å¼çå段åã
+ </para>
+ </callout>
+ <callout arearefs="element2b">
+ <para>
+ <literal>formula</literal> (å¯é): ç¨äºè®¡ç®å
ç´ çSQLå
¬å¼
+ </para>
+ </callout>
+ <callout arearefs="element3b">
+ <para>
+ <literal>type</literal> (å¿
é):éåå
ç´ çç±»å
+ </para>
+ </callout>
+ </calloutlist>
+ </programlistingco>
+
+ <para>
+ <emphasis>å¤å¯¹å¤å
³è(many-to-many association)</emphasis> 使ç¨
+ <literal><many-to-many></literal>å
ç´ å®ä¹.
+ </para>
+
+ <programlistingco>
+ <areaspec>
+ <area id="manytomany1" coords="2 60"/>
+ <area id="manytomany2" coords="3 60"/>
+ <area id="manytomany3" coords="4 60"/>
+ <area id="manytomany4" coords="5 60"/>
+ <area id="manytomany5" coords="6 60"/>
+ <area id="manytomany6" coords="7 60"/>
+ <area id="manytomany7" coords="8 60"/>
+ <area id="manytomany8" coords="9 60"/>
+ </areaspec>
+ <programlisting><![CDATA[<many-to-many
+ column="column_name"
+ formula="any SQL expression"
+ class="ClassName"
+ fetch="select|join"
+ unique="true|false"
+ not-found="ignore|exception"
+ entity-name="EntityName"
+ property-ref="propertyNameFromAssociatedClass"
+ node="element-name"
+ embed-xml="true|false"
+ />]]></programlisting>
+ <calloutlist>
+ <callout arearefs="manytomany1">
+ <para>
+ <literal>column</literal>(å¯é): è¿ä¸ªå
ç´ çå¤é®å
³é®å段å
+ </para>
+ </callout>
+ <callout arearefs="manytomany2">
+ <para>
+ <literal>formula</literal> (å¯é): ç¨äºè®¡ç®å
ç´ å¤é®å¼çSQLå
¬å¼.
+ </para>
+ </callout>
+
+ <callout arearefs="manytomany3">
+ <para>
+ <literal>class</literal> (å¿
é): å
³èç±»çå称
+ </para>
+ </callout>
+ <callout arearefs="manytomany3">
+ <para>
+ <literal>outer-join</literal> (å¯é - é»è®¤ä¸º<literal>auto</literal>):
+ å¨Hibernateç³»ç»åæ°ä¸<literal>hibernate.use_outer_join</literal>被æå¼çæ
åµä¸,该åæ°ç¨æ¥å
许使ç¨outer joinæ¥è½½å
¥æ¤éåçæ°æ®ã
+ </para>
+ </callout>
+ <callout arearefs="manytomany4">
+ <para>
+ 为æ¤å
³èæå¼å¤è¿æ¥æåæè
åç»selectæåãè¿æ¯ç¹æ®æ
åµï¼å¯¹äºä¸ä¸ªå®ä½åå
¶æåå
¶ä»å®ä½çå¤å¯¹å¤å
³èè¿å
¨é¢å
æåï¼ä½¿ç¨ä¸æ¡åç¬ç<literal>SELECT</literal>)ï¼ä½ ä¸ä»
éè¦å¯¹éåèªèº«æå¼<literal>join</literal>ï¼ä¹éè¦å¯¹<literal><many-to-many></literal>è¿ä¸ªå
åµå
ç´ æå¼æ¤å±æ§ã
+ </para>
+ </callout>
+ <callout arearefs="manytomany5">
+ <para>
+ 对å¤é®å段å
许DDLçæçæ¶åçæä¸ä¸ªæä¸çº¦æãè¿ä½¿å
³èåæäºä¸ä¸ªé«æçä¸å¯¹å¤å
³èãï¼æ¤å¥åçï¼åæ为This makes the association multiplicity effectively one to many.)
+ </para>
+ </callout>
+ <callout arearefs="manytomany6">
+ <para>
+ <literal>not-found</literal> (å¯é - é»è®¤ä¸º <literal>exception</literal>): ææå¼ç¨çå¤é®ä¸ç¼ºå°æäºè¡è¯¥å¦ä½å¤çï¼
+ <literal>ignore</literal> ä¼æ缺失çè¡ä½ä¸ºä¸ä¸ªç©ºå¼ç¨å¤çã
+ </para>
+
+ </callout>
+ <callout arearefs="manytomany7">
+ <para>
+ <literal>entity-name</literal> (å¯é): 被å
³èçç±»çå®ä½åï¼ä½ä¸º<literal>class</literal>çæ¿ä»£ã
+ </para>
+ </callout>
+ <callout arearefs="manytomany8">
+ <para>
+ <literal>property-ref</literal>: (å¯é) 被å
³èå°æ¤å¤é®(foreign key)çç±»ä¸ç对åºå±æ§çååãè¥æªæå®ï¼ä½¿ç¨è¢«å
³èç±»ç主é®ã
+ </para>
+ </callout>
+ </calloutlist>
+ </programlistingco>
+
+ <para>
+ ä¾åï¼é¦å
, ä¸ç»å符串ï¼
+ </para>
+
+ <programlisting><![CDATA[<set name="names" table="NAMES">
+ <key column="GROUPID"/>
+ <element column="NAME" type="string"/>
+</set>]]></programlisting>
+
+ <para>
+ å
å«ä¸ç»æ´æ°çbag(è¿è®¾ç½®äº<literal>order-by</literal>åæ°æå®äºè¿ä»£ç顺åº)ï¼
+ </para>
+
+ <programlisting><![CDATA[<bag name="sizes"
+ table="item_sizes"
+ order-by="size asc">
+ <key column="item_id"/>
+ <element column="size" type="integer"/>
+</bag>]]></programlisting>
+
+ <para>
+ ä¸ä¸ªå®ä½æ°ç»,å¨è¿ä¸ªæ¡ä¾ä¸æ¯ä¸ä¸ªå¤å¯¹å¤çå
³è(注æè¿éçå®ä½æ¯èªå¨ç®¡ççå½å¨æç对象ï¼life cycle objectsï¼,<literal>cascade="all"</literal>):
+ </para>
+
+
+ <programlisting><![CDATA[<array name="addresses"
+ table="PersonAddress"
+ cascade="persist">
+ <key column="personId"/>
+ <list-index column="sortOrder"/>
+ <many-to-many column="addressId" class="Address"/>
+</array>]]></programlisting>
+
+ <para>
+ ä¸ä¸ªmap,éè¿å符串çç´¢å¼æ¥æææ¥æï¼
+ </para>
+
+
+ <programlisting><![CDATA[<map name="holidays"
+ table="holidays"
+ schema="dbo"
+ order-by="hol_name asc">
+ <key column="id"/>
+ <map-key column="hol_name" type="string"/>
+ <element column="hol_date" type="date"/>
+</map>]]></programlisting>
+
+ <para>
+ ä¸ä¸ªç»ä»¶çå表ï¼ï¼ä¸ä¸ç« 讨论ï¼
+ </para>
+
+ <programlisting><![CDATA[<list name="carComponents"
+ table="CarComponents">
+ <key column="carId"/>
+ <list-index column="sortOrder"/>
+ <composite-element class="CarComponent">
+ <property name="price"/>
+ <property name="type"/>
+ <property name="serialNumber" column="serialNum"/>
+ </composite-element>
+</list>]]></programlisting>
+
+
+ </sect2>
+
+
+ <sect2 id="collections-onetomany">
+ <title>ä¸å¯¹å¤å
³èï¼One-to-many Associationsï¼</title>
+
+
+ <para>
+ <emphasis>ä¸å¯¹å¤å
³è</emphasis><emphasis>éè¿å¤é®</emphasis>è¿æ¥ä¸¤ä¸ªç±»å¯¹åºç表,è没æä¸é´éå表ã è¿ä¸ªå
³ç³»æ¨¡å失å»äºä¸äºJavaéåçè¯ä¹:
+ </para>
+
+ <itemizedlist spacing="compact">
+ <listitem>
+ <para>
+ ä¸ä¸ªè¢«å
å«çå®ä½çå®ä¾åªè½è¢«å
å«å¨ä¸ä¸ªéåçå®ä¾ä¸
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ ä¸ä¸ªè¢«å
å«çå®ä½çå®ä¾åªè½å¯¹åºäºéåç´¢å¼çä¸ä¸ªå¼ä¸
+ </para>
+ </listitem>
+ </itemizedlist>
+ <para>
+ ä¸ä¸ªä»<literal>Product</literal>å°<literal>Part</literal>çå
³èéè¦å
³é®åå段,å¯è½è¿æä¸ä¸ªç´¢å¼å段æå<literal>Part</literal>æ对åºç表ã <literal><one-to-many></literal>æ è®°ææäºä¸ä¸ªä¸å¯¹å¤çå
³èã
+ </para>
+
+ <programlistingco>
+ <areaspec>
+ <area id="onetomany1" coords="2 60"/>
+ <area id="onetomany2" coords="3 60"/>
+ <area id="onetomany3" coords="4 60"/>
+ </areaspec>
+ <programlisting><![CDATA[<one-to-many
+ class="ClassName"
+ not-found="ignore|exception"
+ entity-name="EntityName"
+ node="element-name"
+ embed-xml="true|false"
+ />]]></programlisting>
+ <calloutlist>
+ <callout arearefs="onetomany1">
+ <para>
+ <literal>class</literal>(å¿
é¡»):被å
³èç±»çå称ã
+ </para>
+ </callout>
+ <callout arearefs="onetomany2">
+ <para>
+ <literal>not-found</literal> (å¯é - é»è®¤ä¸º<literal>exception</literal>):
+ ææè¥ç¼åçæ 示å¼å
³èçè¡ç¼ºå¤±,该å¦ä½å¤ç:
+ <literal>ignore</literal> ä¼æ缺失çè¡ä½ä¸ºä¸ä¸ªç©ºå
³èå¤çã
+ </para>
+ </callout>
+ <callout arearefs="onetomany3">
+ <para>
+ <literal>entity-name</literal> (å¯é): 被å
³èçç±»çå®ä½åï¼ä½ä¸º<literal>class</literal>çæ¿ä»£ã
+ </para>
+ </callout>
+ </calloutlist>
+ </programlistingco>
+
+
+ <para>
+ ä¾å
+ </para>
+
+ <programlisting><![CDATA[<set name="bars">
+ <key column="foo_id"/>
+ <one-to-many class="org.hibernate.Bar"/>
+</set>]]></programlisting>
+
+ <para>
+ 注æ:<literal><one-to-many></literal>å
ç´ ä¸éè¦å®ä¹ä»»ä½å段ã ä¹ä¸éè¦æå®è¡¨åã
+
+ </para>
+
+ <para>
+ <emphasis>éè¦æ示</emphasis>:å¦æ<literal>ä¸å¯¹å¤</literal>å
³èä¸çå¤é®å段å®ä¹æ<literal>NOT NULL</literal>,ä½ å¿
é¡»æ<literal><key></literal>æ å°å£°æ为<literal>not-null="true"</literal>,æè
使ç¨<emphasis>ååå
³è</emphasis>ï¼å¹¶ä¸æ æ<literal>inverse="true"</literal>ãåé
æ¬ç« åé¢å
³äºååå
³èç讨论ã
+ </para>
+
+ <para>
+ ä¸é¢çä¾åå±ç¤ºä¸ä¸ª<literal>Part</literal>å®ä½çmap,ænameä½ä¸ºå
³é®åã( <literal>partName</literal> æ¯<literal>Part</literal>çæä¹
åå±æ§)ã注æå
¶ä¸çåºäºå
¬å¼çç´¢å¼çç¨æ³ã
+ </para>
+
+ <programlisting><![CDATA[<map name="parts"
+ cascade="all">
+ <key column="productId" not-null="true"/>
+ <map-key formula="partName"/>
+ <one-to-many class="Part"/>
+</map>]]></programlisting>
+ </sect2>
+
+ </sect1>
+
+ <sect1 id="collections-advancedmappings">
+ <title>é«çº§éåæ å°ï¼Advanced collection mappingsï¼</title>
+
+ <sect2 id="collections-sorted" revision="2">
+ <title>æåºéåï¼Sorted collectionsï¼</title>
+
+ <para>
+ Hibernateæ¯æå®ç°<literal>java.util.SortedMap</literal>å<literal>java.util.SortedSet</literal>çéåã
+ä½ å¿
é¡»å¨æ å°æ件ä¸æå®ä¸ä¸ªæ¯è¾å¨ï¼
+ </para>
+
+ <programlisting><![CDATA[<set name="aliases"
+ table="person_aliases"
+ sort="natural">
+ <key column="person"/>
+ <element column="name" type="string"/>
+</set>
+
+<map name="holidays" sort="my.custom.HolidayComparator">
+ <key column="year_id"/>
+ <map-key column="hol_name" type="string"/>
+ <element column="hol_date" type="date"/>
+</map>]]></programlisting>
+
+ <para>
+ <literal>sort</literal>å±æ§ä¸å
许çå¼å
æ¬<literal>unsorted</literal>,<literal>natural</literal>åæ个å®ç°äº<literal>java.util.Comparator</literal>çç±»çå称ã
+ </para>
+
+ <para>
+ åç±»éåçè¡ä¸ºäºå®ä¸è±¡<literal>java.util.TreeSet</literal>æè
<literal>java.util.TreeMap</literal>ã
+ </para>
+
+ <para>
+ å¦æä½ å¸ææ°æ®åºèªå·±å¯¹éåå
ç´ æåºï¼å¯ä»¥å©ç¨<literal>set</literal>,<literal>bag</literal>æè
<literal>map</literal>æ å°ä¸ç<literal>order-by</literal>å±æ§ãè¿ä¸ªè§£å³æ¹æ¡åªè½å¨jdk1.4æè
æ´é«çjdkçæ¬ä¸æå¯ä»¥å®ç°(éè¿LinkedHashSetæè
+LinkedHashMapå®ç°)ã å®æ¯å¨SQLæ¥è¯¢ä¸å®ææåºï¼èä¸æ¯å¨å
åä¸ã
+ </para>
+
+ <programlisting><![CDATA[<set name="aliases" table="person_aliases" order-by="lower(name) asc">
+ <key column="person"/>
+ <element column="name" type="string"/>
+</set>
+
+<map name="holidays" order-by="hol_date, hol_name">
+ <key column="year_id"/>
+ <map-key column="hol_name" type="string"/>
+ <element column="hol_date" type="date"/>
+</map>]]></programlisting>
+
+ <para>
+ 注æ: è¿ä¸ª<literal>order-by</literal>å±æ§çå¼æ¯ä¸ä¸ªSQLæåºåå¥èä¸æ¯HQLçï¼
+ </para>
+
+ <para>
+ å
³èè¿å¯ä»¥å¨è¿è¡æ¶ä½¿ç¨éå<literal>filter()</literal>æ ¹æ®ä»»æçæ¡ä»¶æ¥æåºã
+ </para>
+
+ <programlisting><![CDATA[sortedUsers = s.createFilter( group.getUsers(), "order by this.name" ).list();]]></programlisting>
+
+ </sect2>
+
+ <sect2 id="collections-bidirectional" revision="1">
+ <title>ååå
³èï¼Bidirectional associationsï¼</title>
+
+ <para>
+ <emphasis>ååå
³è</emphasis>å
许éè¿å
³èçä»»ä¸ç«¯è®¿é®å¦å¤ä¸ç«¯ãå¨Hibernateä¸, æ¯æ两ç§ç±»åçååå
³è:
+
+ <variablelist>
+ <varlistentry>
+ <term>ä¸å¯¹å¤ï¼one-to-manyï¼</term>
+ <listitem>
+ <para>
+ Setæè
bagå¼å¨ä¸ç«¯, åç¬å¼(ééå)å¨å¦å¤ä¸ç«¯
+ </para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>å¤å¯¹å¤ï¼many-to-manyï¼</term>
+ <listitem>
+ <para>
+ 两端é½æ¯setæbagå¼
+ </para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+
+ </para>
+
+ <para>
+ è¦å»ºç«ä¸ä¸ªååçå¤å¯¹å¤å
³èï¼åªéè¦æ å°ä¸¤ä¸ªmany-to-manyå
³èå°åä¸ä¸ªæ°æ®åºè¡¨ä¸ï¼å¹¶åå®ä¹å
¶ä¸çä¸ç«¯ä¸º<emphasis>inverse</emphasis>(使ç¨åªä¸ç«¯è¦æ ¹æ®ä½ çéæ©ï¼ä½å®ä¸è½æ¯ä¸ä¸ªç´¢å¼éå)ã
+ </para>
+
+
+
+ <para>
+ è¿éæä¸ä¸ªmany-to-manyçååå
³èçä¾å;æ¯ä¸ä¸ªcategoryé½å¯ä»¥æå¾å¤items,æ¯ä¸ä¸ªitemså¯ä»¥å±äºå¾å¤categoriesï¼
+ </para>
+
+
+ <programlisting><![CDATA[<class name="Category">
+ <id name="id" column="CATEGORY_ID"/>
+ ...
+ <bag name="items" table="CATEGORY_ITEM">
+ <key column="CATEGORY_ID"/>
+ <many-to-many class="Item" column="ITEM_ID"/>
+ </bag>
+</class>
+
+<class name="Item">
+ <id name="id" column="ITEM_ID"/>
+ ...
+
+ <!-- inverse end -->
+ <bag name="categories" table="CATEGORY_ITEM" inverse="true">
+ <key column="ITEM_ID"/>
+ <many-to-many class="Category" column="CATEGORY_ID"/>
+ </bag>
+</class>]]></programlisting>
+
+ <para>
+ å¦æåªå¯¹å
³èçåå端è¿è¡äºæ¹åï¼è¿ä¸ªæ¹å<emphasis>ä¸ä¼</emphasis>被æä¹
åã
+ è¿è¡¨ç¤ºHibernate为æ¯ä¸ªååå
³èå¨å
åä¸åå¨ä¸¤æ¬¡è¡¨ç°,ä¸ä¸ªä»Aè¿æ¥å°B,å¦ä¸ä¸ªä»Bè¿æ¥å°Aãå¦æä½ åæ³ä¸ä¸Java对象模åï¼æ们æ¯å¦ä½å¨Javaä¸å建å¤å¯¹å¤å
³ç³»çï¼è¿å¯ä»¥è®©ä½ æ´å®¹æç解ï¼
+
+ </para>
+
+ <programlisting><![CDATA[
+category.getItems().add(item); // The category now "knows" about the relationship
+item.getCategories().add(category); // The item now "knows" about the relationship
+
+session.persist(item); // The relationship won''t be saved!
+session.persist(category); // The relationship will be saved]]></programlisting>
+
+ <para>
+ éåå端ç¨äºæå
åä¸ç表示ä¿åå°æ°æ®åºä¸ã
+ </para>
+
+ <para>
+ è¦å»ºç«ä¸ä¸ªä¸å¯¹å¤çååå
³èï¼ä½ å¯ä»¥éè¿æä¸ä¸ªä¸å¯¹å¤å
³èï¼ä½ä¸ºä¸ä¸ªå¤å¯¹ä¸å
³èæ å°å°å°åä¸å¼ 表çå段ä¸ï¼å¹¶ä¸å¨"å¤"çé£ä¸ç«¯å®ä¹<literal>inverse="true"</literal>ã
+ </para>
+
+ <programlisting><![CDATA[<class name="Parent">
+ <id name="id" column="parent_id"/>
+ ....
+ <set name="children" inverse="true">
+ <key column="parent_id"/>
+ <one-to-many class="Child"/>
+ </set>
+</class>
+
+<class name="Child">
+ <id name="id" column="child_id"/>
+ ....
+ <many-to-one name="parent"
+ class="Parent"
+ column="parent_id"
+ not-null="true"/>
+</class>]]></programlisting>
+
+
+
+ <para>
+ å¨âä¸âè¿ä¸ç«¯å®ä¹<literal>inverse="true"</literal>ä¸ä¼å½±å级èæä½ï¼äºè
æ¯æ£äº¤çæ¦å¿µï¼
+ </para>
+
+ </sect2>
+
+ <sect2 id="collections-indexedbidirectional">
+ <title>ååå
³èï¼æ¶åæåºéåç±»</title>
+ <para>
+ 对äºæä¸ç«¯æ¯<literal><list></literal>æè
<literal><map></literal>çååå
³èï¼éè¦å 以ç¹å«èèãåè¥åç±»ä¸çä¸ä¸ªå±æ§æ å°å°ç´¢å¼å段ï¼æ²¡é®é¢ï¼æ们ä»ç¶å¯ä»¥å¨éåç±»æ å°ä¸ä½¿ç¨<literal>inverse="true"</literal>ï¼
+ </para>
+
+ <programlisting><![CDATA[<class name="Parent">
+ <id name="id" column="parent_id"/>
+ ....
+ <map name="children" inverse="true">
+ <key column="parent_id"/>
+ <map-key column="name"
+ type="string"/>
+ <one-to-many class="Child"/>
+ </map>
+</class>
+
+<class name="Child">
+ <id name="id" column="child_id"/>
+ ....
+ <property name="name"
+ not-null="true"/>
+ <many-to-one name="parent"
+ class="Parent"
+ column="parent_id"
+ not-null="true"/>
+</class>]]></programlisting>
+
+ <para>
+ ä½æ¯ï¼åè¥åç±»ä¸æ²¡æè¿æ ·çå±æ§åå¨ï¼æ们ä¸è½è®¤ä¸ºè¿ä¸ªå
³èæ¯çæ£çååå
³èï¼ä¿¡æ¯ä¸å¯¹ç§°ï¼å¨å
³èçä¸ç«¯æä¸äºå¦å¤ä¸ç«¯æ²¡æçä¿¡æ¯ï¼ãå¨è¿ç§æ
åµä¸ï¼æ们ä¸è½ä½¿ç¨<literal>inverse="true"</literal>ãæ们éè¦è¿æ ·ç¨ï¼
+ </para>
+
+ <programlisting><![CDATA[<class name="Parent">
+ <id name="id" column="parent_id"/>
+ ....
+ <map name="children">
+ <key column="parent_id"
+ not-null="true"/>
+ <map-key column="name"
+ type="string"/>
+ <one-to-many class="Child"/>
+ </map>
+</class>
+
+<class name="Child">
+ <id name="id" column="child_id"/>
+ ....
+ <many-to-one name="parent"
+ class="Parent"
+ column="parent_id"
+ insert="false"
+ update="false"
+ not-null="true"/>
+</class>]]></programlisting>
+
+ <para>
+ 注æå¨è¿ä¸ªæ å°ä¸ï¼å
³èä¸éåç±»"å¼"ä¸ç«¯è´è´£æ¥æ´æ°å¤é®.TODO: Does this really result in some unnecessary update statements?
+ </para>
+
+ </sect2>
+
+
+ <sect2 id="collections-ternary">
+ <title>ä¸éå
³èï¼Ternary associationsï¼</title>
+
+ <para>
+ æä¸ç§å¯è½çéå¾æ¥æ å°ä¸ä¸ªä¸éå
³èã第ä¸ç§æ¯ä½¿ç¨ä¸ä¸ª<literal>Map</literal>ï¼æä¸ä¸ªå
³èä½ä¸ºå
¶ç´¢å¼ï¼
+ </para>
+
+ <programlisting><![CDATA[<map name="contracts">
+ <key column="employer_id" not-null="true"/>
+ <map-key-many-to-many column="employee_id" class="Employee"/>
+ <one-to-many class="Contract"/>
+</map>]]></programlisting>
+
+ <programlisting><![CDATA[<map name="connections">
+ <key column="incoming_node_id"/>
+ <map-key-many-to-many column="outgoing_node_id" class="Node"/>
+ <many-to-many column="connection_id" class="Connection"/>
+</map>]]></programlisting>
+
+ <para>
+ 第äºç§æ¹æ³æ¯ç®åçæå
³èéæ°å»ºæ¨¡ä¸ºä¸ä¸ªå®ä½ç±»ãè¿ä½¿æ们æç»å¸¸ä½¿ç¨çæ¹æ³ã
+ </para>
+ <para>
+ æåä¸ç§éæ©æ¯ä½¿ç¨å¤åå
ç´ ï¼æ们ä¼å¨åé¢è®¨è®º
+ </para>
+
+ </sect2>
+
+ <sect2 id="collections-idbag" revision="1">
+ <title><literal>使ç¨<idbag></literal></title>
+ <para>
+ å¦æä½ å®å
¨ä¿¡å¥æ们对äºâèå主é®ï¼composite keysï¼æ¯ä¸ªåä¸è¥¿âï¼åâå®ä½åºè¯¥ä½¿ç¨ï¼æ æºçï¼èªå·±çæç代ç¨æ è¯ç¬¦ï¼surrogate keysï¼âçè§ç¹ï¼ä¹è®¸ä½ ä¼æå°æä¸äºå¥æªï¼æ们ç®å为æ¢å±ç¤ºçå¤å¯¹å¤å
³èåå¼éåé½æ¯æ å°æ为带æèå主é®ç表çï¼ç°å¨ï¼è¿ä¸ç¹é常å¼å¾äºè¾©ï¼çä¸å»ä¸ä¸ªå纯çå
³è表并ä¸è½ä»ä»£ç¨æ è¯ç¬¦ä¸è·å¾ä»ä¹å¥½å¤ï¼è½ç¶ä½¿ç¨ç»åå¼çéå<emphasis>å¯è½</emphasis>ä¼è·å¾ä¸ç¹å¥½å¤ï¼ãä¸è¿ï¼Hibernateæä¾äºä¸ä¸ªï¼ä¸ç¹ç¹è¯éªæ§è´¨çï¼åè½ï¼è®©ä½ æå¤å¯¹å¤å
³èåå¼éååºå¾å°ä¸ä¸ªä½¿ç¨ä»£ç¨æ è¯ç¬¦ç表å»ã
+ </para>
+
+ <para>
+ <literal><idbag></literal> å±æ§è®©ä½ 使ç¨bagè¯ä¹æ¥æ å°ä¸ä¸ª<literal>List</literal> (æ<literal>Collection</literal>)ã
+ </para>
+
+<programlisting><![CDATA[<idbag name="lovers" table="LOVERS">
+ <collection-id column="ID" type="long">
+ <generator class="sequence"/>
+ </collection-id>
+ <key column="PERSON1"/>
+ <many-to-many column="PERSON2" class="Person" fetch="join"/>
+</idbag>]]></programlisting>
+
+ <para>
+ ä½ å¯ä»¥ç解ï¼<literal><idbag></literal>人工çidçæå¨ï¼å°±å¥½åæ¯å®ä½ç±»ä¸æ ·ï¼éåçæ¯ä¸è¡é½æä¸ä¸ªä¸åç人é å
³é®åãä½æ¯ï¼Hibernate没ææä¾ä»»ä½æºå¶æ¥è®©ä½ åå¾æ个ç¹å®è¡ç人é å
³é®åã
+ </para>
+
+ <para>
+ 注æ<literal><idbag></literal>çæ´æ°æ§è½è¦æ¯æ®éç<literal><bag></literal>é«å¾å¤ï¼Hibernateå¯ä»¥ææçå®ä½å°ä¸åçè¡ï¼åå«è¿è¡æ´æ°æå é¤å·¥ä½ï¼å°±å¦åå¤çä¸ä¸ªlist, mapæè
setä¸æ ·ã
+
+ </para>
+
+ <para>
+ å¨ç®åçå®ç°ä¸ï¼è¿ä¸æ¯æ使ç¨<literal>identity</literal>æ è¯ç¬¦çæå¨çç¥æ¥çæ<literal><idbag></literal>éåçæ è¯ç¬¦ã
+ </para>
+
+ </sect2>
+
+ </sect1>
+ <!--undocumenting this stuff -->
+ <!--sect1 id="collections-heterogeneous">
+ <title>å¼ç±»å
³è(Heterogeneous Associations)</title>
+
+ <para>
+ <literal><many-to-any></literal>å<literal><index-many-to-any></literal>å
ç´ æä¾çæ£çå¼ç±»å
³èãè¿äºå
ç´ å<literal><any></literal>å
ç´ å·¥ä½æ¹å¼æ¯åæ ·ç,ä»ä»¬é½åºè¯¥å¾å°ç¨å°ã
+ </para>
+ </sect1-->
+
+ <sect1 id="collections-example" revision="1">
+ <title>éåä¾åï¼Collection exampleï¼</title>
+
+ <para>
+ å¨åé¢çå ä¸ªç« èçç¡®é常令人迷æã å æ¤è®©æ们æ¥çä¸ä¸ªä¾åãè¿ä¸ªç±»ï¼
+ </para>
+
+ <programlisting><![CDATA[package eg;
+import java.util.Set;
+
+public class Parent {
+ private long id;
+ private Set children;
+
+ public long getId() { return id; }
+ private void setId(long id) { this.id=id; }
+
+ private Set getChildren() { return children; }
+ private void setChildren(Set children) { this.children=children; }
+
+ ....
+ ....
+}]]></programlisting>
+
+ <para>
+ è¿ä¸ªç±»æä¸ä¸ª<literal>Child</literal>çå®ä¾éåãå¦ææ¯ä¸ä¸ªåå®ä¾è³å¤æä¸ä¸ªç¶å®ä¾, é£ä¹æèªç¶çæ å°æ¯ä¸ä¸ªone-to-manyçå
³èå
³ç³»ï¼
+ </para>
+
+ <programlisting><![CDATA[<hibernate-mapping>
+
+ <class name="Parent">
+ <id name="id">
+ <generator class="sequence"/>
+ </id>
+ <set name="children">
+ <key column="parent_id"/>
+ <one-to-many class="Child"/>
+ </set>
+ </class>
+
+ <class name="Child">
+ <id name="id">
+ <generator class="sequence"/>
+ </id>
+ <property name="name"/>
+ </class>
+
+</hibernate-mapping>]]></programlisting>
+
+ <para>
+ å¨ä»¥ä¸ç表å®ä¹ä¸ååºäºè¿ä¸ªæ å°å
³ç³»ï¼
+ </para>
+
+ <programlisting><![CDATA[create table parent ( id bigint not null primary key )
+create table child ( id bigint not null primary key, name varchar(255), parent_id bigint )
+alter table child add constraint childfk0 (parent_id) references parent]]></programlisting>
+
+ <para>
+ å¦æç¶äº²æ¯<emphasis>å¿
é¡»</emphasis>ç, é£ä¹å°±å¯ä»¥ä½¿ç¨ååone-to-manyçå
³èäºï¼
+ </para>
+
+ <programlisting><![CDATA[<hibernate-mapping>
+
+ <class name="Parent">
+ <id name="id">
+ <generator class="sequence"/>
+ </id>
+ <set name="children" inverse="true">
+ <key column="parent_id"/>
+ <one-to-many class="Child"/>
+ </set>
+ </class>
+
+ <class name="Child">
+ <id name="id">
+ <generator class="sequence"/>
+ </id>
+ <property name="name"/>
+ <many-to-one name="parent" class="Parent" column="parent_id" not-null="true"/>
+ </class>
+
+</hibernate-mapping>]]></programlisting>
+
+ <para>
+ 请注æ<literal>NOT NULL</literal>ç约æ:
+ </para>
+
+ <programlisting><![CDATA[create table parent ( id bigint not null primary key )
+create table child ( id bigint not null
+ primary key,
+ name varchar(255),
+ parent_id bigint not null )
+alter table child add constraint childfk0 (parent_id) references parent]]></programlisting>
+
+
+ <para>
+ å¦å¤ï¼å¦æä½ ç»å¯¹åæè¿ä¸ªå
³èåºè¯¥æ¯ååçï¼ä½ å¯ä»¥å¯¹<literal><key></literal>æ å°å£°æ<literal>NOT NULL</literal>约æï¼
+ </para>
+
+ <programlisting><![CDATA[<hibernate-mapping>
+
+ <class name="Parent">
+ <id name="id">
+ <generator class="sequence"/>
+ </id>
+ <set name="children">
+ <key column="parent_id" not-null="true"/>
+ <one-to-many class="Child"/>
+ </set>
+ </class>
+
+ <class name="Child">
+ <id name="id">
+ <generator class="sequence"/>
+ </id>
+ <property name="name"/>
+ </class>
+
+</hibernate-mapping>]]></programlisting>
+
+ <para>
+ å¦å¤ä¸æ¹é¢,å¦æä¸ä¸ªåå®ä¾å¯è½æå¤ä¸ªç¶å®ä¾, é£ä¹å°±åºè¯¥ä½¿ç¨many-to-manyå
³èï¼
+ </para>
+
+ <programlisting><![CDATA[<hibernate-mapping>
+
+ <class name="Parent">
+ <id name="id">
+ <generator class="sequence"/>
+ </id>
+ <set name="children" table="childset">
+ <key column="parent_id"/>
+ <many-to-many class="Child" column="child_id"/>
+ </set>
+ </class>
+
+ <class name="Child">
+ <id name="id">
+ <generator class="sequence"/>
+ </id>
+ <property name="name"/>
+ </class>
+
+</hibernate-mapping>]]></programlisting>
+ <para>
+ 表å®ä¹ï¼
+ </para>
+
+ <programlisting><![CDATA[create table parent ( id bigint not null primary key )
+create table child ( id bigint not null primary key, name varchar(255) )
+create table childset ( parent_id bigint not null,
+ child_id bigint not null,
+ primary key ( parent_id, child_id ) )
+alter table childset add constraint childsetfk0 (parent_id) references parent
+alter table childset add constraint childsetfk1 (child_id) references child]]></programlisting>
+
+ <para>
+ æ´å¤çä¾å,以åä¸ä¸ªå®æ´çç¶/åå
³ç³»æ å°çæç»,请åé
<xref linkend="example-parentchild"/>.
+ </para>
+
+ <para>
+ çè³å¯è½åºç°æ´å å¤æçå
³èæ å°,æ们ä¼å¨ä¸ä¸ç« ä¸ååºææå¯è½æ§ã
+ </para>
+
+ </sect1>
+
+ </chapter>
Copied: core/trunk/documentation/manual/zh-CN/src/main/docbook/content/component_mapping.xml (from rev 14080, core/trunk/documentation/manual/zh-CN/src/main/docbook/modules/component_mapping.xml)
===================================================================
--- core/trunk/documentation/manual/zh-CN/src/main/docbook/content/component_mapping.xml (rev 0)
+++ core/trunk/documentation/manual/zh-CN/src/main/docbook/content/component_mapping.xml 2007-10-09 20:10:34 UTC (rev 14081)
@@ -0,0 +1,339 @@
+<chapter id="components">
+ <title>ç»ä»¶ï¼Componentï¼æ å°</title>
+
+ <para>
+ <emphasis>ç»ä»¶</emphasis>(Component)è¿ä¸ªæ¦å¿µå¨Hibernateä¸å å¤ä¸åçå°æ¹ä¸ºäºä¸åçç®ç被éå¤ä½¿ç¨.
+ </para>
+
+ <sect1 id="components-dependentobjects" revision="2">
+ <title>ä¾èµå¯¹è±¡ï¼Dependent objectsï¼</title>
+
+ <para>
+ ç»ä»¶(Component)æ¯ä¸ä¸ªè¢«å
å«ç对象ï¼å¨æä¹
åçè¿ç¨ä¸ï¼å®è¢«å½ä½å¼ç±»åï¼è并éä¸ä¸ªå®ä½çå¼ç¨ãå¨è¿ç¯ææ¡£ä¸ï¼ç»ä»¶è¿ä¸æ¯è¯æçæ¯é¢å对象çåææ¦å¿µï¼è并ä¸æ¯ç³»ç»ææ¶å±æ¬¡ä¸çç»ä»¶çæ¦å¿µï¼ã举个ä¾å, ä½ å¯¹äºº(Person)è¿ä¸ªæ¦å¿µå¯ä»¥åä¸é¢è¿æ ·æ¥å»ºæ¨¡ï¼
+ </para>
+
+ <programlisting><![CDATA[public class Person {
+ private java.util.Date birthday;
+ private Name name;
+ private String key;
+ public String getKey() {
+ return key;
+ }
+ private void setKey(String key) {
+ this.key=key;
+ }
+ public java.util.Date getBirthday() {
+ return birthday;
+ }
+ public void setBirthday(java.util.Date birthday) {
+ this.birthday = birthday;
+ }
+ public Name getName() {
+ return name;
+ }
+ public void setName(Name name) {
+ this.name = name;
+ }
+ ......
+ ......
+}]]></programlisting>
+
+ <programlisting><![CDATA[public class Name {
+ char initial;
+ String first;
+ String last;
+ public String getFirst() {
+ return first;
+ }
+ void setFirst(String first) {
+ this.first = first;
+ }
+ public String getLast() {
+ return last;
+ }
+ void setLast(String last) {
+ this.last = last;
+ }
+ public char getInitial() {
+ return initial;
+ }
+ void setInitial(char initial) {
+ this.initial = initial;
+ }
+}]]></programlisting>
+
+ <para>
+ å¨æä¹
åçè¿ç¨ä¸,<literal>å§å(Name)</literal>å¯ä»¥ä½ä¸º<literal>人(Person)</literal>çä¸ä¸ªç»ä»¶ãéè¦æ³¨æçæ¯:ä½ åºè¯¥ä¸º<literal>å§å</literal>çæä¹
åå±æ§å®ä¹getteråsetteræ¹æ³,ä½æ¯ä½ ä¸éè¦å®ç°ä»»ä½çæ¥å£æç³ææ è¯ç¬¦å段ã
+ </para>
+
+ <para>
+ 以ä¸æ¯è¿ä¸ªä¾åçHibernateæ å°æ件:
+ </para>
+
+ <programlisting><![CDATA[<class name="eg.Person" table="person">
+ <id name="Key" column="pid" type="string">
+ <generator class="uuid"/>
+ </id>
+ <property name="birthday" type="date"/>
+ <component name="Name" class="eg.Name"> <!-- class attribute optional -->
+ <property name="initial"/>
+ <property name="first"/>
+ <property name="last"/>
+ </component>
+</class>]]></programlisting>
+
+ <para>
+ 人å(Person)表ä¸å°å
æ¬<literal>pid</literal>,
+ <literal>birthday</literal>,
+ <literal>initial</literal>,
+ <literal>first</literal>å
+ <literal>last</literal>çå段ã</para>
+
+ <para>
+ å°±åææçå¼ç±»åä¸æ ·, ç»ä»¶ä¸æ¯æå
±äº«å¼ç¨ã
+ æ¢å¥è¯è¯´ï¼ä¸¤ä¸ªäººå¯è½éåï¼ä½æ¯ä¸¤ä¸ªPerson对象åºè¯¥å
å«ä¸¤ä¸ªç¬ç«çName对象ï¼åªä¸è¿è¿ä¸¤ä¸ªName对象å
·æâåæ ·âçå¼ã
+ ç»ä»¶çå¼å¯ä»¥ä¸ºç©ºï¼å
¶å®ä¹å¦ä¸ã
+ æ¯å½Hibernateéæ°å è½½ä¸ä¸ªå
å«ç»ä»¶ç对象,å¦æ该ç»ä»¶çææå段为空ï¼Hibernateå°åå®æ´ä¸ªç»ä»¶ä¸ºç©ºã
+ å¨å¤§å¤æ°æ
åµä¸,è¿æ ·åå®åºè¯¥æ¯æ²¡æé®é¢çã
+ </para>
+
+ <para>
+ ç»ä»¶çå±æ§å¯ä»¥æ¯ä»»æä¸ç§Hibernateç±»åï¼å
æ¬éå, å¤å¯¹å¤å
³èï¼
+ 以åå
¶å®ç»ä»¶ççï¼ãåµå¥ç»ä»¶ä¸åºè¯¥è¢«å½ä½ä¸ç§ç¹æ®çåºç¨(Nested components should not be considered an
+ exotic usage)ã Hibernateå¾åäºæ¯æç»è´ç(fine-grained)对象模åã
+ </para>
+
+ <para>
+ <literal><component></literal> å
ç´ è¿å
许æ <literal><parent></literal>åå
ç´ ï¼ç¨æ¥è¡¨æcomponentç±»ä¸çä¸ä¸ªå±æ§æ¯æåå
å«å®çå®ä½çå¼ç¨ã
+ </para>
+
+ <programlisting><![CDATA[<class name="eg.Person" table="person">
+ <id name="Key" column="pid" type="string">
+ <generator class="uuid"/>
+ </id>
+ <property name="birthday" type="date">
+ <component name="Name" class="eg.Name" unique="true">
+ <parent name="namedPerson"/> <!-- reference back to the Person -->
+ <property name="initial"/>
+ <property name="first"/>
+ <property name="last"/>
+ </component>
+</class>]]></programlisting>
+
+ </sect1>
+
+ <sect1 id="components-incollections" revision="1">
+ <title>å¨éåä¸åºç°çä¾èµå¯¹è±¡ (Collections of dependent objects)</title>
+
+ <para>
+ Hibernateæ¯æç»ä»¶çéå(ä¾å¦: ä¸ä¸ªå
ç´ æ¯å§å(Name)è¿ç§ç±»åçæ°ç»)ã
+ ä½ å¯ä»¥ä½¿ç¨<literal><composite-element></literal>æ ç¾æ¿ä»£<literal><element></literal>æ ç¾æ¥å®ä¹ä½ çç»ä»¶éåã
+ </para>
+
+ <programlisting><![CDATA[<set name="someNames" table="some_names" lazy="true">
+ <key column="id"/>
+ <composite-element class="eg.Name"> <!-- class attribute required -->
+ <property name="initial"/>
+ <property name="first"/>
+ <property name="last"/>;
+ </composite-element>
+</set>]]></programlisting>
+
+ <para>
+ 注æï¼å¦æä½ å®ä¹çSetå
å«ç»åå
ç´ (composite-element)ï¼æ£ç¡®å°å®ç°<literal>equals()</literal>å<literal>hashCode()</literal>æ¯é常éè¦çã
+ </para>
+
+ <para>
+ ç»åå
ç´ å¯ä»¥å
å«ç»ä»¶ï¼ä½æ¯ä¸è½å
å«éåãå¦æä½ çç»åå
ç´ èªèº«å
å«ç»ä»¶, ä½ å¿
须使ç¨<literal><nested-composite-element></literal>æ ç¾ãè¿æ¯ä¸ä¸ªç¸å½ç¹æ®çæ¡ä¾ - å¨ä¸ä¸ªç»ä»¶çéåéï¼é£äºç»ä»¶æ¬èº«åå¯ä»¥å
å«å
¶ä»çç»ä»¶ãè¿ä¸ªæ¶åä½ å°±åºè¯¥èèä¸ä¸ä½¿ç¨one-to-manyå
³èæ¯å¦ä¼æ´æ°å½ã
+ å°è¯å¯¹è¿ä¸ªç»åå
ç´ éæ°å»ºæ¨¡ä¸ºä¸ä¸ªå®ä½ï¼ä½æ¯éè¦æ³¨æçæ¯ï¼è½ç¶Java模ååéæ°å»ºæ¨¡åæ¯ä¸æ ·çï¼å
³ç³»æ¨¡ååæä¹
æ§è¯ä¹ä¼æç»å¾®çååã
+ </para>
+
+ <para>
+ 请注æå¦æä½ ä½¿ç¨<literal><set></literal>æ ç¾,ä¸ä¸ªç»åå
ç´ çæ å°ä¸æ¯æå¯è½ä¸ºç©ºçå±æ§. å½å é¤å¯¹è±¡æ¶ï¼ Hibernateå¿
须使ç¨æ¯ä¸ä¸ªå段çå¼æ¥ç¡®å®ä¸æ¡è®°å½(å¨ç»åå
ç´ è¡¨ä¸ï¼æ²¡æåç¬çå
³é®å段)ï¼
+ å¦ææ为nullçå段ï¼è¿æ ·åå°±ä¸å¯è½äºãä½ å¿
é¡»ä½åºä¸ä¸ªéæ©ï¼è¦ä¹å¨ç»åå
ç´ ä¸ä½¿ç¨ä¸è½ä¸ºç©ºçå±æ§ï¼è¦ä¹éæ©ä½¿ç¨<literal><list></literal>,<literal><map></literal>,<literal><bag></literal> æè
<literal><idbag></literal>èä¸æ¯ <literal><set></literal>ã
+ </para>
+
+ <para>
+ ç»åå
ç´ æ个ç¹å«çç¨æ³æ¯å®å¯ä»¥å
å«ä¸ä¸ª<literal><many-to-one></literal>å
ç´ ã类似è¿æ ·çæ å°å
è®¸ä½ å°ä¸ä¸ªmany-to-manyå
³è表æ å°ä¸ºç»åå
ç´ çéåã(A mapping like this allows you to map extra columns of a many-to-many association table to the composite element class.) æ¥ä¸æ¥ççä¾åæ¯ä»<literal>Order</literal>å°<literal>Item</literal>çä¸ä¸ªå¤å¯¹å¤çå
³èå
³ç³», å
³èå±æ§æ¯ <literal>purchaseDate</literal>, <literal>price</literal> å <literal>quantity</literal> ã
+ </para>
+
+ <programlisting><![CDATA[<class name="eg.Order" .... >
+ ....
+ <set name="purchasedItems" table="purchase_items" lazy="true">
+ <key column="order_id">
+ <composite-element class="eg.Purchase">
+ <property name="purchaseDate"/>
+ <property name="price"/>
+ <property name="quantity"/>
+ <many-to-one name="item" class="eg.Item"/> <!-- class attribute is optional -->
+ </composite-element>
+ </set>
+</class>]]></programlisting>
+ <para>
+ å½ç¶ï¼å½ä½ å®ä¹Itemæ¶ï¼ä½ æ æ³å¼ç¨è¿äºpurchaseï¼å æ¤ä½ æ æ³å®ç°ååå
³èæ¥è¯¢ãè®°ä½ç»ä»¶æ¯å¼ç±»åï¼å¹¶ä¸ä¸å
许å
±äº«å¼ç¨ãæä¸ä¸ªç¹å®ç<literal>Purchase</literal> å¯ä»¥æ¾å¨<literal>Order</literal>çéåä¸ï¼ä½å®ä¸è½åæ¶è¢«<literal>Item</literal>æå¼ç¨ã
+ </para>
+
+ <para>å
¶å®ç»åå
ç´ çè¿ä¸ªç¨æ³å¯ä»¥æ©å±å°ä¸éæå¤éå
³è:</para>
+
+ <programlisting><![CDATA[<class name="eg.Order" .... >
+ ....
+ <set name="purchasedItems" table="purchase_items" lazy="true">
+ <key column="order_id">
+ <composite-element class="eg.OrderLine">
+ <many-to-one name="purchaseDetails" class="eg.Purchase"/>
+ <many-to-one name="item" class="eg.Item"/>
+ </composite-element>
+ </set>
+</class>]]></programlisting>
+
+ <para>
+ å¨æ¥è¯¢ä¸ï¼è¡¨è¾¾ç»åå
ç´ çè¯æ³åå
³èå°å
¶ä»å®ä½çè¯æ³æ¯ä¸æ ·çã
+ </para>
+
+ </sect1>
+
+ <sect1 id="components-asmapindex">
+ <title>ç»ä»¶ä½ä¸ºMapçç´¢å¼ï¼Components as Map indices ï¼</title>
+
+ <para>
+ <literal><composite-map-key></literal>å
ç´ å
è®¸ä½ æ å°ä¸ä¸ªç»ä»¶ç±»ä½ä¸ºä¸ä¸ª<literal>Map</literal>çkeyï¼åææ¯ä½ å¿
é¡»æ£ç¡®çå¨è¿ä¸ªç±»ä¸éåäº<literal>hashCode()</literal> å <literal>equals()</literal>æ¹æ³ã
+ </para>
+ </sect1>
+
+ <sect1 id="components-compositeid" revision="1">
+ <title>ç»ä»¶ä½ä¸ºèåæ è¯ç¬¦(Components as composite identifiers)</title>
+
+ <para>
+ ä½ å¯ä»¥ä½¿ç¨ä¸ä¸ªç»ä»¶ä½ä¸ºä¸ä¸ªå®ä½ç±»çæ è¯ç¬¦ã ä½ çç»ä»¶ç±»å¿
须满足以ä¸è¦æ±ï¼
+ </para>
+
+ <itemizedlist spacing="compact">
+ <listitem>
+ <para>
+ å®å¿
é¡»å®ç°<literal>java.io.Serializable</literal>æ¥å£
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ å®å¿
é¡»éæ°å®ç°<literal>equals()</literal>å<literal>hashCode()</literal>æ¹æ³, å§ç»åç»åå
³é®åå¨æ°æ®åºä¸çæ¦å¿µä¿æä¸è´
+ </para>
+ </listitem>
+ </itemizedlist>
+
+ <para>
+ <emphasis>注æï¼å¨Hibernate3ä¸ï¼ç¬¬äºä¸ªè¦æ±å¹¶éæ¯Hibernate强å¶å¿
é¡»çãä½æ好è¿æ ·åã</emphasis>
+ </para>
+
+ <para>
+ ä½ ä¸è½ä½¿ç¨ä¸ä¸ª<literal>IdentifierGenerator</literal>产çç»åå
³é®åãä¸ä¸ªåºç¨ç¨åºå¿
é¡»åé
å®èªå·±çæ è¯ç¬¦ã
+ </para>
+
+ <para>
+ 使ç¨<literal><composite-id></literal> æ ç¾(并ä¸å
åµ<literal><key-property></literal>å
ç´ )代æ¿é常ç<literal><id></literal>æ ç¾ãæ¯å¦,<literal>OrderLine</literal>ç±»å
·æä¸ä¸ªä¸»é®ï¼è¿ä¸ªä¸»é®ä¾èµäº<literal>Order</literal>ç(èå)主é®ã
+ </para>
+
+ <programlisting><![CDATA[<class name="OrderLine">
+
+ <composite-id name="id" class="OrderLineId">
+ <key-property name="lineId"/>
+ <key-property name="orderId"/>
+ <key-property name="customerId"/>
+ </composite-id>
+
+ <property name="name"/>
+
+ <many-to-one name="order" class="Order"
+ insert="false" update="false">
+ <column name="orderId"/>
+ <column name="customerId"/>
+ </many-to-one>
+ ....
+
+</class>]]></programlisting>
+
+ <para>
+ ç°å¨ï¼ä»»ä½æå<literal>OrderLine</literal>çå¤é®é½æ¯å¤åçãå¨ä½ çæ å°æ件ä¸ï¼å¿
须为å
¶ä»ç±»ä¹è¿æ ·å£°æãä¾å¦ï¼ä¸ä¸ªæå<literal>OrderLine</literal>çå
³èå¯è½è¢«è¿æ ·æ å°ï¼
+ </para>
+
+ <programlisting><![CDATA[<many-to-one name="orderLine" class="OrderLine">
+<!-- the "class" attribute is optional, as usual -->
+ <column name="lineId"/>
+ <column name="orderId"/>
+ <column name="customerId"/>
+</many-to-one>]]></programlisting>
+
+ <para>
+ ï¼æ³¨æå¨å个å°æ¹<literal><column></literal>æ ç¾é½æ¯<literal>column</literal>å±æ§çæ¿ä»£åæ³ãï¼
+ </para>
+
+ <para>
+ æå<literal>OrderLine</literal>ç<literal>å¤å¯¹å¤</literal>å
³èä¹ä½¿ç¨èåå¤é®:
+ </para>
+
+ <programlisting><![CDATA[<set name="undeliveredOrderLines">
+ <key column name="warehouseId"/>
+ <many-to-many class="OrderLine">
+ <column name="lineId"/>
+ <column name="orderId"/>
+ <column name="customerId"/>
+ </many-to-many>
+</set>]]></programlisting>
+
+ <para>
+ å¨<literal>Order</literal>ä¸,<literal>OrderLine</literal>çéååæ¯è¿æ ·:
+ </para>
+
+ <programlisting><![CDATA[<set name="orderLines" inverse="true">
+ <key>
+ <column name="orderId"/>
+ <column name="customerId"/>
+ </key>
+ <one-to-many class="OrderLine"/>
+</set>]]></programlisting>
+
+ <para>
+ (ä¸é常ä¸æ ·,<literal><one-to-many></literal>å
ç´ ä¸å£°æä»»ä½å.)
+ </para>
+
+ <para>
+ åè¥<literal>OrderLine</literal>æ¬èº«æ¥æä¸ä¸ªéå,å®ä¹å
·æç»åå¤é®ã
+ </para>
+
+ <programlisting><![CDATA[<class name="OrderLine">
+ ....
+ ....
+ <list name="deliveryAttempts">
+ <key> <!-- a collection inherits the composite key type -->
+ <column name="lineId"/>
+ <column name="orderId"/>
+ <column name="customerId"/>
+ </key>
+ <list-index column="attemptId" base="1"/>
+ <composite-element class="DeliveryAttempt">
+ ...
+ </composite-element>
+ </set>
+</class>]]></programlisting>
+
+ </sect1>
+
+ <sect1 id="components-dynamic" revision="1">
+ <title>å¨æç»ä»¶ ï¼Dynamic componentsï¼</title>
+
+ <para>
+ ä½ çè³å¯ä»¥æ å°<literal>Map</literal>ç±»åçå±æ§ï¼
+ </para>
+
+ <programlisting><![CDATA[<dynamic-component name="userAttributes">
+ <property name="foo" column="FOO" type="string"/>
+ <property name="bar" column="BAR" type="integer"/>
+ <many-to-one name="baz" class="Baz" column="BAZ_ID"/>
+</dynamic-component>]]></programlisting>
+
+ <para>
+ ä»<literal><dynamic-component></literal>æ å°çè¯ä¹ä¸æ¥è®²ï¼å®å<literal><component></literal>æ¯ç¸åçã
+ è¿ç§æ å°ç±»åçä¼ç¹å¨äºéè¿ä¿®æ¹æ å°æ件ï¼å°±å¯ä»¥å
·æå¨é¨ç½²æ¶æ£æµçå®å±æ§çè½åãå©ç¨ä¸ä¸ªDOM解æå¨ï¼ä¹å¯ä»¥å¨ç¨åºè¿è¡æ¶æä½æ å°æ件ã
+ æ´å¥½çæ¯ï¼ä½ å¯ä»¥éè¿<literal>Configuration</literal>对象æ¥è®¿é®ï¼æè
ä¿®æ¹ï¼Hibernateçè¿è¡æ¶å
模åã
+ </para>
+ </sect1>
+</chapter>
\ No newline at end of file
Copied: core/trunk/documentation/manual/zh-CN/src/main/docbook/content/configuration.xml (from rev 14080, core/trunk/documentation/manual/zh-CN/src/main/docbook/modules/configuration.xml)
===================================================================
--- core/trunk/documentation/manual/zh-CN/src/main/docbook/content/configuration.xml (rev 0)
+++ core/trunk/documentation/manual/zh-CN/src/main/docbook/content/configuration.xml 2007-10-09 20:10:34 UTC (rev 14081)
@@ -0,0 +1,1694 @@
+<chapter id="session-configuration" revision="1">
+
+ <title>
+ é
ç½®
+ </title>
+
+ <para>
+ ç±äºHibernateæ¯ä¸ºäºè½å¨åç§ä¸åç¯å¢ä¸å·¥ä½è设计ç, å æ¤åå¨ç大éçé
ç½®åæ°. 幸è¿çæ¯å¤æ°é
ç½®åæ°é½
+ ææ¯è¾ç´è§çé»è®¤å¼, 并æéHibernateä¸åååçé
ç½®æ ·ä¾<literal>hibernate.properties</literal>
+ (ä½äº<literal>etc/</literal>)æ¥å±ç¤ºåç§é
ç½®é项. æéåçä»
ä»
æ¯å°è¿ä¸ªæ ·ä¾æ件å¤å¶å°ç±»è·¯å¾
+ (classpath)ä¸å¹¶åä¸äºèªå®ä¹çä¿®æ¹.
+ </para>
+
+ <sect1 id="configuration-programmatic" revision="1">
+ <title>
+ å¯ç¼ç¨çé
ç½®æ¹å¼
+ </title>
+
+ <para>
+ ä¸ä¸ª<literal>org.hibernate.cfg.Configuration</literal>å®ä¾ä»£è¡¨äºä¸ä¸ªåºç¨ç¨åºä¸Javaç±»å
+ å°SQLæ°æ®åºæ å°çå®æ´éå. <literal>Configuration</literal>被ç¨æ¥æ建ä¸ä¸ª(ä¸å¯åç
+ (immutable))<literal>SessionFactory</literal>. æ å°å®ä¹åç±ä¸åçXMLæ å°å®ä¹æ件ç¼è¯èæ¥.
+ </para>
+
+ <para>
+ ä½ å¯ä»¥ç´æ¥å®ä¾å<literal>Configuration</literal>æ¥è·åä¸ä¸ªå®ä¾ï¼å¹¶ä¸ºå®æå®XMLæ å°å®ä¹
+ æ件. å¦ææ å°å®
+ ä¹æ件å¨ç±»è·¯å¾(classpath)ä¸, 请使ç¨<literal>addResource()</literal>:
+ </para>
+
+ <programlisting><![CDATA[Configuration cfg = new Configuration()
+ .addResource("Item.hbm.xml")
+ .addResource("Bid.hbm.xml");]]></programlisting>
+
+ <para>
+ ä¸ä¸ªæ¿ä»£æ¹æ³ï¼ææ¶æ¯æ´å¥½çéæ©ï¼æ¯ï¼æå®è¢«æ å°çç±»ï¼è®©Hibernateå¸®ä½ å¯»æ¾æ å°å®ä¹æ件:
+ </para>
+
+ <programlisting><![CDATA[Configuration cfg = new Configuration()
+ .addClass(org.hibernate.auction.Item.class)
+ .addClass(org.hibernate.auction.Bid.class);]]></programlisting>
+
+ <para>
+ Hibernateå°ä¼å¨ç±»è·¯å¾(classpath)ä¸å¯»æ¾åå为
+ <literal>/org/hibernate/auction/Item.hbm.xml</literal>å
+ <literal>/org/hibernate/auction/Bid.hbm.xml</literal>æ å°å®ä¹æ件.
+ è¿ç§æ¹å¼æ¶é¤äºä»»ä½å¯¹æ件åç硬ç¼ç (hardcoded).
+ </para>
+
+ <para>
+ <literal>Configuration</literal>ä¹å
è®¸ä½ æå®é
ç½®å±æ§:
+ </para>
+
+ <programlisting><![CDATA[Configuration cfg = new Configuration()
+ .addClass(org.hibernate.auction.Item.class)
+ .addClass(org.hibernate.auction.Bid.class)
+ .setProperty("hibernate.dialect", "org.hibernate.dialect.MySQLInnoDBDialect")
+ .setProperty("hibernate.connection.datasource", "java:comp/env/jdbc/test")
+ .setProperty("hibernate.order_updates", "true");]]></programlisting>
+
+ <para>
+ å½ç¶è¿ä¸æ¯å¯ä¸çä¼ éHibernateé
ç½®å±æ§çæ¹å¼, å
¶ä»å¯éæ¹å¼è¿å
æ¬:
+ </para>
+
+ <orderedlist spacing="compact">
+ <listitem>
+ <para>
+ ä¼ ä¸ä¸ª<literal>java.util.Properties</literal>å®ä¾ç»
+ <literal>Configuration.setProperties()</literal>.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ å°<literal>hibernate.properties</literal>æ¾ç½®å¨ç±»è·¯å¾(classpath)çæ ¹ç®å½ä¸
+ (root directory).
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ éè¿<literal>java -Dproperty=value</literal>æ¥è®¾ç½®ç³»ç»
+ (<literal>System</literal>)å±æ§.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ å¨<literal>hibernate.cfg.xml</literal>ä¸å å
¥å
ç´
+ <literal><property></literal> (ç¨å讨论).
+ </para>
+ </listitem>
+ </orderedlist>
+
+ <para>
+ å¦ææ³å°½å¿«ä½éªHibernate, <literal>hibernate.properties</literal>æ¯æç®åçæ¹å¼.
+ </para>
+
+ <para>
+ <literal>Configuration</literal>å®ä¾è¢«è®¾è®¡æå¯å¨æé´ï¼startup-timeï¼å¯¹è±¡,
+ ä¸æ¦<literal>SessionFactory</literal>å建å®æå®å°±è¢«ä¸¢å¼äº.
+ </para>
+
+ </sect1>
+
+ <sect1 id="configuration-sessionfactory">
+ <title>
+ è·å¾SessionFactory
+ </title>
+
+
+ <para>
+ å½æææ å°å®ä¹è¢«<literal>Configuration</literal>解æå,
+ åºç¨ç¨åºå¿
é¡»è·å¾ä¸ä¸ªç¨äºæé <literal>Session</literal>å®ä¾çå·¥å.
+ è¿ä¸ªå·¥åå°è¢«åºç¨ç¨åºçææ线ç¨å
񄧮:
+ </para>
+
+ <programlisting><![CDATA[SessionFactory sessions = cfg.buildSessionFactory();]]></programlisting>
+
+ <para>
+ Hibernateå
è®¸ä½ çåºç¨ç¨åºå建å¤ä¸ª<literal>SessionFactory</literal>å®ä¾. è¿å¯¹
+ 使ç¨å¤ä¸ªæ°æ®åºçåºç¨æ¥è¯´å¾æç¨.
+ </para>
+
+ </sect1>
+
+ <sect1 id="configuration-hibernatejdbc" revision="1">
+ <title>
+ JDBCè¿æ¥
+ </title>
+
+ <para>
+ éå¸¸ä½ å¸æ<literal>SessionFactory</literal>æ¥ä¸ºä½ å建åç¼å(pool)JDBCè¿æ¥. å¦æä½ éç¨è¿ç§æ¹å¼,
+ åªéè¦å¦ä¸ä¾æ示é£æ ·ï¼æå¼ä¸ä¸ª<literal>Session</literal>:
+ </para>
+
+ <programlisting><![CDATA[Session session = sessions.openSession(); // open a new Session]]></programlisting>
+
+ <para>
+ ä¸æ¦ä½ éè¦è¿è¡æ°æ®è®¿é®æ¶, å°±ä¼ä»è¿æ¥æ± (connection pool)è·å¾ä¸ä¸ªJDBCè¿æ¥.
+ </para>
+
+ <para>
+ 为äºä½¿è¿ç§æ¹å¼å·¥ä½èµ·æ¥, æ们éè¦åHibernateä¼ éä¸äºJDBCè¿æ¥çå±æ§.
+ ææHibernateå±æ§çåååè¯ä¹é½å¨<literal>org.hibernate.cfg.Environment</literal>ä¸å®ä¹.
+ æ们ç°å¨å°æè¿°JDBCè¿æ¥é
ç½®ä¸æéè¦ç设置.
+ </para>
+
+ <para>
+ å¦æä½ è®¾ç½®å¦ä¸å±æ§ï¼Hibernateå°ä½¿ç¨<literal>java.sql.DriverManager</literal>æ¥è·å¾(åç¼å)JDBCè¿æ¥ :
+ </para>
+
+ <table frame="topbot">
+ <title>
+ Hibernate JDBCå±æ§
+ </title>
+ <tgroup cols="2">
+ <colspec colname="c1" colwidth="1*"/>
+ <colspec colname="c2" colwidth="1*"/>
+ <thead>
+ <row>
+ <entry>
+ å±æ§å
+ </entry>
+ <entry>
+ ç¨é
+ </entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry>
+ <literal>hibernate.connection.driver_class</literal>
+ </entry>
+ <entry>
+ <emphasis>jdbc驱å¨ç±»</emphasis>
+ </entry>
+ </row>
+ <row>
+ <entry>
+ <literal>hibernate.connection.url</literal>
+ </entry>
+ <entry>
+ <emphasis>jdbc URL</emphasis>
+ </entry>
+ </row>
+ <row>
+ <entry>
+ <literal>hibernate.connection.username</literal>
+ </entry>
+ <entry>
+ <emphasis>æ°æ®åºç¨æ·</emphasis>
+ </entry>
+ </row>
+ <row>
+ <entry>
+ <literal>hibernate.connection.password</literal>
+ </entry>
+ <entry>
+ <emphasis>æ°æ®åºç¨æ·å¯ç </emphasis>
+ </entry>
+ </row>
+ <row>
+ <entry>
+ <literal>hibernate.connection.pool_size</literal>
+ </entry>
+ <entry>
+ <emphasis>è¿æ¥æ± 容éä¸éæ°ç®</emphasis>
+ </entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </table>
+
+ <para>
+ ä½Hibernateèªå¸¦çè¿æ¥æ± ç®æ³ç¸å½ä¸æç.
+ å®åªæ¯ä¸ºäºè®©ä½ å¿«äºä¸æ<emphasis>ï¼å¹¶ä¸éåç¨äºäº§åç³»ç»</emphasis>ææ§è½æµè¯ä¸ã
+ åºäºæä½³æ§è½å稳å®æ§èèä½ åºè¯¥ä½¿ç¨ç¬¬ä¸æ¹çè¿æ¥æ± ãåªéè¦ç¨ç¹å®è¿æ¥æ± ç设置æ¿æ¢
+ <literal>hibernate.connection.pool_size</literal>å³å¯ãè¿å°å
³éHibernateèªå¸¦çè¿æ¥æ± .
+ ä¾å¦, ä½ å¯è½ä¼æ³ç¨C3P0.
+ </para>
+
+ <para>
+ C3P0æ¯ä¸ä¸ªéHibernateä¸åååçå¼æºçJDBCè¿æ¥æ± , å®ä½äº<literal>lib</literal>ç®å½ä¸ã
+ å¦æä½ è®¾ç½®äº<literal>hibernate.c3p0.*</literal>ç¸å
³çå±æ§, Hibernateå°ä½¿ç¨
+ <literal>C3P0ConnectionProvider</literal>æ¥ç¼åJDBCè¿æ¥. å¦æä½ æ´åæ使ç¨Proxool, 请åèå
+ è¡å
ä¸ç<literal>hibernate.properties</literal>并å°Hibernateç½ç«è·åæ´å¤çä¿¡æ¯.
+ </para>
+
+ <para>
+ è¿æ¯ä¸ä¸ªä½¿ç¨C3P0ç<literal>hibernate.properties</literal>æ ·ä¾æ件:
+ </para>
+
+ <programlisting id="c3p0-configuration" revision="1"><![CDATA[hibernate.connection.driver_class = org.postgresql.Driver
+hibernate.connection.url = jdbc:postgresql://localhost/mydatabase
+hibernate.connection.username = myuser
+hibernate.connection.password = secret
+hibernate.c3p0.min_size=5
+hibernate.c3p0.max_size=20
+hibernate.c3p0.timeout=1800
+hibernate.c3p0.max_statements=50
+hibernate.dialect = org.hibernate.dialect.PostgreSQLDialect]]></programlisting>
+
+ <para>
+ 为äºè½å¨åºç¨ç¨åºæå¡å¨(application server)ä¸ä½¿ç¨Hibernate, åºå½æ»æ¯å°Hibernate
+ é
ç½®æä»æ³¨åå¨JNDIä¸ç<literal>Datasource</literal>å¤è·å¾è¿æ¥ï¼ä½ è³å°éè¦è®¾ç½®ä¸åå±æ§ä¸çä¸ä¸ª:
+ </para>
+
+ <table frame="topbot">
+ <title>
+ Hibernateæ°æ®æºå±æ§
+ </title>
+ <tgroup cols="2">
+ <colspec colname="c1" colwidth="1*"/>
+ <colspec colname="c2" colwidth="1*"/>
+ <thead>
+ <row>
+ <entry>
+ å±æ§å
+ </entry>
+ <entry>
+ ç¨é
+ </entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry>
+ <literal>hibernate.connection.datasource</literal>
+ </entry>
+ <entry>
+ <emphasis>æ°æ®æºJNDIåå</emphasis>
+ </entry>
+ </row>
+ <row>
+ <entry>
+ <literal>hibernate.jndi.url</literal>
+ </entry>
+ <entry>
+ <emphasis>JNDIæä¾è
çURL</emphasis> (å¯é)
+ </entry>
+ </row>
+ <row>
+ <entry>
+ <literal>hibernate.jndi.class</literal>
+ </entry>
+ <entry>
+ <emphasis>JNDI <literal>InitialContextFactory</literal>ç±»</emphasis> (å¯é)
+ </entry>
+ </row>
+ <row>
+ <entry>
+ <literal>hibernate.connection.username</literal>
+ </entry>
+ <entry>
+ <emphasis>æ°æ®åºç¨æ·</emphasis> (å¯é)
+ </entry>
+ </row>
+ <row>
+ <entry>
+ <literal>hibernate.connection.password</literal>
+ </entry>
+ <entry>
+ <emphasis>æ°æ®åºç¨æ·å¯ç </emphasis> (å¯é)
+ </entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </table>
+
+ <para>
+ è¿æ¯ä¸ä¸ªä½¿ç¨åºç¨ç¨åºæå¡å¨æä¾çJNDIæ°æ®æºç<literal>hibernate.properties</literal>æ ·ä¾æ件:
+ </para>
+
+ <programlisting><![CDATA[hibernate.connection.datasource = java:/comp/env/jdbc/test
+hibernate.transaction.factory_class = \
+ org.hibernate.transaction.JTATransactionFactory
+hibernate.transaction.manager_lookup_class = \
+ org.hibernate.transaction.JBossTransactionManagerLookup
+hibernate.dialect = org.hibernate.dialect.PostgreSQLDialect]]></programlisting>
+
+ <para>
+ ä»JNDIæ°æ®æºè·å¾çJDBCè¿æ¥å°èªå¨åä¸å°åºç¨ç¨åºæå¡å¨ä¸å®¹å¨ç®¡ççäºå¡(container-managed transactions)ä¸å».
+ </para>
+
+ <para>
+ ä»»ä½è¿æ¥(connection)å±æ§çå±æ§åé½è¦ä»¥"<literal>hibernate.connnection</literal>"å¼å¤´.
+ ä¾å¦, ä½ å¯è½ä¼ä½¿ç¨<literal>hibernate.connection.charSet</literal>æ¥æå®å符é<literal>charSet</literal>.
+ </para>
+
+ <para>
+ éè¿å®ç°<literal>org.hibernate.connection.ConnectionProvider</literal>æ¥å£ï¼ä½ å¯ä»¥å®ä¹å±äº
+ ä½ èªå·±çè·å¾JDBCè¿æ¥çæ件çç¥ãéè¿è®¾ç½®<literal>hibernate.connection.provider_class</literal>ï¼
+ ä½ å¯ä»¥éæ©ä¸ä¸ªèªå®ä¹çå®ç°.
+ </para>
+
+ </sect1>
+
+ <sect1 id="configuration-optional" revision="1">
+ <title>
+ å¯éçé
ç½®å±æ§
+ </title>
+
+ <para>
+ æ大éå±æ§è½ç¨æ¥æ§å¶Hibernateå¨è¿è¡æçè¡ä¸º. å®ä»¬é½æ¯å¯éç, 并æ¥æéå½çé»è®¤å¼.
+ </para>
+
+ <para>
+ <emphasis>è¦å: å
¶ä¸ä¸äºå±æ§æ¯"ç³»ç»çº§(system-level)ç".</emphasis>
+ ç³»ç»çº§å±æ§åªè½éè¿<literal>java -Dproperty=value</literal>æ
+ <literal>hibernate.properties</literal>æ¥è®¾ç½®, è<emphasis>ä¸è½</emphasis>ç¨ä¸é¢æè¿°çå
¶ä»æ¹æ³æ¥è®¾ç½®.
+ </para>
+
+ <table frame="topbot" id="configuration-optional-properties" revision="8">
+ <title>
+ Hibernateé
ç½®å±æ§
+ </title>
+ <tgroup cols="2">
+ <colspec colname="c1" colwidth="1*"/>
+ <colspec colname="c2" colwidth="1*"/>
+ <thead>
+ <row>
+ <entry>
+ å±æ§å
+ </entry>
+ <entry>
+ ç¨é
+ </entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry>
+ <literal>hibernate.dialect</literal>
+ </entry>
+ <entry>
+ ä¸ä¸ªHibernate <literal>Dialect</literal>ç±»åå
许Hibernateé对ç¹å®çå
³ç³»æ°æ®åºçæä¼åçSQL.
+ <para>
+ <emphasis role="strong">åå¼</emphasis>
+ <literal>full.classname.of.Dialect</literal>
+
+ </para>
+ </entry>
+ </row>
+ <row>
+ <entry>
+ <literal>hibernate.show_sql</literal>
+ </entry>
+ <entry>
+ è¾åºææSQLè¯å¥å°æ§å¶å°.
+ æä¸ä¸ªå¦å¤çéæ©æ¯æ<literal>org.hibernate.SQL</literal>è¿ä¸ªlog category设为<literal>debug</literal>ã
+ <para>
+ <emphasis role="strong">eg.</emphasis>
+ <literal>true</literal> | <literal>false</literal>
+ </para>
+ </entry>
+ </row>
+ <row>
+ <entry>
+ <literal>hibernate.format_sql</literal>
+ </entry>
+ <entry>
+ å¨logåconsoleä¸æå°åºæ´æ¼äº®çSQLã
+ <para>
+ <emphasis role="strong">åå¼</emphasis>
+ <literal>true</literal> | <literal>false</literal>
+ </para>
+ </entry>
+ </row>
+ <row>
+ <entry>
+ <literal>hibernate.default_schema</literal>
+ </entry>
+ <entry>
+ å¨çæçSQLä¸, å°ç»å®çschema/tablespaceéå äºéå
¨éå®åç表åä¸.
+ <para>
+ <emphasis role="strong">åå¼</emphasis>
+ <literal>SCHEMA_NAME</literal>
+ </para>
+ </entry>
+ </row>
+ <row>
+ <entry>
+ <literal>hibernate.default_catalog</literal>
+ </entry>
+ <entry>
+ å¨çæçSQLä¸, å°ç»å®çcatalogéå äºéå
¨éå®åç表åä¸.
+ <para>
+ <emphasis role="strong">åå¼</emphasis>
+ <literal>CATALOG_NAME</literal>
+ </para>
+ </entry>
+ </row>
+ <row>
+ <entry>
+ <literal>hibernate.session_factory_name</literal>
+ </entry>
+ <entry>
+ <literal>SessionFactory</literal>å建åï¼å°èªå¨ä½¿ç¨è¿ä¸ªååç»å®å°JNDIä¸.
+ <para>
+ <emphasis role="strong">åå¼</emphasis>
+ <literal>jndi/composite/name</literal>
+ </para>
+ </entry>
+ </row>
+ <row>
+ <entry>
+ <literal>hibernate.max_fetch_depth</literal>
+ </entry>
+ <entry>
+ 为ååå
³è(ä¸å¯¹ä¸, å¤å¯¹ä¸)çå¤è¿æ¥æåï¼outer join fetchï¼æ 设置æ大深度.
+ å¼ä¸º<literal>0</literal>æå³çå°å
³éé»è®¤çå¤è¿æ¥æå.
+ <para>
+ <emphasis role="strong">åå¼</emphasis>
+ 建议å¨<literal>0</literal>å°<literal>3</literal>ä¹é´åå¼
+ </para>
+ </entry>
+ </row>
+ <row>
+ <entry>
+ <literal>hibernate.default_batch_fetch_size</literal>
+ </entry>
+ <entry>
+ 为Hibernateå
³èçæ¹éæå设置é»è®¤æ°é.
+ <para>
+ <emphasis role="strong">åå¼</emphasis>
+ 建议çåå¼ä¸º<literal>4</literal>, <literal>8</literal>,
+ å<literal>16</literal>
+ </para>
+ </entry>
+ </row>
+ <row>
+ <entry>
+ <literal>hibernate.default_entity_mode</literal>
+ </entry>
+ <entry>
+ 为ç±è¿ä¸ª<literal>SessionFactory</literal>æå¼çææSessionæå®é»è®¤çå®ä½è¡¨ç°æ¨¡å¼.
+ <para>
+ <emphasis role="strong">åå¼</emphasis>
+ <literal>dynamic-map</literal>, <literal>dom4j</literal>,
+ <literal>pojo</literal>
+ </para>
+ </entry>
+ </row>
+ <row>
+ <entry>
+ <literal>hibernate.order_updates</literal>
+ </entry>
+ <entry>
+ 强å¶Hibernateæç
§è¢«æ´æ°æ°æ®ç主é®ï¼ä¸ºSQLæ´æ°æåºãè¿ä¹åå°åå°å¨é«å¹¶åç³»ç»ä¸äºå¡çæ»éã
+ <para>
+ <emphasis role="strong">åå¼</emphasis>
+ <literal>true</literal> | <literal>false</literal>
+ </para>
+ </entry>
+ </row>
+ <row>
+ <entry>
+ <literal>hibernate.generate_statistics</literal>
+ </entry>
+ <entry>
+ å¦æå¼å¯, Hibernateå°æ¶éæå©äºæ§è½è°èçç»è®¡æ°æ®.
+ <para>
+ <emphasis role="strong">åå¼</emphasis>
+ <literal>true</literal> | <literal>false</literal>
+ </para>
+ </entry>
+ </row>
+ <row>
+ <entry>
+ <literal>hibernate.use_identifer_rollback</literal>
+ </entry>
+ <entry>
+ å¦æå¼å¯, å¨å¯¹è±¡è¢«å é¤æ¶çæçæ è¯å±æ§å°è¢«é设为é»è®¤å¼.
+ <para>
+ <emphasis role="strong">åå¼</emphasis>
+ <literal>true</literal> | <literal>false</literal>
+ </para>
+ </entry>
+ </row>
+ <row>
+ <entry>
+ <literal>hibernate.use_sql_comments</literal>
+ </entry>
+ <entry>
+ å¦æå¼å¯, Hibernateå°å¨SQLä¸çææå©äºè°è¯ç注éä¿¡æ¯, é»è®¤å¼ä¸º<literal>false</literal>.
+ <para>
+ <emphasis role="strong">åå¼</emphasis>
+ <literal>true</literal> | <literal>false</literal>
+ </para>
+ </entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </table>
+
+ <table frame="topbot" id="configuration-jdbc-properties" revision="8">
+ <title>
+ Hibernate JDBCåè¿æ¥(connection)å±æ§
+ </title>
+ <tgroup cols="2">
+ <colspec colname="c1" colwidth="1*"/>
+ <colspec colname="c2" colwidth="1*"/>
+ <thead>
+ <row>
+ <entry>
+ å±æ§å
+ </entry>
+ <entry>
+ ç¨é
+ </entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry>
+ <literal>hibernate.jdbc.fetch_size</literal>
+ </entry>
+ <entry>
+ éé¶å¼ï¼æå®JDBCæåæ°éçå¤§å° (è°ç¨<literal>Statement.setFetchSize()</literal>).
+ </entry>
+ </row>
+ <row>
+ <entry>
+ <literal>hibernate.jdbc.batch_size</literal>
+ </entry>
+ <entry>
+ éé¶å¼ï¼å
许Hibernate使ç¨JDBC2çæ¹éæ´æ°.
+ <para>
+ <emphasis role="strong">åå¼</emphasis>
+ 建议å<literal>5</literal>å°<literal>30</literal>ä¹é´çå¼
+ </para>
+ </entry>
+ </row>
+ <row>
+ <entry>
+ <literal>hibernate.jdbc.batch_versioned_data</literal>
+ </entry>
+ <entry>
+ å¦æä½ æ³è®©ä½ çJDBC驱å¨ä»<literal>executeBatch()</literal>è¿åæ£ç¡®çè¡è®¡æ° ,
+ é£ä¹å°æ¤å±æ§è®¾ä¸º<literal>true</literal>(å¼å¯è¿ä¸ªé项é常æ¯å®å
¨ç).
+ åæ¶ï¼Hibernateå°ä¸ºèªå¨çæ¬åçæ°æ®ä½¿ç¨æ¹éDML. é»è®¤å¼ä¸º<literal>false</literal>.
+ <para>
+ <emphasis role="strong">eg.</emphasis>
+ <literal>true</literal> | <literal>false</literal>
+ </para>
+ </entry>
+ </row>
+ <row>
+ <entry>
+ <literal>hibernate.jdbc.factory_class</literal>
+ </entry>
+ <entry>
+ éæ©ä¸ä¸ªèªå®ä¹ç<literal>Batcher</literal>. å¤æ°åºç¨ç¨åºä¸éè¦è¿ä¸ªé
ç½®å±æ§.
+ <para>
+ <emphasis role="strong">eg.</emphasis>
+ <literal>classname.of.BatcherFactory</literal>
+ </para>
+ </entry>
+ </row>
+ <row>
+ <entry>
+ <literal>hibernate.jdbc.use_scrollable_resultset</literal>
+ </entry>
+ <entry>
+ å
许Hibernate使ç¨JDBC2çå¯æ»å¨ç»æé.
+ åªæå¨ä½¿ç¨ç¨æ·æä¾çJDBCè¿æ¥æ¶ï¼è¿ä¸ªé项ææ¯å¿
è¦ç,
+ å¦åHibernateä¼ä½¿ç¨è¿æ¥çå
æ°æ®.
+ <para>
+ <emphasis role="strong">åå¼</emphasis>
+ <literal>true</literal> | <literal>false</literal>
+ </para>
+ </entry>
+ </row>
+ <row>
+ <entry>
+ <literal>hibernate.jdbc.use_streams_for_binary</literal>
+ </entry>
+ <entry>
+ å¨JDBC读å<literal>binary (äºè¿å¶)</literal>æ<literal>serializable (å¯åºåå)</literal>
+ çç±»åæ¶ä½¿ç¨æµ(stream)(ç³»ç»çº§å±æ§).
+ <para>
+ <emphasis role="strong">åå¼</emphasis>
+ <literal>true</literal> | <literal>false</literal>
+ </para>
+ </entry>
+ </row>
+ <row>
+ <entry>
+ <literal>hibernate.jdbc.use_get_generated_keys</literal>
+ </entry>
+ <entry>
+ å¨æ°æ®æå
¥æ°æ®åºä¹åï¼å
许使ç¨JDBC3 <literal>PreparedStatement.getGeneratedKeys()</literal>
+ æ¥è·åæ°æ®åºçæçkey(é®)ãéè¦JDBC3+驱å¨åJRE1.4+, å¦æä½ çæ°æ®åºé©±å¨å¨ä½¿ç¨Hibernateçæ
+ è¯çæå¨æ¶éå°é®é¢ï¼è¯·å°æ¤å¼è®¾ä¸ºfalse. é»è®¤æ
åµä¸å°ä½¿ç¨è¿æ¥çå
æ°æ®æ¥å¤å®é©±å¨çè½å.
+ <para>
+ <emphasis role="strong">åå¼</emphasis>
+ <literal>true|false</literal>
+ </para>
+ </entry>
+ </row>
+ <row>
+ <entry>
+ <literal>hibernate.connection.provider_class</literal>
+ </entry>
+ <entry>
+ èªå®ä¹<literal>ConnectionProvider</literal>çç±»å, æ¤ç±»ç¨æ¥åHibernateæä¾JDBCè¿æ¥.
+ <para>
+ <emphasis role="strong">åå¼</emphasis>
+ <literal>classname.of.ConnectionProvider</literal>
+ </para>
+ </entry>
+ </row>
+ <row>
+ <entry>
+ <literal>hibernate.connection.isolation</literal>
+ </entry>
+ <entry>
+ 设置JDBCäºå¡é离级å«. æ¥ç<literal>java.sql.Connection</literal>æ¥äºè§£å个å¼çå
·ä½æä¹,
+ ä½è¯·æ³¨æå¤æ°æ°æ®åºé½ä¸æ¯æææçé离级å«.
+ <para>
+ <emphasis role="strong">åå¼</emphasis>
+ <literal>1, 2, 4, 8</literal>
+ </para>
+ </entry>
+ </row>
+ <row>
+ <entry>
+ <literal>hibernate.connection.autocommit</literal>
+ </entry>
+ <entry>
+ å
许被ç¼åçJDBCè¿æ¥å¼å¯èªå¨æ交(autocommit) (ä¸å»ºè®®).
+ <para>
+ <emphasis role="strong">åå¼</emphasis>
+ <literal>true</literal> | <literal>false</literal>
+ </para>
+ </entry>
+ </row>
+ <row>
+ <entry>
+ <literal>hibernate.connection.release_mode</literal>
+ </entry>
+ <entry>
+ æå®Hibernateå¨ä½æ¶éæ¾JDBCè¿æ¥. é»è®¤æ
åµä¸,ç´å°Session被æ¾å¼å
³éæ被æå¼è¿æ¥æ¶,æä¼éæ¾JDBCè¿æ¥.
+ 对äºåºç¨ç¨åºæå¡å¨çJTAæ°æ®æº, ä½ åºå½ä½¿ç¨<literal>after_statement</literal>, è¿æ ·å¨æ¯æ¬¡JDBCè°ç¨åï¼é½ä¼ä¸»å¨çéæ¾è¿æ¥.
+ 对äºéJTAçè¿æ¥, 使ç¨<literal>after_transaction</literal>å¨æ¯ä¸ªäºå¡ç»ææ¶éæ¾è¿æ¥æ¯åçç.
+ <literal>auto</literal>å°ä¸ºJTAåCMTäºå¡çç¥éæ©<literal>after_statement</literal>,
+ 为JDBCäºå¡çç¥éæ©<literal>after_transaction</literal>.
+ <para>
+ <emphasis role="strong">åå¼</emphasis>
+ <literal>auto</literal> (é»è®¤) | <literal>on_close</literal> |
+ <literal>after_transaction</literal> | <literal>after_statement</literal>
+ </para>
+ <para>
+
+ 注æ,è¿äºè®¾ç½®ä»
对éè¿<literal>SessionFactory.openSession</literal>å¾å°ç<literal>Session</literal>èµ·ä½ç¨ã对äºéè¿<literal>SessionFactory.getCurrentSession</literal>å¾å°ç<literal>Session</literal>ï¼æé
ç½®ç<literal>CurrentSessionContext</literal>å®ç°æ§å¶è¿äº<literal>Session</literal>çè¿æ¥éæ¾æ¨¡å¼ã请åé
<xref linkend="architecture-current-session"/>ã
+ </para>
+
+
+ </entry>
+ </row>
+ <row>
+ <entry>
+ <literal>hibernate.connection.<emphasis><propertyName></emphasis></literal>
+ </entry>
+ <entry>
+ å°JDBCå±æ§<literal>propertyName</literal>ä¼ éå°<literal>DriverManager.getConnection()</literal>ä¸å».
+ </entry>
+ </row>
+ <row>
+ <entry>
+ <literal>hibernate.jndi.<emphasis><propertyName></emphasis></literal>
+ </entry>
+ <entry>
+ å°å±æ§<literal>propertyName</literal>ä¼ éå°JNDI <literal>InitialContextFactory</literal>ä¸å».
+ </entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </table>
+
+ <table frame="topbot" id="configuration-cache-properties" revision="7">
+ <title>
+ Hibernateç¼åå±æ§
+ </title>
+ <tgroup cols="2">
+ <colspec colname="c1" colwidth="1*"/>
+ <colspec colname="c2" colwidth="1*"/>
+ <thead>
+ <row>
+ <entry>
+ å±æ§å
+ </entry>
+ <entry>
+ ç¨é
+ </entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry>
+ <literal>hibernate.cache.provider_class</literal>
+ </entry>
+ <entry>
+ èªå®ä¹ç<literal>CacheProvider</literal>çç±»å.
+ <para>
+ <emphasis role="strong">åå¼</emphasis>
+ <literal>classname.of.CacheProvider</literal>
+ </para>
+ </entry>
+ </row>
+ <row>
+ <entry>
+ <literal>hibernate.cache.use_minimal_puts</literal>
+ </entry>
+ <entry>
+ 以é¢ç¹ç读æä½ä¸ºä»£ä»·, ä¼åäºçº§ç¼åæ¥æå°ååæä½. å¨Hibernate3ä¸ï¼è¿ä¸ªè®¾ç½®å¯¹çé群ç¼åé常æç¨,
+ 对é群ç¼åçå®ç°èè¨ï¼é»è®¤æ¯å¼å¯ç.
+ <para>
+ <emphasis role="strong">åå¼</emphasis>
+ <literal>true|false</literal>
+ </para>
+ </entry>
+ </row>
+ <row>
+ <entry>
+ <literal>hibernate.cache.use_query_cache</literal>
+ </entry>
+ <entry>
+ å
许æ¥è¯¢ç¼å, 个å«æ¥è¯¢ä»ç¶éè¦è¢«è®¾ç½®ä¸ºå¯ç¼åç.
+ <para>
+ <emphasis role="strong">åå¼</emphasis>
+ <literal>true|false</literal>
+ </para>
+ </entry>
+ </row>
+ <row>
+ <entry>
+ <literal>hibernate.cache.use_second_level_cache</literal>
+ </entry>
+ <entry>
+ è½ç¨æ¥å®å
¨ç¦æ¢ä½¿ç¨äºçº§ç¼å. 对é£äºå¨ç±»çæ å°å®ä¹ä¸æå®<literal><cache></literal>çç±»ï¼ä¼é»è®¤å¼å¯äºçº§ç¼å.
+ <para>
+ <emphasis role="strong">åå¼</emphasis>
+ <literal>true|false</literal>
+ </para>
+ </entry>
+ </row>
+ <row>
+ <entry>
+ <literal>hibernate.cache.query_cache_factory</literal>
+ </entry>
+ <entry>
+ èªå®ä¹å®ç°<literal>QueryCache</literal>æ¥å£çç±»å,
+ é»è®¤ä¸ºå
建ç<literal>StandardQueryCache</literal>.
+ <para>
+ <emphasis role="strong">åå¼</emphasis>
+ <literal>classname.of.QueryCache</literal>
+ </para>
+ </entry>
+ </row>
+ <row>
+ <entry>
+ <literal>hibernate.cache.region_prefix</literal>
+ </entry>
+ <entry>
+ äºçº§ç¼ååºååçåç¼.
+ <para>
+ <emphasis role="strong">åå¼</emphasis>
+ <literal>prefix</literal>
+ </para>
+ </entry>
+ </row>
+ <row>
+ <entry>
+ <literal>hibernate.cache.use_structured_entries</literal>
+ </entry>
+ <entry>
+ 强å¶Hibernate以æ´äººæ§åçæ ¼å¼å°æ°æ®åå
¥äºçº§ç¼å.
+ <para>
+ <emphasis role="strong">åå¼</emphasis>
+ <literal>true|false</literal>
+ </para>
+ </entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </table>
+
+ <table frame="topbot" id="configuration-transaction-properties" revision="9">
+ <title>
+ Hibernateäºå¡å±æ§
+ </title>
+ <tgroup cols="2">
+ <colspec colname="c1" colwidth="1*"/>
+ <colspec colname="c2" colwidth="1*"/>
+ <thead>
+ <row>
+ <entry>
+ å±æ§å
+ </entry>
+ <entry>
+ ç¨é
+ </entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry>
+ <literal>hibernate.transaction.factory_class</literal>
+ </entry>
+ <entry>
+ ä¸ä¸ª<literal>TransactionFactory</literal>çç±»å, ç¨äºHibernate <literal>Transaction</literal> API
+ (é»è®¤ä¸º<literal>JDBCTransactionFactory</literal>).
+ <para>
+ <emphasis role="strong">åå¼</emphasis>
+ <literal>classname.of.TransactionFactory</literal>
+ </para>
+ </entry>
+ </row>
+ <row>
+ <entry>
+ <literal>jta.UserTransaction</literal>
+ </entry>
+ <entry>
+ ä¸ä¸ªJNDIååï¼è¢«<literal>JTATransactionFactory</literal>ç¨æ¥ä»åºç¨æå¡å¨è·åJTA <literal>UserTransaction</literal>.
+ <para>
+ <emphasis role="strong">åå¼</emphasis>
+ <literal>jndi/composite/name</literal>
+ </para>
+ </entry>
+ </row>
+ <row>
+ <entry>
+ <literal>hibernate.transaction.manager_lookup_class</literal>
+ </entry>
+ <entry>
+ ä¸ä¸ª<literal>TransactionManagerLookup</literal>çç±»å
+ - å½ä½¿ç¨JVM级ç¼åï¼æå¨JTAç¯å¢ä¸ä½¿ç¨hiloçæå¨çæ¶åéè¦è¯¥ç±».
+ <para>
+ <emphasis role="strong">åå¼</emphasis>
+ <literal>classname.of.TransactionManagerLookup</literal>
+ </para>
+ </entry>
+ </row>
+ <row>
+ <entry>
+ <literal>hibernate.transaction.flush_before_completion</literal>
+ </entry>
+ <entry>
+ å¦æå¼å¯, sessionå¨äºå¡å®æåå°è¢«èªå¨æ¸
æ´(flush)ã ç°å¨æ´å¥½çæ¹æ³æ¯ä½¿ç¨èªå¨sessionä¸ä¸æ管çã请åè§<xref linkend="architecture-current-session"/>ã
+ <para>
+ <emphasis role="strong">åå¼</emphasis>
+ <literal>true</literal> | <literal>false</literal>
+ </para>
+ </entry>
+ </row>
+ <row>
+ <entry>
+ <literal>hibernate.transaction.auto_close_session</literal>
+ </entry>
+ <entry>
+ å¦æå¼å¯, sessionå¨äºå¡å®æåå°è¢«èªå¨å
³éã ç°å¨æ´å¥½çæ¹æ³æ¯ä½¿ç¨èªå¨sessionä¸ä¸æ管çã请åè§<xref linkend="architecture-current-session"/>ã
+ <para>
+ <emphasis role="strong">åå¼</emphasis>
+ <literal>true</literal> | <literal>false</literal>
+ </para>
+ </entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </table>
+
+ <table frame="topbot" id="configuration-misc-properties" revision="10">
+ <title>
+ å
¶ä»å±æ§
+ </title>
+
+ <tgroup cols="2">
+ <colspec colname="c1" colwidth="1*"/>
+ <colspec colname="c2" colwidth="1*"/>
+ <thead>
+ <row>
+ <entry>
+ å±æ§å
+ </entry>
+ <entry>
+ ç¨é
+ </entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry>
+ <literal>hibernate.current_session_context_class</literal>
+ </entry>
+ <entry>
+ 为"å½å"
+ <literal>Session</literal>æå®ä¸ä¸ª(èªå®ä¹ç)çç¥ãå
³äºå
ç½®çç¥ç详æ
ï¼è¯·åè§<xref linkend="architecture-current-session"/> ã
+ <para>
+ <emphasis role="strong">eg.</emphasis>
+ <literal>jta</literal> | <literal>thread</literal> |
+ <literal>managed</literal> | <literal>custom.Class</literal>
+ </para>
+ </entry>
+ </row>
+ <row>
+ <entry>
+ <literal>hibernate.query.factory_class</literal>
+ </entry>
+ <entry>
+ éæ©HQL解æå¨çå®ç°.
+ <para>
+ <emphasis role="strong">åå¼</emphasis>
+ <literal>org.hibernate.hql.ast.ASTQueryTranslatorFactory</literal> or
+ <literal>org.hibernate.hql.classic.ClassicQueryTranslatorFactory</literal>
+ </para>
+ </entry>
+ </row>
+ <row>
+ <entry>
+ <literal>hibernate.query.substitutions</literal>
+ </entry>
+ <entry>
+ å°Hibernateæ¥è¯¢ä¸ç符å·æ å°å°SQLæ¥è¯¢ä¸ç符å·
+ (符å·å¯è½æ¯å½æ°åæ常éåå).
+ <para>
+ <emphasis role="strong">åå¼</emphasis>
+ <literal>hqlLiteral=SQL_LITERAL, hqlFunction=SQLFUNC</literal>
+ </para>
+ </entry>
+ </row>
+ <row>
+ <entry>
+ <literal>hibernate.hbm2ddl.auto</literal>
+ </entry>
+ <entry>
+ å¨<literal>SessionFactory</literal>å建æ¶ï¼èªå¨æ£æ¥æ°æ®åºç»æï¼æè
å°æ°æ®åºschemaçDDL导åºå°æ°æ®åº. 使ç¨
+ <literal>create-drop</literal>æ¶,å¨æ¾å¼å
³é<literal>SessionFactory</literal>æ¶ï¼å°dropææ°æ®åºschema.
+ <para>
+ <emphasis role="strong">åå¼</emphasis>
+ <literal>validate</literal> | <literal>update</literal> |
+ <literal>create</literal> | <literal>create-drop</literal>
+ </para>
+ </entry>
+ </row>
+ <row>
+ <entry>
+ <literal>hibernate.cglib.use_reflection_optimizer</literal>
+ </entry>
+ <entry>
+ å¼å¯CGLIBæ¥æ¿ä»£è¿è¡æ¶åå°æºå¶(ç³»ç»çº§å±æ§). åå°æºå¶ææ¶å¨é¤éæ¶æ¯è¾æç¨.
+ 注æå³ä½¿å
³éè¿ä¸ªä¼å, Hibernateè¿æ¯éè¦CGLIB. ä½ ä¸è½å¨<literal>hibernate.cfg.xml</literal>ä¸è®¾ç½®æ¤å±æ§.
+ <para>
+ <emphasis role="strong">åå¼</emphasis>
+ <literal>true</literal> | <literal>false</literal>
+ </para>
+ </entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </table>
+
+ <sect2 id="configuration-optional-dialects" revision="1">
+ <title>
+ SQLæ¹è¨
+ </title>
+
+ <para>
+ ä½ åºå½æ»æ¯ä¸ºä½ çæ°æ®åºå°<literal>hibernate.dialect</literal>å±æ§è®¾ç½®ææ£ç¡®ç
+ <literal>org.hibernate.dialect.Dialect</literal>åç±». å¦æä½ æå®ä¸ç§æ¹è¨,
+ Hibernateå°ä¸ºä¸é¢ååºçä¸äºå±æ§ä½¿ç¨åççé»è®¤å¼, ä¸ºä½ çå»äºæå·¥æå®å®ä»¬çå夫.
+ </para>
+
+ <table frame="topbot" id="sql-dialects" revision="2">
+ <title>
+ Hibernate SQLæ¹è¨ (<literal>hibernate.dialect</literal>)
+ </title>
+ <tgroup cols="2">
+ <colspec colwidth="1*"/>
+ <colspec colwidth="2.5*"/>
+ <thead>
+ <row>
+ <entry>RDBMS</entry>
+ <entry>
+ æ¹è¨
+ </entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry>DB2</entry> <entry><literal>org.hibernate.dialect.DB2Dialect</literal></entry>
+ </row>
+ <row>
+ <entry>DB2 AS/400</entry> <entry><literal>org.hibernate.dialect.DB2400Dialect</literal></entry>
+ </row>
+ <row>
+ <entry>DB2 OS390</entry> <entry><literal>org.hibernate.dialect.DB2390Dialect</literal></entry>
+ </row>
+ <row>
+ <entry>PostgreSQL</entry> <entry><literal>org.hibernate.dialect.PostgreSQLDialect</literal></entry>
+ </row>
+ <row>
+ <entry>MySQL</entry> <entry><literal>org.hibernate.dialect.MySQLDialect</literal></entry>
+ </row>
+ <row>
+ <entry>MySQL with InnoDB</entry> <entry><literal>org.hibernate.dialect.MySQLInnoDBDialect</literal></entry>
+ </row>
+ <row>
+ <entry>MySQL with MyISAM</entry> <entry><literal>org.hibernate.dialect.MySQLMyISAMDialect</literal></entry>
+ </row>
+ <row>
+ <entry>Oracle (any version)</entry> <entry><literal>org.hibernate.dialect.OracleDialect</literal></entry>
+ </row>
+ <row>
+ <entry>Oracle 9i/10g</entry> <entry><literal>org.hibernate.dialect.Oracle9Dialect</literal></entry>
+ </row>
+ <row>
+ <entry>Sybase</entry> <entry><literal>org.hibernate.dialect.SybaseDialect</literal></entry>
+ </row>
+ <row>
+ <entry>Sybase Anywhere</entry> <entry><literal>org.hibernate.dialect.SybaseAnywhereDialect</literal></entry>
+ </row>
+ <row>
+ <entry>Microsoft SQL Server</entry> <entry><literal>org.hibernate.dialect.SQLServerDialect</literal></entry>
+ </row>
+ <row>
+ <entry>SAP DB</entry> <entry><literal>org.hibernate.dialect.SAPDBDialect</literal></entry>
+ </row>
+ <row>
+ <entry>Informix</entry> <entry><literal>org.hibernate.dialect.InformixDialect</literal></entry>
+ </row>
+ <row>
+ <entry>HypersonicSQL</entry> <entry><literal>org.hibernate.dialect.HSQLDialect</literal></entry>
+ </row>
+ <row>
+ <entry>Ingres</entry> <entry><literal>org.hibernate.dialect.IngresDialect</literal></entry>
+ </row>
+ <row>
+ <entry>Progress</entry> <entry><literal>org.hibernate.dialect.ProgressDialect</literal></entry>
+ </row>
+ <row>
+ <entry>Mckoi SQL</entry> <entry><literal>org.hibernate.dialect.MckoiDialect</literal></entry>
+ </row>
+ <row>
+ <entry>Interbase</entry> <entry><literal>org.hibernate.dialect.InterbaseDialect</literal></entry>
+ </row>
+ <row>
+ <entry>Pointbase</entry> <entry><literal>org.hibernate.dialect.PointbaseDialect</literal></entry>
+ </row>
+ <row>
+ <entry>FrontBase</entry> <entry><literal>org.hibernate.dialect.FrontbaseDialect</literal></entry>
+ </row>
+ <row>
+ <entry>Firebird</entry> <entry><literal>org.hibernate.dialect.FirebirdDialect</literal></entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </table>
+
+ </sect2>
+
+ <sect2 id="configuration-optional-outerjoin" revision="4">
+ <title>
+ å¤è¿æ¥æå(Outer Join Fetching)
+ </title>
+
+ <para>
+ å¦æä½ çæ°æ®åºæ¯æANSI, OracleæSybaseé£æ ¼çå¤è¿æ¥, <emphasis>å¤è¿æ¥æå</emphasis>é常è½éè¿éå¶å¾è¿æ°æ®åºæ¬¡æ°
+ (æ´å¤çå·¥ä½äº¤ç±æ°æ®åºèªå·±æ¥å®æ)æ¥æé«æç. å¤è¿æ¥æåå
许å¨å个<literal>SELECT</literal>SQLè¯å¥ä¸ï¼
+ éè¿many-to-one, one-to-many, many-to-manyåone-to-oneå
³èè·åè¿æ¥å¯¹è±¡çæ´ä¸ªå¯¹è±¡å¾.
+ </para>
+
+ <para>
+ å°<literal>hibernate.max_fetch_depth</literal>设为<literal>0</literal>è½å¨<emphasis>å
¨å±</emphasis>
+ èå´å
ç¦æ¢å¤è¿æ¥æå. 设为<literal>1</literal>ææ´é«å¼è½å¯ç¨one-to-oneåmany-to-oneouterå
³èçå¤è¿æ¥æå, å®ä»¬éè¿
+ <literal>fetch="join"</literal>æ¥æ å°.
+ </para>
+
+ <para>
+ åè§<xref linkend="performance-fetching"/>è·å¾æ´å¤ä¿¡æ¯.
+ </para>
+
+ </sect2>
+
+ <sect2 id="configuration-optional-binarystreams" revision="1">
+ <title>
+ äºè¿å¶æµ (Binary Streams)
+ </title>
+
+ <para>
+ Oracleéå¶é£äºéè¿JDBC驱å¨ä¼ è¾ç<literal>åè</literal>æ°ç»çæ°ç®. å¦æä½ å¸æ使ç¨<literal>äºè¿å¼ (binary)</literal>æ
+ <literal>å¯åºååç (serializable)</literal>ç±»åç大对象, ä½ åºè¯¥å¼å¯
+ <literal>hibernate.jdbc.use_streams_for_binary</literal>å±æ§.
+ <emphasis>è¿æ¯ç³»ç»çº§å±æ§.</emphasis>
+ </para>
+
+ </sect2>
+
+ <sect2 id="configuration-optional-cacheprovider" revision="2">
+ <title>
+ äºçº§ç¼åä¸æ¥è¯¢ç¼å
+ </title>
+
+ <para>
+ 以<literal>hibernate.cache</literal>为åç¼çå±æ§å
è®¸ä½ å¨Hibernateä¸ï¼ä½¿ç¨è¿ç¨æ群éèå´å
çäºçº§ç¼åç³»ç».
+ åè§<xref linkend="performance-cache"/>è·åæ´å¤ç详æ
.
+ </para>
+
+ </sect2>
+
+ <sect2 id="configuration-optional-querysubstitution">
+ <title>
+ æ¥è¯¢è¯è¨ä¸çæ¿æ¢
+ </title>
+
+ <para>
+ ä½ å¯ä»¥ä½¿ç¨<literal>hibernate.query.substitutions</literal>å¨Hibernateä¸å®ä¹æ°çæ¥è¯¢ç¬¦å·.
+ ä¾å¦:
+ </para>
+
+ <programlisting>hibernate.query.substitutions true=1, false=0</programlisting>
+
+ <para>
+ å°å¯¼è´ç¬¦å·<literal>true</literal>å<literal>false</literal>å¨çæçSQLä¸è¢«ç¿»è¯ææ´æ°å¸¸é.
+ </para>
+
+ <programlisting>hibernate.query.substitutions toLowercase=LOWER</programlisting>
+
+ <para>
+ å°å
è®¸ä½ éå½åSQLä¸ç<literal>LOWER</literal>å½æ°.
+ </para>
+
+ </sect2>
+
+ <sect2 id="configuration-optional-statistics" revision="2">
+ <title>
+ Hibernateçç»è®¡(statistics)æºå¶
+ </title>
+
+ <para>
+ å¦æä½ å¼å¯<literal>hibernate.generate_statistics</literal>, é£ä¹å½ä½ éè¿
+ <literal>SessionFactory.getStatistics()</literal>è°æ´æ£å¨è¿è¡çç³»ç»æ¶ï¼Hibernateå°å¯¼åºå¤§éæç¨çæ°æ®.
+ Hibernateçè³è½è¢«é
ç½®æéè¿JMX导åºè¿äºç»è®¡ä¿¡æ¯. åè<literal>org.hibernate.stats</literal>ä¸æ¥å£çJavadocï¼ä»¥è·å¾æ´å¤ä¿¡æ¯.
+ </para>
+
+ </sect2>
+ </sect1>
+
+ <sect1 id="configuration-logging">
+ <title>
+ æ¥å¿
+ </title>
+
+ <para>
+ Hibernate使ç¨Apache commons-loggingæ¥ä¸ºåç§äºä»¶è®°å½æ¥å¿.
+ </para>
+
+ <para>
+ commons-loggingå°ç´æ¥è¾åºå°Apache Log4j(å¦æå¨ç±»è·¯å¾ä¸å
æ¬<literal>log4j.jar</literal>)æ
+ JDK1.4 logging (å¦æè¿è¡å¨JDK1.4æ以ä¸çç¯å¢ä¸). ä½ å¯ä»¥ä»<literal>http://jakarta.apache.org</literal>
+ ä¸è½½Log4j. è¦ä½¿ç¨Log4jï¼ä½ éè¦å°<literal>log4j.properties</literal>æ件æ¾ç½®å¨ç±»è·¯å¾ä¸, éHibernate
+ ä¸åååçæ ·ä¾å±æ§æ件å¨<literal>src/</literal>ç®å½ä¸.
+ </para>
+
+ <para>
+ æ们强çå»ºè®®ä½ çæä¸ä¸Hibernateçæ¥å¿æ¶æ¯. å¨ä¸å¤±å¯è¯»æ§çåæä¸ï¼
+ æ们åäºå¾å¤å·¥ä½ï¼ä½¿Hibernateçæ¥å¿å¯è½å°è¯¦ç». è¿æ¯å¿
è¦çæ¥éå©å¨.
+ æ令人æå
´è¶£çæ¥å¿åç±»æå¦ä¸è¿äº:
+ </para>
+
+ <table frame="topbot" id="log-categories" revision="2">
+ <title>
+ Hibernateæ¥å¿ç±»å«
+ </title>
+ <tgroup cols="2">
+ <colspec colwidth="1*"/>
+ <colspec colwidth="2.5*"/>
+ <thead>
+ <row>
+ <entry>
+ ç±»å«
+ </entry>
+ <entry>
+ åè½
+ </entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry><literal>org.hibernate.SQL</literal></entry>
+ <entry>
+ å¨ææSQL DMLè¯å¥è¢«æ§è¡æ¶ä¸ºå®ä»¬è®°å½æ¥å¿
+ </entry>
+ </row>
+ <row>
+ <entry><literal>org.hibernate.type</literal></entry>
+ <entry>
+ 为ææJDBCåæ°è®°å½æ¥å¿
+ </entry>
+ </row>
+ <row>
+ <entry><literal>org.hibernate.tool.hbm2ddl</literal></entry>
+ <entry>
+ å¨ææSQL DDLè¯å¥æ§è¡æ¶ä¸ºå®ä»¬è®°å½æ¥å¿
+ </entry>
+ </row>
+ <row>
+ <entry><literal>org.hibernate.pretty</literal></entry>
+ <entry>
+ å¨sessionæ¸
æ´(flush)æ¶ï¼ä¸ºææä¸å
¶å
³èçå®ä½(æå¤20个)çç¶æè®°å½æ¥å¿
+ </entry>
+ </row>
+ <row>
+ <entry><literal>org.hibernate.cache</literal></entry>
+ <entry>
+ 为ææäºçº§ç¼åçæ´»å¨è®°å½æ¥å¿
+ </entry>
+ </row>
+ <row>
+ <entry><literal>org.hibernate.transaction</literal></entry>
+ <entry>
+ 为äºå¡ç¸å
³çæ´»å¨è®°å½æ¥å¿
+ </entry>
+ </row>
+ <row>
+ <entry><literal>org.hibernate.jdbc</literal></entry>
+ <entry>
+ 为ææJDBCèµæºçè·åè®°å½æ¥å¿
+ </entry>
+ </row>
+ <row>
+ <entry><literal>org.hibernate.hql.AST</literal></entry>
+ <entry>
+ å¨è§£ææ¥è¯¢çæ¶å,è®°å½HQLåSQLçASTåææ¥å¿
+ </entry>
+ </row>
+ <row>
+ <entry><literal>org.hibernate.secure</literal></entry>
+ <entry>
+ 为JAAS认è¯è¯·æ±åæ¥å¿
+ </entry>
+ </row>
+ <row>
+ <entry><literal>org.hibernate</literal></entry>
+ <entry>
+ 为任ä½Hibernateç¸å
³ä¿¡æ¯åæ¥å¿ (ä¿¡æ¯éè¾å¤§, ä½å¯¹æ¥éé常æ帮å©)
+ </entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </table>
+
+ <para>
+ å¨ä½¿ç¨Hibernateå¼ååºç¨ç¨åºæ¶, ä½ åºå½æ»æ¯ä¸º<literal>org.hibernate.SQL</literal>
+ å¼å¯<literal>debug</literal>级å«çæ¥å¿è®°å½,æè
å¼å¯<literal>hibernate.show_sql</literal>å±æ§ã
+ </para>
+
+ </sect1>
+
+ <sect1 id="configuration-namingstrategy">
+ <title>
+ å®ç°<literal>NamingStrategy</literal>
+ </title>
+
+ <para>
+ <literal>org.hibernate.cfg.NamingStrategy</literal>æ¥å£å
è®¸ä½ ä¸ºæ°æ®åºä¸ç对象åschema
+ å
ç´ æå®ä¸ä¸ªâå½åæ åâ.
+ </para>
+
+ <para>
+ ä½ å¯è½ä¼æä¾ä¸äºéè¿Javaæ è¯çææ°æ®åºæ è¯æå°æ å°å®ä¹æ件ä¸"é»è¾"表/ååå¤çæ"ç©ç"表/ååçè§å.
+ è¿ä¸ªç¹æ§æå©äºåå°åé¿çæ å°å®ä¹æ件.
+ </para>
+
+ <para>
+ å¨å å
¥æ å°å®ä¹åï¼ä½ å¯ä»¥è°ç¨
+ <literal>Configuration.setNamingStrategy()</literal>æå®ä¸ä¸ªä¸åçå½åçç¥:
+ </para>
+
+ <programlisting><![CDATA[SessionFactory sf = new Configuration()
+ .setNamingStrategy(ImprovedNamingStrategy.INSTANCE)
+ .addFile("Item.hbm.xml")
+ .addFile("Bid.hbm.xml")
+ .buildSessionFactory();]]></programlisting>
+
+ <para>
+ <literal>org.hibernate.cfg.ImprovedNamingStrategy</literal>æ¯ä¸ä¸ªå
建çå½åçç¥, 对
+ ä¸äºåºç¨ç¨åºèè¨ï¼å¯è½æ¯é常æç¨çèµ·ç¹.
+ </para>
+
+ </sect1>
+
+ <sect1 id="configuration-xmlconfig" revision="2">
+ <title>
+ XMLé
ç½®æ件
+ </title>
+
+ <para>
+ å¦ä¸ä¸ªé
ç½®æ¹æ³æ¯å¨<literal>hibernate.cfg.xml</literal>æ件ä¸æå®ä¸å¥å®æ´çé
ç½®.
+ è¿ä¸ªæ件å¯ä»¥å½æ<literal>hibernate.properties</literal>çæ¿ä»£ã è¥ä¸¤ä¸ªæ件åæ¶åå¨ï¼å®å°è¦çåè
çå±æ§.
+ </para>
+
+ <para>
+ XMLé
ç½®æ件被é»è®¤æ¯æ¾å¨<literal>CLASSPATH</literal>çæ ¹ç®å½ä¸. è¿æ¯ä¸ä¸ªä¾å:
+ </para>
+ <para>
+
+ </para>
+
+ <programlisting><![CDATA[<?xml version='1.0' encoding='utf-8'?>
+<!DOCTYPE hibernate-configuration PUBLIC
+ "-//Hibernate/Hibernate Configuration DTD//EN"
+ "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
+
+<hibernate-configuration>
+
+ <!-- 以/jndi/nameç»å®å°JNDIçSessionFactoryå®ä¾ -->
+ <session-factory
+ name="java:hibernate/SessionFactory">
+
+ <!-- å±æ§ -->
+ <property name="connection.datasource">java:/comp/env/jdbc/MyDB</property>
+ <property name="dialect">org.hibernate.dialect.MySQLDialect</property>
+ <property name="show_sql">false</property>
+ <property name="transaction.factory_class">
+ org.hibernate.transaction.JTATransactionFactory
+ </property>
+ <property name="jta.UserTransaction">java:comp/UserTransaction</property>
+
+ <!-- æ å°å®ä¹æ件 -->
+ <mapping resource="org/hibernate/auction/Item.hbm.xml"/>
+ <mapping resource="org/hibernate/auction/Bid.hbm.xml"/>
+
+ <!-- ç¼å设置 -->
+ <class-cache class="org.hibernate.auction.Item" usage="read-write"/>
+ <class-cache class="org.hibernate.auction.Bid" usage="read-only"/>
+ <collection-cache collection="org.hibernate.auction.Item.bids" usage="read-write"/>
+
+ </session-factory>
+
+</hibernate-configuration>]]></programlisting>
+
+ <para>
+ å¦ä½ æè§, è¿ä¸ªæ¹æ³ä¼å¿å¨äºï¼å¨é
ç½®æ件ä¸æåºäºæ å°å®ä¹æ件çåå. ä¸æ¦ä½ éè¦è°æ´Hibernateçç¼åï¼
+ <literal>hibernate.cfg.xml</literal>ä¹æ¯æ´æ¹ä¾¿. 注æï¼ä½¿ç¨<literal>hibernate.properties</literal>è¿æ¯
+ <literal>hibernate.cfg.xml</literal>å®å
¨æ¯ç±ä½ æ¥å³å®, é¤äºä¸é¢æå°çXMLè¯æ³çä¼å¿ä¹å¤, 两è
æ¯çä»·ç.
+ </para>
+
+ <para>
+ 使ç¨XMLé
ç½®ï¼ä½¿å¾å¯å¨Hibernateåçå¼å¸¸ç®å, å¦ä¸æ示ï¼ä¸è¡ä»£ç å°±å¯ä»¥æå®ï¼
+ </para>
+
+ <programlisting><![CDATA[SessionFactory sf = new Configuration().configure().buildSessionFactory();]]></programlisting>
+
+ <para>
+ ä½ å¯ä»¥ä½¿ç¨å¦ä¸ä»£ç æ¥æ·»å ä¸ä¸ªä¸åçXMLé
ç½®æ件
+ </para>
+
+ <programlisting><![CDATA[SessionFactory sf = new Configuration()
+ .configure("catdb.cfg.xml")
+ .buildSessionFactory();]]></programlisting>
+
+ </sect1>
+
+ <sect1 id="configuration-j2ee" revision="1">
+ <title>
+ J2EEåºç¨ç¨åºæå¡å¨çéæ
+ </title>
+
+ <para>
+ é对J2EEä½ç³»,Hibernateæå¦ä¸å 个éæçæ¹é¢:
+ </para>
+
+ <itemizedlist>
+ <listitem>
+ <para>
+ <emphasis>容å¨ç®¡ççæ°æ®æº(Container-managed datasources)</emphasis>:
+ Hibernateè½ä½¿ç¨éè¿å®¹å¨ç®¡çï¼å¹¶ç±JNDIæä¾çJDBCè¿æ¥. é常, ç¹å«æ¯å½å¤çå¤ä¸ªæ°æ®æºçåå¸å¼äºå¡çæ¶å,
+ ç±ä¸ä¸ªJTAå
¼å®¹ç<literal>TransactionManager</literal>åä¸ä¸ª
+ <literal>ResourceManager</literal>æ¥å¤çäºå¡ç®¡ç(CMT, 容å¨ç®¡ççäºå¡). å½ç¶ä½ å¯ä»¥éè¿
+ ç¼ç¨æ¹å¼æ¥ååäºå¡è¾¹ç(BMT, Bean管ççäºå¡). æè
为äºä»£ç çå¯ç§»æ¤æ§ï¼ä½ ä¹ä¹è®¸ä¼æ³ä½¿ç¨å¯éç
+ Hibernate <literal>Transaction</literal> API.
+ </para>
+ </listitem>
+ </itemizedlist>
+
+ <itemizedlist>
+ <listitem>
+ <para>
+ <emphasis>èªå¨JNDIç»å®</emphasis>: Hibernateå¯ä»¥å¨å¯å¨åå°
+ <literal>SessionFactory</literal>ç»å®å°JNDI.
+ </para>
+ </listitem>
+ </itemizedlist>
+
+ <itemizedlist>
+ <listitem>
+ <para>
+ <emphasis>JTA Sessionç»å®:</emphasis> Hibernate <literal>Session</literal>
+ å¯ä»¥èªå¨ç»å®å°JTAäºå¡ä½ç¨çèå´. åªéç®åå°ä»JNDIæ¥æ¾<literal>SessionFactory</literal>并è·å¾å½åç
+ <literal>Session</literal>. å½JTAäºå¡å®ææ¶, 让Hibernateæ¥å¤ç
+ <literal>Session</literal>çæ¸
æ´(flush)ä¸å
³é. äºå¡çååå¯ä»¥æ¯å£°æå¼ç(CMT),ä¹å¯ä»¥æ¯ç¼ç¨å¼ç(BMT/UserTransaction).
+ </para>
+ </listitem>
+ </itemizedlist>
+
+ <itemizedlist>
+ <listitem>
+ <para>
+ <emphasis>JMXé¨ç½²:</emphasis> å¦æä½ ä½¿ç¨æ¯æJMXåºç¨ç¨åºæå¡å¨(å¦, JBoss AS), é£ä¹ä½ å¯ä»¥éæ©å°Hibernateé¨ç½²ææ管MBean.
+ è¿å°ä¸ºä½ çå»ä¸è¡ä»<literal>Configuration</literal>æ建<literal>SessionFactory</literal>çå¯å¨ä»£ç .
+ 容å¨å°å¯å¨ä½ ç<literal>HibernateService</literal>, 并å®ç¾å°å¤ç好æå¡é´çä¾èµå
³ç³» (å¨Hibernateå¯å¨åï¼æ°æ®æºå¿
é¡»æ¯å¯ç¨çï¼çç).
+ </para>
+ </listitem>
+ </itemizedlist>
+ <para>
+ å¦æåºç¨ç¨åºæå¡å¨æåº"connection containment"å¼å¸¸, æ ¹æ®ä½ çç¯å¢ï¼ä¹è®¸è¯¥å°é
ç½®å±æ§
+ <literal>hibernate.connection.release_mode</literal>设为<literal>after_statement</literal>.
+ </para>
+ <sect2 id="configuration-optional-transactionstrategy" revision="3">
+ <title>
+ äºå¡çç¥é
ç½®
+ </title>
+
+ <para>
+ å¨ä½ çæ¶æä¸ï¼Hibernateç<literal>Session</literal> APIæ¯ç¬ç«äºä»»ä½äºå¡åçç³»ç»ç.
+ å¦æä½ è®©Hibernateéè¿è¿æ¥æ± ç´æ¥ä½¿ç¨JDBC, ä½ éè¦è°ç¨JDBC APIæ¥æå¼åå
³éä½ çäºå¡.
+ å¦æä½ è¿è¡å¨J2EEåºç¨ç¨åºæå¡å¨ä¸, ä½ ä¹è®¸æ³ç¨Bean管ççäºå¡å¹¶å¨éè¦çæ¶åè°ç¨JTA APIå<literal>UserTransaction</literal>.
+ </para>
+
+ <para>
+ 为äºè®©ä½ ç代ç å¨ä¸¤ç§(æå
¶ä»)ç¯å¢ä¸å¯ä»¥ç§»æ¤ï¼æ们建议使ç¨å¯éçHibernate <literal>Transaction</literal> API,
+ å®å
è£
并éèäºåºå±ç³»ç». ä½ å¿
é¡»éè¿è®¾ç½®Hibernateé
ç½®å±æ§<literal>hibernate.transaction.factory_class</literal>æ¥æå®
+ ä¸ä¸ª<literal>Transaction</literal>å®ä¾çå·¥åç±».
+ </para>
+
+ <para>
+ æä¸ä¸ªæ å(å
建)çéæ©:
+ </para>
+
+ <variablelist spacing="compact">
+ <varlistentry>
+ <term><literal>org.hibernate.transaction.JDBCTransactionFactory</literal></term>
+ <listitem>
+ <para>
+ å§æç»æ°æ®åº(JDBC)äºå¡ï¼é»è®¤ï¼
+ </para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term><literal>org.hibernate.transaction.JTATransactionFactory</literal></term>
+ <listitem>
+ <para>
+ å¦æå¨ä¸ä¸æç¯å¢ä¸åå¨è¿è¡ççäºå¡(å¦, EJBä¼è¯Beançæ¹æ³), åå§æç»å®¹å¨ç®¡
+ ççäºå¡, å¦åï¼å°å¯å¨ä¸ä¸ªæ°çäºå¡ï¼å¹¶ä½¿ç¨Bean管ççäºå¡.
+ </para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term><literal>org.hibernate.transaction.CMTTransactionFactory</literal></term>
+ <listitem>
+ <para>
+ å§æç»å®¹å¨ç®¡ççJTAäºå¡
+ </para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+
+ <para>
+ ä½ ä¹å¯ä»¥å®ä¹å±äºä½ èªå·±çäºå¡çç¥ (å¦, é对CORBAçäºå¡æå¡)
+ </para>
+
+ <para>
+ Hibernateçä¸äºç¹æ§ (æ¯å¦äºçº§ç¼å, Contextual Sessions with JTAçç)éè¦è®¿é®å¨æ管ç¯å¢ä¸çJTA <literal>TransactionManager</literal>.
+ ç±äºJ2EE没ææ ååä¸ä¸ªåä¸çæºå¶,Hibernateå¨åºç¨ç¨åºæå¡å¨ä¸ï¼ä½ å¿
é¡»æå®Hibernateå¦ä½è·å¾<literal>TransactionManager</literal>çå¼ç¨:
+ </para>
+
+ <table frame="topbot" id="jtamanagerlookup" revision="1">
+ <title>JTA TransactionManagers</title>
+ <tgroup cols="2">
+ <colspec colwidth="2.5*"/>
+ <colspec colwidth="1*"/>
+ <thead>
+ <row>
+ <entry>
+ Transactionå·¥åç±»
+ </entry>
+ <entry align="center">
+ åºç¨ç¨åºæå¡å¨
+ </entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry><literal>org.hibernate.transaction.JBossTransactionManagerLookup</literal></entry>
+ <entry align="center">JBoss</entry>
+ </row>
+ <row>
+ <entry><literal>org.hibernate.transaction.WeblogicTransactionManagerLookup</literal></entry>
+ <entry align="center">Weblogic</entry>
+ </row>
+ <row>
+ <entry><literal>org.hibernate.transaction.WebSphereTransactionManagerLookup</literal></entry>
+ <entry align="center">WebSphere</entry>
+ </row>
+ <row>
+ <entry><literal>org.hibernate.transaction.WebSphereExtendedJTATransactionLookup</literal></entry>
+ <entry align="center">WebSphere 6</entry>
+ </row>
+ <row>
+ <entry><literal>org.hibernate.transaction.OrionTransactionManagerLookup</literal></entry>
+ <entry align="center">Orion</entry>
+ </row>
+ <row>
+ <entry><literal>org.hibernate.transaction.ResinTransactionManagerLookup</literal></entry>
+ <entry align="center">Resin</entry>
+ </row>
+ <row>
+ <entry><literal>org.hibernate.transaction.JOTMTransactionManagerLookup</literal></entry>
+ <entry align="center">JOTM</entry>
+ </row>
+ <row>
+ <entry><literal>org.hibernate.transaction.JOnASTransactionManagerLookup</literal></entry>
+ <entry align="center">JOnAS</entry>
+ </row>
+ <row>
+ <entry><literal>org.hibernate.transaction.JRun4TransactionManagerLookup</literal></entry>
+ <entry align="center">JRun4</entry>
+ </row>
+ <row>
+ <entry><literal>org.hibernate.transaction.BESTransactionManagerLookup</literal></entry>
+ <entry align="center">Borland ES</entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </table>
+
+ </sect2>
+
+ <sect2 id="configuration-optional-jndi" revision="3">
+ <title>
+ JNDIç»å®ç<literal>SessionFactory</literal>
+ </title>
+
+
+ <para>
+ ä¸JNDIç»å®çHibernateç<literal>SessionFactory</literal>è½ç®åå·¥åçæ¥è¯¢ï¼ç®åå建æ°ç<literal>Session</literal>.
+ éè¦æ³¨æçæ¯è¿ä¸JNDIç»å®<literal>Datasource</literal>没æå
³ç³», å®ä»¬åªæ¯æ°å·§ç¨äºç¸åç注å表!
+ </para>
+
+ <para>
+ å¦æä½ å¸æå°<literal>SessionFactory</literal>ç»å®å°ä¸ä¸ªJNDIçåå空é´,
+ ç¨å±æ§<literal>hibernate.session_factory_name</literal>æå®ä¸ä¸ªåå(å¦, <literal>java:hibernate/SessionFactory</literal>).
+ å¦æä¸è®¾ç½®è¿ä¸ªå±æ§, <literal>SessionFactory</literal>å°ä¸ä¼è¢«ç»å®å°JNDIä¸. (å¨ä»¥åªè¯»JNDI为é»è®¤å®ç°çç¯å¢ä¸ï¼è¿ä¸ªè®¾ç½®å°¤å
¶æç¨, å¦Tomcat.)
+ </para>
+
+ <para>
+ å¨å°<literal>SessionFactory</literal>ç»å®è³JNDIæ¶, Hibernateå°ä½¿ç¨<literal>hibernate.jndi.url</literal>,
+ å<literal>hibernate.jndi.class</literal>çå¼æ¥å®ä¾ååå§ç¯å¢(initial context).
+ å¦æå®ä»¬æ²¡æ被æå®, å°ä½¿ç¨é»è®¤ç<literal>InitialContext</literal>.
+ </para>
+
+ <para>
+ å¨ä½ è°ç¨<literal>cfg.buildSessionFactory()</literal>å, Hibernateä¼èªå¨å°<literal>SessionFactory</literal>注åå°JNDI.
+ è¿æå³è¿ä½ è³å°éè¦å¨ä½ åºç¨ç¨åºçå¯å¨ä»£ç (æå·¥å
·ç±»)ä¸å®æè¿ä¸ªè°ç¨, é¤éä½ ä½¿ç¨<literal>HibernateService</literal>æ¥åJMXé¨ç½² (è§åé¢è®¨è®º).
+ </para>
+
+ <para>
+ åè¥ä½ 使ç¨JNDI <literal>SessionFactory</literal>,EJBæè
ä»»ä½å
¶å®ç±»é½å¯ä»¥ä»JNDIä¸æ¾å°æ¤<literal>SessionFactory</literal>ã
+ </para>
+
+ <para>
+ æ们建议ï¼å¨å管ççç¯å¢ä¸ï¼æ<literal>SessionFactory</literal>ç»å®å°JNDIï¼å¨å
¶å®æ
åµä¸ï¼ä½¿ç¨ä¸ä¸ª<literal>static(éæç)</literal>singletonã为äºå¨ä½ çåºç¨ç¨åºä»£ç ä¸éèè¿äºç»èï¼æ们è¿å»ºè®®ä½ ç¨ä¸ä¸ªhelperç±»æå®é
æ¥æ¾<literal>SessionFactory</literal>ç代ç éèèµ·æ¥,æ¯å¦<literal>HibernateUtil.getSessionFactory()</literal>ã注æï¼è¿ä¸ªç±»ä¹å°±å¯ä»¥æ¹ä¾¿å°å¯å¨Hibernateï¼åè§ç¬¬ä¸ç« ã
+ </para>
+
+ </sect2>
+
+ <sect2 id="configuration-j2ee-currentsession" revision="4">
+ <title>å¨JTAç¯å¢ä¸ä½¿ç¨Current Session context (å½åsessionä¸ä¸æ)管ç</title>
+
+ <para>
+ å¨Hibernateä¸ï¼ç®¡ç<literal>Session</literal>åtransactionæ好çæ¹æ³æ¯èªå¨ç"å½å"<literal>Session</literal>管çã请åè§<xref linkend="architecture-current-session">contextual sessions</xref>ä¸èç讨论ã使ç¨<literal>"jta"</literal>sessionä¸ä¸æï¼åè¥å¨å½åJTAäºå¡ä¸è¿æ²¡æHibernate<literal>Session</literal>å
³èï¼ç¬¬ä¸æ¬¡<literal>sessionFactory.getCurrentSession()</literal>è°ç¨ä¼å¯å¨ä¸ä¸ªSession,并å
³èå°å½åçJTAäºå¡ãå¨<literal>"jta"</literal>ä¸ä¸æä¸è°ç¨<literal>getCurrentSession()</literal>è·å¾ç<literal>Session</literal>ï¼ä¼è¢«è®¾ç½®ä¸ºå¨transactionå
³éçæ¶åèªå¨flushï¼æ¸
æ´ï¼ãå¨transactionå
³éä¹åèªå¨å
³éï¼æ¯å¥è¯å¥ä¹å主å¨éæ¾JDBCè¿æ¥ãè¿å°±å¯ä»¥æ ¹æ®JTAäºå¡ççå½å¨ææ¥ç®¡çä¸ä¹å
³èç<literal>Session</literal>ï¼ç¨æ·ä»£ç ä¸å°±å¯ä»¥ä¸åèèè¿äºç®¡çãä½ ç代ç ä¹å¯ä»¥éè¿<literal>UserTransaction</literal>ç¨ç¼ç¨!
æ¹å¼ä½¿ç¨JTAï¼æè
(æ们建议ï¼ä¸ºäºä¾¿äºç§»æ¤ä»£ç ï¼ä½¿ç¨Hibernateç<literal>Transaction</literal> APIæ¥è®¾ç½®transactionè¾¹çãå¦æä½ ç代ç è¿è¡å¨EJB容å¨ä¸ï¼å»ºè®®å¯¹CMT使ç¨å£°æå¼äºå¡å£°æã
+
+ </para>
+ </sect2>
+ <sect2 id="configuration-j2ee-jmx" revision="1">
+ <title>
+ JMXé¨ç½²
+ </title>
+
+ <para>
+ 为äºå°<literal>SessionFactory</literal>注åå°JNDIä¸ï¼<literal>cfg.buildSessionFactory()</literal>è¿è¡ä»£ç ä»éå¨æå¤è¢«æ§è¡.
+ ä½ å¯å¨ä¸ä¸ª<literal>static</literal>åå§åå(å<literal>HibernateUtil</literal>ä¸çé£æ ·)ä¸æ§è¡å®æå°Hibernateé¨ç½²ä¸ºä¸ä¸ª<emphasis>æ管çæå¡</emphasis>.
+ </para>
+
+ <para>
+ 为äºé¨ç½²å¨ä¸ä¸ªæ¯æJMXçåºç¨ç¨åºæå¡å¨ä¸ï¼Hibernateå
+ <literal>org.hibernate.jmx.HibernateService</literal>ä¸åååï¼å¦Jboss ASã
+ å®é
çé¨ç½²åé
ç½®æ¯ç±åºç¨ç¨åºæå¡å¨æä¾è
æå®ç. è¿éæ¯JBoss 4.0.xç<literal>jboss-service.xml</literal>æ ·ä¾:
+ </para>
+
+ <programlisting><![CDATA[<?xml version="1.0"?>
+<server>
+
+<mbean code="org.hibernate.jmx.HibernateService"
+ name="jboss.jca:service=HibernateFactory,name=HibernateFactory">
+
+ <!-- å¿
é¡»çæå¡ -->
+ <depends>jboss.jca:service=RARDeployer</depends>
+ <depends>jboss.jca:service=LocalTxCM,name=HsqlDS</depends>
+
+ <!-- å°Hibernateæå¡ç»å®å°JNDI -->
+ <attribute name="JndiName">java:/hibernate/SessionFactory</attribute>
+
+ <!-- æ°æ®æºè®¾ç½® -->
+ <attribute name="Datasource">java:HsqlDS</attribute>
+ <attribute name="Dialect">org.hibernate.dialect.HSQLDialect</attribute>
+
+ <!-- äºå¡éæ -->
+ <attribute name="TransactionStrategy">
+ org.hibernate.transaction.JTATransactionFactory</attribute>
+ <attribute name="TransactionManagerLookupStrategy">
+ org.hibernate.transaction.JBossTransactionManagerLookup</attribute>
+ <attribute name="FlushBeforeCompletionEnabled">true</attribute>
+ <attribute name="AutoCloseSessionEnabled">true</attribute>
+
+ <!-- æåé项 -->
+ <attribute name="MaximumFetchDepth">5</attribute>
+
+ <!-- äºçº§ç¼å -->
+ <attribute name="SecondLevelCacheEnabled">true</attribute>
+ <attribute name="CacheProviderClass">org.hibernate.cache.EhCacheProvider</attribute>
+ <attribute name="QueryCacheEnabled">true</attribute>
+
+ <!-- æ¥å¿ -->
+ <attribute name="ShowSqlEnabled">true</attribute>
+
+ <!-- æ å°å®ä¹æ件 -->
+ <attribute name="MapResources">auction/Item.hbm.xml,auction/Category.hbm.xml</attribute>
+
+</mbean>
+
+</server>]]></programlisting>
+
+ <para>
+ è¿ä¸ªæ件æ¯é¨ç½²å¨<literal>META-INF</literal>ç®å½ä¸ç, 并ä¼è¢«æå
å°ä»¥<literal>.sar</literal> (service archive)为æ©å±åçJARæ件ä¸.
+ åæ¶ï¼ä½ éè¦å°Hibernateãå®æéè¦ç第ä¸æ¹åºãä½ ç¼è¯å¥½çæä¹
å类以åä½ çæ å°å®ä¹æ件æå
è¿åä¸ä¸ªææ¡£.
+ ä½ çä¼ä¸Bean(ä¸è¬ä¸ºä¼è¯Bean)å¯è½ä¼è¢«æå
æå®ä»¬èªå·±çJARæ件, ä½ä½ ä¹è®¸ä¼å°EJB JARæ件ä¸åå
å«è¿è½ç¬ç«(ç)é¨ç½²ç主æå¡ææ¡£.
+ åèJBoss ASæ档以äºè§£æ´å¤çJMXæå¡ä¸EJBé¨ç½²çä¿¡æ¯.
+ </para>
+
+ </sect2>
+
+ </sect1>
+
+</chapter>
Copied: core/trunk/documentation/manual/zh-CN/src/main/docbook/content/events.xml (from rev 14080, core/trunk/documentation/manual/zh-CN/src/main/docbook/modules/events.xml)
===================================================================
--- core/trunk/documentation/manual/zh-CN/src/main/docbook/content/events.xml (rev 0)
+++ core/trunk/documentation/manual/zh-CN/src/main/docbook/content/events.xml 2007-10-09 20:10:34 UTC (rev 14081)
@@ -0,0 +1,247 @@
+<chapter id="events">
+ <title>
+ æ¦æªå¨ä¸äºä»¶(Interceptors and events)
+ </title>
+
+ <para>
+ åºç¨ç¨åºè½å¤ååºHibernateå
é¨äº§ççç¹å®äºä»¶æ¯é常æç¨çãè¿æ ·å°±å
许å®ç°æäºéç¨çåè½
+ 以åå
许对Hibernateåè½è¿è¡æ©å±ã
+ </para>
+
+ <sect1 id="objectstate-interceptors" revision="3">
+ <title>
+ æ¦æªå¨(Interceptors)
+ </title>
+
+ <para>
+ <literal>Interceptor</literal>æ¥å£æä¾äºä»ä¼è¯(session)åè°(callback)åºç¨ç¨åº(application)çæºå¶ï¼
+ è¿ç§åè°æºå¶å¯ä»¥å
许åºç¨ç¨åºå¨æä¹
å对象被ä¿åãæ´æ°ãå é¤ææ¯å è½½ä¹åï¼æ£æ¥å¹¶ï¼æï¼ä¿®æ¹å
¶
+ å±æ§ãä¸ä¸ªå¯è½çç¨éï¼å°±æ¯ç¨æ¥è·è¸ªå®¡æ ¸(auditing)ä¿¡æ¯ãä¾å¦ï¼ä¸é¢çè¿ä¸ª<literal>æ¦æªå¨</literal>ï¼ä¼å¨ä¸ä¸ªå®ç°äº
+ <literal>Auditable</literal>æ¥å£ç对象被å建æ¶èªå¨å°è®¾ç½®<literal>createTimestamp</literal>å±æ§ï¼å¹¶å¨å®ç°äº
+ <literal>Auditable</literal>æ¥å£ç对象被æ´æ°æ¶ï¼åæ¥æ´æ°<literal>lastUpdateTimestamp</literal>å±æ§ã
+ </para>
+
+ <para>
+ ä½ å¯ä»¥ç´æ¥å®ç°<literal>Interceptor</literal>æ¥å£ï¼ä¹å¯ä»¥ï¼æ好ï¼ç»§æ¿èª<literal>EmptyInterceptor</literal>ã
+ </para>
+
+ <programlisting><![CDATA[package org.hibernate.test;
+
+import java.io.Serializable;
+import java.util.Date;
+import java.util.Iterator;
+
+import org.hibernate.EmptyInterceptor;
+import org.hibernate.Transaction;
+import org.hibernate.type.Type;
+
+public class AuditInterceptor extends EmptyInterceptor {
+
+ private int updates;
+ private int creates;
+ private int loads;
+
+ public void onDelete(Object entity,
+ Serializable id,
+ Object[] state,
+ String[] propertyNames,
+ Type[] types) {
+ // do nothing
+ }
+
+ public boolean onFlushDirty(Object entity,
+ Serializable id,
+ Object[] currentState,
+ Object[] previousState,
+ String[] propertyNames,
+ Type[] types) {
+
+ if ( entity instanceof Auditable ) {
+ updates++;
+ for ( int i=0; i < propertyNames.length; i++ ) {
+ if ( "lastUpdateTimestamp".equals( propertyNames[i] ) ) {
+ currentState[i] = new Date();
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+
+ public boolean onLoad(Object entity,
+ Serializable id,
+ Object[] state,
+ String[] propertyNames,
+ Type[] types) {
+ if ( entity instanceof Auditable ) {
+ loads++;
+ }
+ return false;
+ }
+
+ public boolean onSave(Object entity,
+ Serializable id,
+ Object[] state,
+ String[] propertyNames,
+ Type[] types) {
+
+ if ( entity instanceof Auditable ) {
+ creates++;
+ for ( int i=0; i<propertyNames.length; i++ ) {
+ if ( "createTimestamp".equals( propertyNames[i] ) ) {
+ state[i] = new Date();
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+
+ public void afterTransactionCompletion(Transaction tx) {
+ if ( tx.wasCommitted() ) {
+ System.out.println("Creations: " + creates + ", Updates: " + updates, "Loads: " + loads);
+ }
+ updates=0;
+ creates=0;
+ loads=0;
+ }
+
+}]]></programlisting>
+
+
+ <para>
+ æ¦æªå¨å¯ä»¥æ两ç§:<literal>Session</literal>èå´å
çï¼å<literal>SessionFactory</literal>èå´å
çã
+ </para>
+
+ <para>
+ å½ä½¿ç¨æ个éè½½çSessionFactory.openSession()使ç¨<literal>Interceptor</literal>ä½ä¸ºåæ°è°ç¨æå¼ä¸ä¸ªsessionçæ¶åï¼å°±æå®äº<literal>Session</literal>èå´å
çæ¦æªå¨ã
+
+ </para>
+
+ <programlisting><![CDATA[Session session = sf.openSession( new AuditInterceptor() );]]></programlisting>
+
+ <para>
+ <literal>SessionFactory</literal>èå´å
çæ¦æªå¨è¦éè¿<literal>Configuration</literal>ä¸æ³¨åï¼èè¿å¿
é¡»å¨å建<literal>SessionFactory</literal>ä¹åãå¨è¿ç§æ
åµä¸ï¼ç»åºçæ¦æªå¨ä¼è¢«è¿ä¸ª<literal>SessionFactory</literal>ææå¼çææsession使ç¨äºï¼é¤ésessionæå¼æ¶æç¡®ææäºä½¿ç¨çæ¦æªå¨ã<literal>SessionFactory</literal>èå´å
çæ¦æªå¨ï¼å¿
é¡»æ¯çº¿ç¨å®å
¨çï¼å 为å¤ä¸ªsessionå¯è½å¹¶å使ç¨è¿ä¸ªæ¦æªå¨ï¼è¦å æ¤å°å¿ä¸è¦ä¿åä¸sessionç¸å
³çç¶æã
+ </para>
+
+ <programlisting><![CDATA[new Configuration().setInterceptor( new AuditInterceptor() );]]></programlisting>
+
+ </sect1>
+
+ <sect1 id="objectstate-events" revision="4">
+ <title>
+ äºä»¶ç³»ç»(Event system)
+ </title>
+
+ <para>
+ å¦æéè¦ååºæä¹
å±çæäºç¹æ®äºä»¶ï¼ä½ ä¹å¯ä»¥ä½¿ç¨Hibernate3çäºä»¶æ¡æ¶ã
+ 该äºä»¶ç³»ç»å¯ä»¥ç¨æ¥æ¿ä»£æ¦æªå¨ï¼ä¹å¯ä»¥ä½ä¸ºæ¦æªå¨çè¡¥å
æ¥ä½¿ç¨ã
+
+ </para>
+
+ <para>
+ åºæ¬ä¸ï¼<literal>Session</literal>æ¥å£çæ¯ä¸ªæ¹æ³é½æç¸å¯¹åºçäºä»¶ãæ¯å¦
+ <literal>LoadEvent</literal>ï¼<literal>FlushEvent</literal>ï¼ççï¼æ¥é
XMLé
ç½®æ件
+ çDTDï¼ä»¥å<literal>org.hibernate.event</literal>å
æ¥è·å¾ææå·²å®ä¹çäºä»¶çå表ï¼ãå½æ个æ¹
+ æ³è¢«è°ç¨æ¶ï¼Hibernate <literal>Session</literal>ä¼çæä¸ä¸ªç¸å¯¹åºçäºä»¶å¹¶æ¿æ´»æ
+ æé
置好çäºä»¶çå¬å¨ãç³»ç»é¢è®¾ççå¬å¨å®ç°çå¤çè¿ç¨å°±æ¯è¢«çå¬çæ¹æ³è¦åçï¼è¢«çå¬çæ¹æ³æåçå
¶å®ä»
ä»
æ¯æ¿æ´»çå¬å¨ï¼
+ âå®é
âçå·¥ä½æ¯ç±çå¬å¨å®æçï¼ãä¸è¿ï¼ä½ å¯ä»¥èªç±å°éæ©å®ç°
+ ä¸ä¸ªèªå·±å®å¶ççå¬å¨ï¼æ¯å¦ï¼å®ç°å¹¶æ³¨åç¨æ¥å¤çå¤ç<literal>LoadEvent</literal>ç<literal>LoadEventListener</literal>æ¥å£ï¼ï¼
+ æ¥è´è´£å¤çææçè°ç¨<literal>Session</literal>ç<literal>load()</literal>æ¹æ³ç请æ±ã
+ </para>
+
+ <para>
+ çå¬å¨åºè¯¥è¢«çä½æ¯åä¾(singleton)对象ï¼ä¹å°±æ¯è¯´ï¼ææåç±»åçäºä»¶çå¤çå
±äº«åä¸ä¸ªçå¬å¨å®ä¾ï¼å æ¤çå¬å¨
+ ä¸åºè¯¥ä¿åä»»ä½ç¶æï¼ä¹å°±æ¯ä¸åºè¯¥ä½¿ç¨æååéï¼ã
+ </para>
+
+ <para>
+ ç¨æ·å®å¶ççå¬å¨åºè¯¥å®ç°ä¸æè¦å¤ççäºä»¶ç¸å¯¹åºçæ¥å£ï¼æè
ä»ä¸ä¸ªåéçåºç±»ç»§æ¿ï¼çè³æ¯ä»Hibernateèªå¸¦çé»è®¤äºä»¶çå¬å¨ç±»ç»§æ¿ï¼
+ 为äºæ¹ä¾¿ä½ è¿æ ·åï¼è¿äºç±»é½è¢«å£°æænon-finalçäºï¼ãç¨æ·å®å¶ççå¬å¨å¯ä»¥éè¿ç¼ç¨ä½¿ç¨<literal>Configuration</literal>对象
+ æ¥æ³¨åï¼ä¹å¯ä»¥å¨HibernateçXMLæ ¼å¼çé
ç½®æ件ä¸è¿è¡å£°æï¼ä¸æ¯æå¨Propertiesæ ¼å¼çé
ç½®æ件声æçå¬å¨ï¼ã
+ ä¸é¢æ¯ä¸ä¸ªç¨æ·å®å¶çå è½½äºä»¶(load event)ççå¬å¨ï¼
+ </para>
+
+ <programlisting><![CDATA[public class MyLoadListener implements LoadEventListener {
+ // this is the single method defined by the LoadEventListener interface
+ public void onLoad(LoadEvent event, LoadEventListener.LoadType loadType)
+ throws HibernateException {
+ if ( !MySecurity.isAuthorized( event.getEntityClassName(), event.getEntityId() ) ) {
+ throw MySecurityException("Unauthorized access");
+ }
+ }
+}]]></programlisting>
+
+ <para>
+ ä½ è¿éè¦ä¿®æ¹ä¸å¤é
ç½®ï¼æ¥åè¯Hibernateï¼é¤äºé»è®¤ççå¬å¨ï¼è¿è¦éå éå®ççå¬å¨ã
+ </para>
+
+<programlisting><![CDATA[<hibernate-configuration>
+ <session-factory>
+ ...
+ <event type="load">
+ <listener class="com.eg.MyLoadListener"/>
+ <listener class="org.hibernate.event.def.DefaultLoadEventListener"/>
+ </event>
+ </session-factory>
+</hibernate-configuration>]]></programlisting>
+
+ <para>
+ ççç¨å¦ä¸ç§æ¹å¼ï¼éè¿ç¼ç¨çæ¹å¼æ¥æ³¨åå®ã
+ </para>
+
+ <programlisting><![CDATA[Configuration cfg = new Configuration();
+LoadEventListener[] stack = { new MyLoadListener(), new DefaultLoadEventListener() };
+cfg.EventListeners().setLoadEventListeners(stack);]]></programlisting>
+
+ <para>
+ éè¿å¨XMLé
ç½®æ件声æè注åççå¬å¨ä¸è½å
±äº«å®ä¾ãå¦æå¨å¤ä¸ª<literal><listener/></literal>èç¹ä¸ä½¿ç¨
+ äºç¸åçç±»çååï¼åæ¯ä¸ä¸ªå¼ç¨é½å°ä¼äº§çä¸ä¸ªç¬ç«çå®ä¾ãå¦æä½ éè¦å¨å¤ä¸ªçå¬å¨ç±»åä¹é´å
񄧮
+ çå¬å¨çå®ä¾ï¼åä½ å¿
须使ç¨ç¼ç¨çæ¹å¼æ¥è¿è¡æ³¨åã
+ </para>
+
+ <para>
+ 为ä»ä¹æ们å®ç°äºç¹å®çå¬å¨çæ¥å£ï¼å¨æ³¨åçæ¶åè¿è¦æç¡®æåºæ们è¦æ³¨ååªä¸ªäºä»¶ççå¬å¨å¢ï¼
+ è¿æ¯å 为ä¸ä¸ªç±»å¯è½å®ç°å¤ä¸ªçå¬å¨çæ¥å£ãå¨æ³¨åçæ¶åæç¡®æå®è¦çå¬çäºä»¶ï¼å¯ä»¥è®©å¯ç¨æè
ç¦ç¨å¯¹æ个äºä»¶ççå¬çé
置工ä½ç®åäºã
+ </para>
+
+ </sect1>
+
+ <sect1 id="objectstate-decl-security" revision="2">
+ <title>
+ Hibernateç声æå¼å®å
¨æºå¶
+ </title>
+ <para>
+ é常ï¼Hibernateåºç¨ç¨åºç声æå¼å®å
¨æºå¶ç±ä¼è¯å¤è§å±(session facade)æ管çã
+ ç°å¨ï¼Hibernate3å
许æäºç¹å®çè¡ä¸ºç±JACCè¿è¡è®¸å¯ç®¡çï¼ç±JAASè¿è¡ææ管çã
+ æ¬åè½æ¯ä¸ä¸ªå»ºç«å¨äºä»¶æ¡æ¶ä¹ä¸çå¯éçåè½ã
+ </para>
+
+ <para>
+ é¦å
ï¼ä½ å¿
é¡»è¦é
ç½®éå½çäºä»¶çå¬å¨ï¼event listenerï¼ï¼æ¥æ¿æ´»ä½¿ç¨JAAS管çææçåè½ã
+ </para>
+
+ <programlisting><![CDATA[<listener type="pre-delete" class="org.hibernate.secure.JACCPreDeleteEventListener"/>
+<listener type="pre-update" class="org.hibernate.secure.JACCPreUpdateEventListener"/>
+<listener type="pre-insert" class="org.hibernate.secure.JACCPreInsertEventListener"/>
+<listener type="pre-load" class="org.hibernate.secure.JACCPreLoadEventListener"/>]]></programlisting>
+
+ <para>
+ 注æï¼<literal><listener type="..." class="..."/></literal>åªæ¯<literal><event type="..."><listener class="..."/></event></literal>çç®åï¼å¯¹æ¯ä¸ä¸ªäºä»¶ç±»åé½å¿
é¡»ä¸¥æ ¼çæä¸ä¸ªçå¬å¨ä¸ä¹å¯¹åºã
+ </para>
+
+ <para>
+ æ¥ä¸æ¥ï¼ä»ç¶å¨<literal>hibernate.cfg.xml</literal>æ件ä¸ï¼ç»å®è§è²çæéï¼
+ </para>
+
+ <programlisting><![CDATA[<grant role="admin" entity-name="User" actions="insert,update,read"/>
+<grant role="su" entity-name="User" actions="*"/>]]></programlisting>
+
+ <para>
+ è¿äºè§è²çååå°±æ¯ä½ çJACC provideræå®ä¹çè§è²çååã
+ </para>
+
+ </sect1>
+
+</chapter>
+
Copied: core/trunk/documentation/manual/zh-CN/src/main/docbook/content/example_mappings.xml (from rev 14080, core/trunk/documentation/manual/zh-CN/src/main/docbook/modules/example_mappings.xml)
===================================================================
--- core/trunk/documentation/manual/zh-CN/src/main/docbook/content/example_mappings.xml (rev 0)
+++ core/trunk/documentation/manual/zh-CN/src/main/docbook/content/example_mappings.xml 2007-10-09 20:10:34 UTC (rev 14081)
@@ -0,0 +1,650 @@
+<chapter id="example-mappings">
+ <title>示ä¾ï¼å¤ææ å°å®ä¾</title>
+ <para>
+ æ¬ç« å±ç¤ºäºä¸äºè¾ä¸ºå¤æçå
³ç³»æ å°ã
+ </para>
+
+ <sect1 id="example-mappings-emp">
+ <title>Employerï¼é主)/Employee(éå)</title>
+
+ <para>
+ ä¸é¢å
³äº<literal>Employer</literal> å <literal>Employee</literal>çå
³ç³»æ¨¡å使ç¨äºä¸ä¸ªçå®çå®ä½ç±»
+ (<literal>Employment</literal>)æ¥è¡¨è¿°ï¼è¿æ¯å 为对äºç¸åçéååé主å¯è½ä¼æå¤ä¸ªéä½£æ¶é´æ®µã
+ 对äºéé¢åéåå§åï¼ç¨Components建模ã
+
+ </para>
+
+ <mediaobject>
+ <imageobject role="fo">
+ <imagedata fileref="images/EmployerEmployee.gif" format="GIF" align="center"/>
+ </imageobject>
+ <imageobject role="html">
+ <imagedata fileref="../shared/images/EmployerEmployee.gif" format="GIF" align="center"/>
+ </imageobject>
+ </mediaobject>
+
+ <para>
+ æ å°æ件å¯è½æ¯è¿æ ·:
+ </para>
+
+ <programlisting><![CDATA[<hibernate-mapping>
+
+ <class name="Employer" table="employers">
+ <id name="id">
+ <generator class="sequence">
+ <param name="sequence">employer_id_seq</param>
+ </generator>
+ </id>
+ <property name="name"/>
+ </class>
+
+ <class name="Employment" table="employment_periods">
+
+ <id name="id">
+ <generator class="sequence">
+ <param name="sequence">employment_id_seq</param>
+ </generator>
+ </id>
+ <property name="startDate" column="start_date"/>
+ <property name="endDate" column="end_date"/>
+
+ <component name="hourlyRate" class="MonetaryAmount">
+ <property name="amount">
+ <column name="hourly_rate" sql-type="NUMERIC(12, 2)"/>
+ </property>
+ <property name="currency" length="12"/>
+ </component>
+
+ <many-to-one name="employer" column="employer_id" not-null="true"/>
+ <many-to-one name="employee" column="employee_id" not-null="true"/>
+
+ </class>
+
+ <class name="Employee" table="employees">
+ <id name="id">
+ <generator class="sequence">
+ <param name="sequence">employee_id_seq</param>
+ </generator>
+ </id>
+ <property name="taxfileNumber"/>
+ <component name="name" class="Name">
+ <property name="firstName"/>
+ <property name="initial"/>
+ <property name="lastName"/>
+ </component>
+ </class>
+
+</hibernate-mapping>]]></programlisting>
+
+ <para>
+ ç¨<literal>SchemaExport</literal>çæ表ç»æã
+ </para>
+
+ <programlisting><![CDATA[create table employers (
+ id BIGINT not null,
+ name VARCHAR(255),
+ primary key (id)
+)
+
+create table employment_periods (
+ id BIGINT not null,
+ hourly_rate NUMERIC(12, 2),
+ currency VARCHAR(12),
+ employee_id BIGINT not null,
+ employer_id BIGINT not null,
+ end_date TIMESTAMP,
+ start_date TIMESTAMP,
+ primary key (id)
+)
+
+create table employees (
+ id BIGINT not null,
+ firstName VARCHAR(255),
+ initial CHAR(1),
+ lastName VARCHAR(255),
+ taxfileNumber VARCHAR(255),
+ primary key (id)
+)
+
+alter table employment_periods
+ add constraint employment_periodsFK0 foreign key (employer_id) references employers
+alter table employment_periods
+ add constraint employment_periodsFK1 foreign key (employee_id) references employees
+create sequence employee_id_seq
+create sequence employment_id_seq
+create sequence employer_id_seq]]></programlisting>
+
+ </sect1>
+
+ <sect1 id="example-mappings-authorwork">
+ <title>Author(ä½å®¶)/Work(ä½å)</title>
+
+ <para>
+
+ èèä¸é¢ç<literal>Work</literal>,<literal>Author</literal> å <literal>Person</literal>模åçå
³ç³»ã
+ æ们ç¨å¤å¯¹å¤å
³ç³»æ¥æè¿°<literal>Work</literal> å <literal>Author</literal>ï¼
+ ç¨ä¸å¯¹ä¸å
³ç³»æ¥æè¿°<literal>Author</literal> å <literal>Person</literal>ï¼
+ å¦ä¸ç§å¯è½æ§æ¯<literal>Author</literal>继æ¿<literal>Person</literal>ã
+ </para>
+
+ <mediaobject>
+ <imageobject role="fo">
+ <imagedata fileref="images/AuthorWork.gif" format="GIF" align="center"/>
+ </imageobject>
+ <imageobject role="html">
+ <imagedata fileref="../shared/images/AuthorWork.gif" format="GIF" align="center"/>
+ </imageobject>
+ </mediaobject>
+
+ <para>
+ ä¸é¢çæ å°æ件æ£ç¡®çæè¿°äºè¿äºå
³ç³»ï¼
+ </para>
+
+ <programlisting><![CDATA[<hibernate-mapping>
+
+ <class name="Work" table="works" discriminator-value="W">
+
+ <id name="id" column="id">
+ <generator class="native"/>
+ </id>
+ <discriminator column="type" type="character"/>
+
+ <property name="title"/>
+ <set name="authors" table="author_work">
+ <key column name="work_id"/>
+ <many-to-many class="Author" column name="author_id"/>
+ </set>
+
+ <subclass name="Book" discriminator-value="B">
+ <property name="text"/>
+ </subclass>
+
+ <subclass name="Song" discriminator-value="S">
+ <property name="tempo"/>
+ <property name="genre"/>
+ </subclass>
+
+ </class>
+
+ <class name="Author" table="authors">
+
+ <id name="id" column="id">
+ <!-- The Author must have the same identifier as the Person -->
+ <generator class="assigned"/>
+ </id>
+
+ <property name="alias"/>
+ <one-to-one name="person" constrained="true"/>
+
+ <set name="works" table="author_work" inverse="true">
+ <key column="author_id"/>
+ <many-to-many class="Work" column="work_id"/>
+ </set>
+
+ </class>
+
+ <class name="Person" table="persons">
+ <id name="id" column="id">
+ <generator class="native"/>
+ </id>
+ <property name="name"/>
+ </class>
+
+</hibernate-mapping>]]></programlisting>
+
+ <para>
+
+ æ å°ä¸æ4个表ã<literal>works</literal>, <literal>authors</literal> å <literal>persons</literal>
+ åå«ä¿åçworkï¼authoråpersonçæ°æ®ã<literal>author_work</literal>æ¯authorsåworksçå
³è表ã
+ 表ç»ææ¯ç±<literal>SchemaExport</literal>çæçã
+ </para>
+
+ <programlisting><![CDATA[create table works (
+ id BIGINT not null generated by default as identity,
+ tempo FLOAT,
+ genre VARCHAR(255),
+ text INTEGER,
+ title VARCHAR(255),
+ type CHAR(1) not null,
+ primary key (id)
+)
+
+create table author_work (
+ author_id BIGINT not null,
+ work_id BIGINT not null,
+ primary key (work_id, author_id)
+)
+
+create table authors (
+ id BIGINT not null generated by default as identity,
+ alias VARCHAR(255),
+ primary key (id)
+)
+
+create table persons (
+ id BIGINT not null generated by default as identity,
+ name VARCHAR(255),
+ primary key (id)
+)
+
+alter table authors
+ add constraint authorsFK0 foreign key (id) references persons
+alter table author_work
+ add constraint author_workFK0 foreign key (author_id) references authors
+alter table author_work
+ add constraint author_workFK1 foreign key (work_id) references works]]></programlisting>
+
+ </sect1>
+
+ <sect1 id="example-mappings-customerorderproduct">
+ <title>Customer(客æ·)/Order(订å)/Product(产å)</title>
+
+ <para>
+
+ ç°å¨æ¥èè<literal>Customer</literal>,<literal>Order</literal> ï¼ <literal>LineItem</literal>
+ å <literal>Product</literal>å
³ç³»ç模åã<literal>Customer</literal> å <literal>Order</literal>ä¹é´
+ æ¯ä¸å¯¹å¤çå
³ç³»ï¼ä½æ¯æ们æä¹æ¥æè¿°<literal>Order</literal> / <literal>LineItem</literal> / <literal>Product</literal>å¢ï¼
+ æå¯ä»¥æ<literal>LineItem</literal>ä½ä¸ºæè¿°<literal>Order</literal> å <literal>Product</literal>
+ å¤å¯¹å¤å
³ç³»çå
³èç±»ï¼å¨Hibernateï¼è¿å«åç»åå
ç´ ã
+ </para>
+
+ <mediaobject>
+ <imageobject role="fo">
+ <imagedata fileref="images/CustomerOrderProduct.gif" format="GIF" align="center"/>
+ </imageobject>
+ <imageobject role="html">
+ <imagedata fileref="../shared/images/CustomerOrderProduct.gif" format="GIF" align="center"/>
+ </imageobject>
+ </mediaobject>
+
+ <para>
+ æ å°æ件å¦ä¸ï¼
+ </para>
+
+ <programlisting><![CDATA[<hibernate-mapping>
+
+ <class name="Customer" table="customers">
+ <id name="id">
+ <generator class="native"/>
+ </id>
+ <property name="name"/>
+ <set name="orders" inverse="true">
+ <key column="customer_id"/>
+ <one-to-many class="Order"/>
+ </set>
+ </class>
+
+ <class name="Order" table="orders">
+ <id name="id">
+ <generator class="native"/>
+ </id>
+ <property name="date"/>
+ <many-to-one name="customer" column="customer_id"/>
+ <list name="lineItems" table="line_items">
+ <key column="order_id"/>
+ <list-index column="line_number"/>
+ <composite-element class="LineItem">
+ <property name="quantity"/>
+ <many-to-one name="product" column="product_id"/>
+ </composite-element>
+ </list>
+ </class>
+
+ <class name="Product" table="products">
+ <id name="id">
+ <generator class="native"/>
+ </id>
+ <property name="serialNumber"/>
+ </class>
+
+</hibernate-mapping>]]></programlisting>
+
+ <para>
+ <literal>customers</literal>, <literal>orders</literal>, <literal>line_items</literal> å
+ <literal>products</literal> åå«ä¿åçcustomer, order, order line item å productçæ°æ®ã
+ <literal>line_items</literal>ä¹ä½ä¸ºè¿æ¥orders å productsçå
³è表ã
+ </para>
+
+ <programlisting><![CDATA[create table customers (
+ id BIGINT not null generated by default as identity,
+ name VARCHAR(255),
+ primary key (id)
+)
+
+create table orders (
+ id BIGINT not null generated by default as identity,
+ customer_id BIGINT,
+ date TIMESTAMP,
+ primary key (id)
+)
+
+create table line_items (
+ line_number INTEGER not null,
+ order_id BIGINT not null,
+ product_id BIGINT,
+ quantity INTEGER,
+ primary key (order_id, line_number)
+)
+
+create table products (
+ id BIGINT not null generated by default as identity,
+ serialNumber VARCHAR(255),
+ primary key (id)
+)
+
+alter table orders
+ add constraint ordersFK0 foreign key (customer_id) references customers
+alter table line_items
+ add constraint line_itemsFK0 foreign key (product_id) references products
+alter table line_items
+ add constraint line_itemsFK1 foreign key (order_id) references orders]]></programlisting>
+
+ </sect1>
+
+ <sect1 id="misc">
+ <title>æä¾</title>
+
+ <para>
+ è¿äºä¾åå
¨é¨æ¥èªäºHibernateçtest suiteï¼åæ¶ä½ ä¹å¯ä»¥æ¾å°å
¶ä»æç¨çä¾åã
+ å¯ä»¥åèHibernateç<literal>test</literal>ç®å½ã
+ </para>
+
+ <para>TODO: put words around this stuff</para>
+
+ <sect2 id="example-mappings-typed-onetone">
+ <title>"Typed" one-to-one association</title>
+<programlisting><![CDATA[<class name="Person">
+ <id name="name"/>
+ <one-to-one name="address"
+ cascade="all">
+ <formula>name</formula>
+ <formula>'HOME'</formula>
+ </one-to-one>
+ <one-to-one name="mailingAddress"
+ cascade="all">
+ <formula>name</formula>
+ <formula>'MAILING'</formula>
+ </one-to-one>
+</class>
+
+<class name="Address" batch-size="2"
+ check="addressType in ('MAILING', 'HOME', 'BUSINESS')">
+ <composite-id>
+ <key-many-to-one name="person"
+ column="personName"/>
+ <key-property name="type"
+ column="addressType"/>
+ </composite-id>
+ <property name="street" type="text"/>
+ <property name="state"/>
+ <property name="zip"/>
+</class>]]></programlisting>
+ </sect2>
+
+ <sect2 id="example-mappings-composite-key">
+ <title>Composite key example</title>
+<programlisting><![CDATA[<class name="Customer">
+
+ <id name="customerId"
+ length="10">
+ <generator class="assigned"/>
+ </id>
+
+ <property name="name" not-null="true" length="100"/>
+ <property name="address" not-null="true" length="200"/>
+
+ <list name="orders"
+ inverse="true"
+ cascade="save-update">
+ <key column="customerId"/>
+ <index column="orderNumber"/>
+ <one-to-many class="Order"/>
+ </list>
+
+</class>
+
+<class name="Order" table="CustomerOrder" lazy="true">
+ <synchronize table="LineItem"/>
+ <synchronize table="Product"/>
+
+ <composite-id name="id"
+ class="Order$Id">
+ <key-property name="customerId" length="10"/>
+ <key-property name="orderNumber"/>
+ </composite-id>
+
+ <property name="orderDate"
+ type="calendar_date"
+ not-null="true"/>
+
+ <property name="total">
+ <formula>
+ ( select sum(li.quantity*p.price)
+ from LineItem li, Product p
+ where li.productId = p.productId
+ and li.customerId = customerId
+ and li.orderNumber = orderNumber )
+ </formula>
+ </property>
+
+ <many-to-one name="customer"
+ column="customerId"
+ insert="false"
+ update="false"
+ not-null="true"/>
+
+ <bag name="lineItems"
+ fetch="join"
+ inverse="true"
+ cascade="save-update">
+ <key>
+ <column name="customerId"/>
+ <column name="orderNumber"/>
+ </key>
+ <one-to-many class="LineItem"/>
+ </bag>
+
+</class>
+
+<class name="LineItem">
+
+ <composite-id name="id"
+ class="LineItem$Id">
+ <key-property name="customerId" length="10"/>
+ <key-property name="orderNumber"/>
+ <key-property name="productId" length="10"/>
+ </composite-id>
+
+ <property name="quantity"/>
+
+ <many-to-one name="order"
+ insert="false"
+ update="false"
+ not-null="true">
+ <column name="customerId"/>
+ <column name="orderNumber"/>
+ </many-to-one>
+
+ <many-to-one name="product"
+ insert="false"
+ update="false"
+ not-null="true"
+ column="productId"/>
+
+</class>
+
+<class name="Product">
+ <synchronize table="LineItem"/>
+
+ <id name="productId"
+ length="10">
+ <generator class="assigned"/>
+ </id>
+
+ <property name="description"
+ not-null="true"
+ length="200"/>
+ <property name="price" length="3"/>
+ <property name="numberAvailable"/>
+
+ <property name="numberOrdered">
+ <formula>
+ ( select sum(li.quantity)
+ from LineItem li
+ where li.productId = productId )
+ </formula>
+ </property>
+
+</class>]]></programlisting>
+ </sect2>
+
+ <sect2 id="example-mappings-composite-key-manytomany">
+ <title>å
±æç»åé®å±æ§çå¤å¯¹å¤(Many-to-many with shared composite key attribute)</title>
+
+<programlisting><![CDATA[<class name="User" table="`User`">
+ <composite-id>
+ <key-property name="name"/>
+ <key-property name="org"/>
+ </composite-id>
+ <set name="groups" table="UserGroup">
+ <key>
+ <column name="userName"/>
+ <column name="org"/>
+ </key>
+ <many-to-many class="Group">
+ <column name="groupName"/>
+ <formula>org</formula>
+ </many-to-many>
+ </set>
+</class>
+
+<class name="Group" table="`Group`">
+ <composite-id>
+ <key-property name="name"/>
+ <key-property name="org"/>
+ </composite-id>
+ <property name="description"/>
+ <set name="users" table="UserGroup" inverse="true">
+ <key>
+ <column name="groupName"/>
+ <column name="org"/>
+ </key>
+ <many-to-many class="User">
+ <column name="userName"/>
+ <formula>org</formula>
+ </many-to-many>
+ </set>
+</class>
+]]></programlisting>
+ </sect2>
+
+ <sect2 id="example-mappings-content-discrimination">
+ <title>Content based discrimination</title>
+<programlisting><![CDATA[<class name="Person"
+ discriminator-value="P">
+
+ <id name="id"
+ column="person_id"
+ unsaved-value="0">
+ <generator class="native"/>
+ </id>
+
+
+ <discriminator
+ type="character">
+ <formula>
+ case
+ when title is not null then 'E'
+ when salesperson is not null then 'C'
+ else 'P'
+ end
+ </formula>
+ </discriminator>
+
+ <property name="name"
+ not-null="true"
+ length="80"/>
+
+ <property name="sex"
+ not-null="true"
+ update="false"/>
+
+ <component name="address">
+ <property name="address"/>
+ <property name="zip"/>
+ <property name="country"/>
+ </component>
+
+ <subclass name="Employee"
+ discriminator-value="E">
+ <property name="title"
+ length="20"/>
+ <property name="salary"/>
+ <many-to-one name="manager"/>
+ </subclass>
+
+ <subclass name="Customer"
+ discriminator-value="C">
+ <property name="comments"/>
+ <many-to-one name="salesperson"/>
+ </subclass>
+
+</class>]]></programlisting>
+ </sect2>
+
+ <sect2 id="example-mappings-association-alternatekeys" revision="2">
+ <title>Associations on alternate keys</title>
+<programlisting><![CDATA[<class name="Person">
+
+ <id name="id">
+ <generator class="hilo"/>
+ </id>
+
+ <property name="name" length="100"/>
+
+ <one-to-one name="address"
+ property-ref="person"
+ cascade="all"
+ fetch="join"/>
+
+ <set name="accounts"
+ inverse="true">
+ <key column="userId"
+ property-ref="userId"/>
+ <one-to-many class="Account"/>
+ </set>
+
+ <property name="userId" length="8"/>
+
+</class>
+
+<class name="Address">
+
+ <id name="id">
+ <generator class="hilo"/>
+ </id>
+
+ <property name="address" length="300"/>
+ <property name="zip" length="5"/>
+ <property name="country" length="25"/>
+ <many-to-one name="person" unique="true" not-null="true"/>
+
+</class>
+
+<class name="Account">
+ <id name="accountId" length="32">
+ <generator class="uuid"/>
+ </id>
+
+ <many-to-one name="user"
+ column="userId"
+ property-ref="userId"/>
+
+ <property name="type" not-null="true"/>
+
+</class>]]></programlisting>
+ </sect2>
+
+ </sect1>
+
+</chapter>
\ No newline at end of file
Copied: core/trunk/documentation/manual/zh-CN/src/main/docbook/content/example_parentchild.xml (from rev 14080, core/trunk/documentation/manual/zh-CN/src/main/docbook/modules/example_parentchild.xml)
===================================================================
--- core/trunk/documentation/manual/zh-CN/src/main/docbook/content/example_parentchild.xml (rev 0)
+++ core/trunk/documentation/manual/zh-CN/src/main/docbook/content/example_parentchild.xml 2007-10-09 20:10:34 UTC (rev 14081)
@@ -0,0 +1,306 @@
+<chapter id="example-parentchild">
+ <title>示ä¾ï¼ç¶åå
³ç³»(Parent Child Relationships)</title>
+ <para>
+ ååæ¥è§¦Hibernateç人大å¤æ¯ä»ç¶åå
³ç³»ï¼parent / child type relationshipï¼ç建模å
¥æçãç¶åå
³ç³»ç建模æ两ç§æ¹æ³ãç±äºç§ç§åå ï¼ææ¹ä¾¿çæ¹æ³æ¯æ<literal>Parent</literal>å<literal>Child</literal>é½å»ºæ¨¡æå®ä½ç±»ï¼å¹¶å建ä¸ä¸ªä»<literal>Parent</literal>æå<literal>Child</literal>ç<one-to-many>å
³èï¼å¯¹æ°ææ¥è¯´å°¤å
¶å¦æ¤ãè¿æä¸ç§æ¹æ³ï¼å°±æ¯å°<literal>Child</literal>声æ为ä¸ä¸ª<literal><composite-element></literal>ï¼ç»åå
ç´ ï¼ã äºå®ä¸å¨Hibernateä¸one to manyå
³èçé»è®¤è¯ä¹è¿æ²¡æcomposite elementè´´è¿parent / childå
³ç³»çé常è¯ä¹ãä¸é¢æ们ä¼éè¿°å¦ä½ä½¿ç¨<emphasis>带æ级èçååä¸å¯¹å¤å
³è(bidirectional one to many association with cascades)</emphasis>å»å»ºç«ææãä¼ç¾çparent / childå
³ç³»ãè¿ä¸ç¹ä¹ä¸é¾ï¼
+ </para>
+
+ <sect1 id="example-parentchild-collections">
+ <title>å
³äºcollectionséè¦æ³¨æçä¸ç¹</title>
+ <para>
+ Hibernate collections被å½ä½å
¶æå±å®ä½èä¸æ¯å
¶å
å«å®ä½çä¸ä¸ªé»è¾é¨åãè¿é常éè¦ï¼å®ä¸»è¦ä½ç°ä¸ºä»¥ä¸å ç¹ï¼
+ </para>
+ <itemizedlist>
+ <listitem>
+ <para>
+ å½å é¤æå¢å collectionä¸å¯¹è±¡çæ¶åï¼collectionæå±è
ççæ¬å¼ä¼éå¢ã
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ å¦æä¸ä¸ªä»collectionä¸ç§»é¤ç对象æ¯ä¸ä¸ªå¼ç±»å(value type)çå®ä¾ï¼æ¯å¦composite elementï¼é£ä¹è¿ä¸ªå¯¹è±¡çæä¹
åç¶æå°ä¼ç»æ¢ï¼å
¶å¨æ°æ®åºä¸å¯¹åºçè®°å½ä¼è¢«å é¤ãåæ ·çï¼åcollectionå¢å ä¸ä¸ªvalue typeçå®ä¾å°ä¼ä½¿ä¹ç«å³è¢«æä¹
åã
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ å¦ä¸æ¹é¢ï¼å¦æä»ä¸å¯¹å¤æå¤å¯¹å¤å
³èçcollectionä¸ç§»é¤ä¸ä¸ªå®ä½ï¼å¨ç¼ºçæ
åµä¸è¿ä¸ªå¯¹è±¡å¹¶ä¸ä¼è¢«å é¤ãè¿ä¸ªè¡ä¸ºæ¯å®å
¨åä¹é»è¾çï¼ï¼æ¹åä¸ä¸ªå®ä½çå
é¨ç¶æä¸åºè¯¥ä½¿ä¸å®å
³èçå®ä½æ¶å¤±æï¼åæ ·çï¼åcollectionå¢å ä¸ä¸ªå®ä½ä¸ä¼ä½¿ä¹è¢«æä¹
åã
+ </para>
+ </listitem>
+ </itemizedlist>
+
+ <para>
+ å®é
ä¸ï¼åCollectionå¢å ä¸ä¸ªå®ä½ç缺çå¨ä½åªæ¯å¨ä¸¤ä¸ªå®ä½ä¹é´å建ä¸ä¸ªè¿æ¥èå·²ï¼åæ ·ç§»é¤çæ¶åä¹åªæ¯å é¤è¿æ¥ãè¿ç§å¤ç对äºææçæ
åµé½æ¯åéçã对äºç¶åå
³ç³»åæ¯å®å
¨ä¸éåçï¼å¨è¿ç§å
³ç³»ä¸ï¼å对象ççåç»å®äºç¶å¯¹è±¡ççåå¨æã
+ </para>
+
+ </sect1>
+ <sect1 id="example-parentchild-bidir">
+ <title>ååçä¸å¯¹å¤å
³ç³»(Bidirectional one-to-many)</title>
+
+ <para>
+ å设æ们è¦å®ç°ä¸ä¸ªç®åçä»Parentå°Childç<one-to-many>å
³èã
+ </para>
+
+ <programlisting><![CDATA[<set name="children">
+ <key column="parent_id"/>
+ <one-to-many class="Child"/>
+</set>]]></programlisting>
+
+ <para>
+ å¦ææ们è¿è¡ä¸é¢ç代ç
+ </para>
+
+ <programlisting><![CDATA[Parent p = .....;
+Child c = new Child();
+p.getChildren().add(c);
+session.save(c);
+session.flush();]]></programlisting>
+
+ <para>
+ Hibernateä¼äº§ç两æ¡SQLè¯å¥ï¼
+ </para>
+
+ <itemizedlist>
+ <listitem>
+ <para>ä¸æ¡<literal>INSERT</literal>è¯å¥ï¼ä¸º<literal>c</literal>å建ä¸æ¡è®°å½</para>
+ </listitem>
+ <listitem>
+ <para>
+ ä¸æ¡<literal>UPDATE</literal>è¯å¥ï¼å建ä»<literal>p</literal>å°<literal>c</literal>çè¿æ¥
+ </para>
+ </listitem>
+ </itemizedlist>
+
+ <para>
+ è¿æ ·åä¸ä»
æçä½ï¼èä¸è¿åäºå<literal>parent_id</literal>é空çéå¶ãæ们å¯ä»¥éè¿å¨éåç±»æ å°ä¸æå®<literal>not-null="true"</literal>æ¥è§£å³è¿åé空约æçé®é¢ï¼
+ </para>
+
+ <programlisting><![CDATA[<set name="children">
+ <key column="parent_id" not-null="true"/>
+ <one-to-many class="Child"/>
+</set>]]></programlisting>
+
+ <para>
+ ç¶èï¼è¿å¹¶éæ¯æ¨èç解å³æ¹æ³ã
+ </para>
+
+ <para> è¿ç§ç°è±¡çæ ¹æ¬åå æ¯ä»<literal>p</literal>å°<literal>c</literal>çè¿æ¥ï¼å¤é®parent_idï¼æ²¡æ被å½ä½<literal>Child</literal>对象ç¶æçä¸é¨åï¼å è没æå¨INSERTè¯å¥ä¸è¢«å建ãå æ¤è§£å³çåæ³å°±æ¯æè¿ä¸ªè¿æ¥æ·»å å°Childçæ å°ä¸ã
+ </para>
+
+ <programlisting><![CDATA[<many-to-one name="parent" column="parent_id" not-null="true"/>]]></programlisting>
+
+ <para>
+ ï¼æ们è¿éè¦ä¸ºç±»<literal>Child</literal>æ·»å <literal>parent</literal>å±æ§ï¼
+ </para>
+
+ <para>
+ ç°å¨å®ä½<literal>Child</literal>å¨ç®¡çè¿æ¥çç¶æï¼ä¸ºäºä½¿collectionä¸æ´æ°è¿æ¥ï¼æ们使ç¨<literal>inverse</literal>å±æ§ã
+ </para>
+
+ <programlisting><![CDATA[<set name="children" inverse="true">
+ <key column="parent_id"/>
+ <one-to-many class="Child"/>
+</set>]]></programlisting>
+
+ <para>
+ ä¸é¢ç代ç æ¯ç¨æ¥æ·»å ä¸ä¸ªæ°ç<literal>Child</literal>
+ </para>
+
+ <programlisting><![CDATA[Parent p = (Parent) session.load(Parent.class, pid);
+Child c = new Child();
+c.setParent(p);
+p.getChildren().add(c);
+session.save(c);
+session.flush();]]></programlisting>
+
+ <para>
+ ç°å¨ï¼åªä¼æä¸æ¡<literal>INSERT</literal>è¯å¥è¢«æ§è¡ï¼
+ </para>
+
+ <para>
+ 为äºè®©äºæ
åå¾äºäºææ¡ï¼å¯ä»¥ä¸º<literal>Parent</literal>å ä¸ä¸ª<literal>addChild()</literal>æ¹æ³ã
+ </para>
+
+ <programlisting><![CDATA[public void addChild(Child c) {
+ c.setParent(this);
+ children.add(c);
+}]]></programlisting>
+
+ <para>
+ ç°å¨ï¼æ·»å <literal>Child</literal>ç代ç å°±æ¯è¿æ ·
+ </para>
+
+ <programlisting><![CDATA[Parent p = (Parent) session.load(Parent.class, pid);
+Child c = new Child();
+p.addChild(c);
+session.save(c);
+session.flush();]]></programlisting>
+
+ </sect1>
+
+ <sect1 id="example-parentchild-cascades">
+ <title>级èçå½å¨æï¼Cascading life cycleï¼</title>
+ <para>
+ éè¦æ¾å¼è°ç¨<literal>save()</literal>ä»ç¶å¾éº»ç¦ï¼æ们å¯ä»¥ç¨çº§èæ¥è§£å³è¿ä¸ªé®é¢ã
+ </para>
+
+ <programlisting><![CDATA[<set name="children" inverse="true" cascade="all">
+ <key column="parent_id"/>
+ <one-to-many class="Child"/>
+</set>]]></programlisting>
+
+ <para>
+ è¿æ ·ä¸é¢ç代ç å¯ä»¥ç®å为ï¼
+ </para>
+
+ <programlisting><![CDATA[Parent p = (Parent) session.load(Parent.class, pid);
+Child c = new Child();
+p.addChild(c);
+session.flush();]]></programlisting>
+
+ <para>
+ åæ ·çï¼ä¿åæå é¤<literal>Parent</literal>对象çæ¶å并ä¸éè¦éåå
¶å对象ã
+ ä¸é¢ç代ç ä¼å é¤å¯¹è±¡<literal>p</literal>åå
¶ææå对象对åºçæ°æ®åºè®°å½ã
+ </para>
+
+ <programlisting><![CDATA[Parent p = (Parent) session.load(Parent.class, pid);
+session.delete(p);
+session.flush();]]></programlisting>
+
+ <para>
+ ç¶èï¼è¿æ®µä»£ç
+ </para>
+
+ <programlisting><![CDATA[Parent p = (Parent) session.load(Parent.class, pid);
+Child c = (Child) p.getChildren().iterator().next();
+p.getChildren().remove(c);
+c.setParent(null);
+session.flush();]]></programlisting>
+
+ <para>
+ ä¸ä¼ä»æ°æ®åºå é¤<literal>c</literal>ï¼å®åªä¼å é¤ä¸<literal>p</literal>ä¹é´çè¿æ¥ï¼å¹¶ä¸ä¼å¯¼è´è¿å<literal>NOT NULL</literal>约æï¼å¨è¿ä¸ªä¾åä¸ï¼ãä½ éè¦æ¾å¼è°ç¨<literal>delete()</literal>æ¥å é¤<literal>Child</literal>ã <!--ï¼å 为Hibernate并没æ设计åå¾åæ¶å¨ï¼ä»£ç å¦ä¸ï¼-->
+ </para>
+
+ <programlisting><![CDATA[Parent p = (Parent) session.load(Parent.class, pid);
+Child c = (Child) p.getChildren().iterator().next();
+p.getChildren().remove(c);
+session.delete(c);
+session.flush();]]></programlisting>
+
+
+ <para>
+ å¨æ们çä¾åä¸ï¼å¦æ没æç¶å¯¹è±¡ï¼å对象就ä¸åºè¯¥åå¨ï¼å¦æå°å对象ä»collectionä¸ç§»é¤ï¼å®é
ä¸æ们æ¯æ³å é¤å®ãè¦å®ç°è¿ç§è¦æ±ï¼å°±å¿
须使ç¨<literal>cascade="all-delete-orphan"</literal>ã
+ </para>
+
+
+ <programlisting><![CDATA[<set name="children" inverse="true" cascade="all-delete-orphan">
+ <key column="parent_id"/>
+ <one-to-many class="Child"/>
+</set>]]></programlisting>
+
+ <para>
+ 注æï¼å³ä½¿å¨collectionä¸æ¹çæ å°ä¸æå®<literal>inverse="true"</literal>ï¼çº§èä»ç¶æ¯éè¿éåcollectionä¸çå
ç´ æ¥å¤ççãå¦æä½ æ³è¦éè¿çº§èè¿è¡å对象çæå
¥ãå é¤ãæ´æ°æä½ï¼å°±å¿
é¡»æå®å å°collectionä¸ï¼åªè°ç¨<literal>setParent()</literal>æ¯ä¸å¤çã
+ </para>
+
+ </sect1>
+
+ <sect1 id="example-parentchild-update">
+ <title>级èä¸<literal>æªä¿åå¼</literal>ï¼Cascades and <literal>unsaved-value</literal>ï¼</title>
+
+ <para>
+ å设æ们ä»<literal>Session</literal>ä¸è£
å
¥äºä¸ä¸ª<literal>Parent</literal>对象ï¼ç¨æ·çé¢å¯¹å
¶è¿è¡äºä¿®æ¹ï¼ç¶åå¸æå¨ä¸ä¸ªæ°çSessionéé¢è°ç¨<literal>update()</literal>æ¥ä¿åè¿äºä¿®æ¹ã对象<literal>Parent</literal>å
å«äºå对象çéåï¼ç±äºæå¼äºçº§èæ´æ°ï¼Hibernateéè¦ç¥éåªäºChild对象æ¯æ°å®ä¾åçï¼åªäºä»£è¡¨æ°æ®åºä¸å·²ç»åå¨çè®°å½ãæ们å设<literal>Parent</literal>å<literal>Child</literal>对象çæ è¯å±æ§é½æ¯èªå¨çæçï¼ç±»å为<literal>java.lang.Long</literal>ãHibernateä¼ä½¿ç¨æ è¯å±æ§çå¼ï¼åversion æ timestamp å±æ§ï¼æ¥å¤æåªäºå对象æ¯æ°çã(åè§<xref linkend="objectstate-saveorupdate"/>.) <emphasis>å¨ Hibernate3 ä¸,æ¾å¼æå®<literal>unsaved-value</literal>ä¸åæ¯å¿
é¡»çäºã</emphasis>
+ </para>
+
+ <para>
+ ä¸é¢ç代ç ä¼æ´æ°<literal>parent</literal>å<literal>child</literal>对象ï¼å¹¶ä¸æå
¥<literal>newChild</literal>对象ã
+ </para>
+
+ <programlisting><![CDATA[//parent and child were both loaded in a previous session
+parent.addChild(child);
+Child newChild = new Child();
+parent.addChild(newChild);
+session.update(parent);
+session.flush();]]></programlisting>
+
+ <para>
+ Well, that's all very well for the case of a generated identifier, but what about assigned identifiers
+ and composite identifiers? This is more difficult, since Hibernate can't use the identifier property to
+ distinguish between a newly instantiated object (with an identifier assigned by the user) and an
+ object loaded in a previous session. In this case, Hibernate will either use the timestamp or version
+ property, or will actually query the second-level cache or, worst case, the database, to see if the
+ row exists.
+ </para>
+ <para>
+ è¿å¯¹äºèªå¨çææ è¯çæ
åµæ¯é常好çï¼ä½æ¯èªåé
çæ è¯åå¤åæ è¯æä¹åå¢ï¼è¿æ¯æç¹éº»ç¦ï¼å 为Hibernate没æåæ³åºåæ°å®ä¾åç对象ï¼æ è¯è¢«ç¨æ·æå®äºï¼ååä¸ä¸ªSessionè£
å
¥ç对象ãå¨è¿ç§æ
åµä¸ï¼Hibernateä¼ä½¿ç¨timestampæversionå±æ§ï¼æè
æ¥è¯¢ç¬¬äºçº§ç¼åï¼æè
æåçæ
åµï¼æ¥è¯¢æ°æ®åºï¼æ¥ç¡®è®¤æ¯å¦æ¤è¡åå¨ã</para>
+
+ <!-- undocumenting
+
+ <para>
+ è¿æä¸ç§å¯è½æ
åµï¼æä¸ä¸ªå为<literal>isUnsaved()</literal>ç<literal>æ°çæ¦æªå¨ï¼Interceptorï¼</literal>æ¹æ³ï¼å®å
许åºç¨ç¨åºèªå·±å®ç°æ°å®ä¾çå¤æãæ¯å¦ï¼ä½ å¯ä»¥èªå·±å®ä¹ä¸ä¸ªæä¹
ç±»çç¥å
ç±»ï¼
+ </para>
+
+ <programlisting><![CDATA[public class Persistent {
+ private boolean _saved = false;
+ public void onSave() {
+ _saved=true;
+ }
+ public void onLoad() {
+ _saved=true;
+ }
+ ......
+ public boolean isSaved() {
+ return _saved;
+ }
+}]]></programlisting>
+
+ <para>
+ ï¼<literal>saved</literal>å±æ§æ¯ä¸ä¼è¢«æä¹
åçã)
+ ç°å¨å¨<literal>onLoad()</literal>å<literal>onSave()</literal>å¤ï¼è¿è¦å®ç°<literal>isUnsaved()</literal>ã
+ </para>
+
+ <programlisting><![CDATA[public Boolean isUnsaved(Object entity) {
+ if (entity instanceof Persistent) {
+ return new Boolean( !( (Persistent) entity ).isSaved() );
+ }
+ else {
+ return null;
+ }
+}
+
+public boolean onLoad(Object entity,
+ Serializable id,
+ Object[] state,
+ String[] propertyNames,
+ Type[] types) {
+
+ if (entity instanceof Persistent) ( (Persistent) entity ).onLoad();
+ return false;
+}
+
+public boolean onSave(Object entity,
+ Serializable id,
+ Object[] state,
+ String[] propertyNames,
+ Type[] types) {
+
+ if (entity instanceof Persistent) ( (Persistent) entity ).onSave();
+ return false;
+}]]></programlisting>
+
+ <para>
+ Don't worry; in Hibernate3 you don't need to write any of this kind of code if you don't want to.
+ å«æ
å¿ï¼å¨Hibernate3ä¸ï¼åè¥ä½ ä¸æ¿æï¼ä½ ä¸éè¦ç¼åä»»ä½è¿ç±»ä»£ç ã
+ </para>
+ -->
+
+ </sect1>
+
+
+ <sect1 id="example-parentchild-conclusion">
+ <title>ç»è®º</title>
+ <para> è¿éæä¸å°ä¸è¥¿éè¦èä¼è´¯éï¼å¯è½ä¼è®©æ°ææå°è¿·æãä½æ¯å¨å®è·µä¸å®ä»¬é½å·¥ä½å°é常好ã大é¨åHibernateåºç¨ç¨åºé½ä¼ç»å¸¸ç¨å°ç¶å对象模å¼ã
+ </para>
+ <para>
+ å¨ç¬¬ä¸æ®µä¸æ们æ¾ç»æå°å¦ä¸ä¸ªæ¹æ¡ãä¸é¢çè¿äºé®é¢é½ä¸ä¼åºç°å¨<literal><composite-element></literal>æ å°ä¸ï¼å®åç¡®å°è¡¨è¾¾äºç¶åå
³ç³»çè¯ä¹ãå¾ä¸å¹¸å¤åå
ç´ è¿æ两个é大éå¶:å¤åå
ç´ ä¸è½æ¥æcollectionsï¼å¹¶ä¸ï¼é¤äºç¨äºæä¸çç¶å¯¹è±¡å¤ï¼å®ä»¬ä¸è½åä½ä¸ºå
¶å®ä»»ä½å®ä½çå对象ã
+ </para>
+ </sect1>
+
+</chapter>
\ No newline at end of file
Copied: core/trunk/documentation/manual/zh-CN/src/main/docbook/content/example_weblog.xml (from rev 14080, core/trunk/documentation/manual/zh-CN/src/main/docbook/modules/example_weblog.xml)
===================================================================
--- core/trunk/documentation/manual/zh-CN/src/main/docbook/content/example_weblog.xml (rev 0)
+++ core/trunk/documentation/manual/zh-CN/src/main/docbook/content/example_weblog.xml 2007-10-09 20:10:34 UTC (rev 14081)
@@ -0,0 +1,424 @@
+<chapter id="example-weblog">
+ <title>示ä¾ï¼Weblog åºç¨ç¨åº</title>
+
+ <sect1 id="example-weblog-classes">
+ <title>æä¹
åç±»</title>
+
+ <para> ä¸é¢çæä¹
å类表示ä¸ä¸ªweblogåå¨å
¶ä¸å¼ è´´çä¸ä¸ªè´´åãä»ä»¬æ¯æ åçç¶/åå
³ç³»æ¨¡åï¼ä½æ¯æ们ä¼ç¨ä¸ä¸ªæåºå
ï¼ordered bag)èééå(set)ã
+ </para>
+
+ <programlisting><![CDATA[package eg;
+
+import java.util.List;
+
+public class Blog {
+ private Long _id;
+ private String _name;
+ private List _items;
+
+ public Long getId() {
+ return _id;
+ }
+ public List getItems() {
+ return _items;
+ }
+ public String getName() {
+ return _name;
+ }
+ public void setId(Long long1) {
+ _id = long1;
+ }
+ public void setItems(List list) {
+ _items = list;
+ }
+ public void setName(String string) {
+ _name = string;
+ }
+}]]></programlisting>
+
+ <programlisting><![CDATA[package eg;
+
+import java.text.DateFormat;
+import java.util.Calendar;
+
+public class BlogItem {
+ private Long _id;
+ private Calendar _datetime;
+ private String _text;
+ private String _title;
+ private Blog _blog;
+
+ public Blog getBlog() {
+ return _blog;
+ }
+ public Calendar getDatetime() {
+ return _datetime;
+ }
+ public Long getId() {
+ return _id;
+ }
+ public String getText() {
+ return _text;
+ }
+ public String getTitle() {
+ return _title;
+ }
+ public void setBlog(Blog blog) {
+ _blog = blog;
+ }
+ public void setDatetime(Calendar calendar) {
+ _datetime = calendar;
+ }
+ public void setId(Long long1) {
+ _id = long1;
+ }
+ public void setText(String string) {
+ _text = string;
+ }
+ public void setTitle(String string) {
+ _title = string;
+ }
+}]]></programlisting>
+
+ </sect1>
+ <sect1 id="example-weblog-mappings">
+ <title>Hibernate æ å°</title>
+
+ <para>
+ ä¸åçXMLæ å°åºè¯¥æ¯å¾ç´ç½çã
+ </para>
+
+ <programlisting><![CDATA[<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC
+ "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+ "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<hibernate-mapping package="eg">
+ <class
+ name="Blog"
+ table="BLOGS" >
+
+ <id
+ name="id"
+ column="BLOG_ID">
+
+ <generator class="native"/>
+
+ </id>
+
+ <property
+ name="name"
+ column="NAME"
+ not-null="true"
+ unique="true"/>
+
+ <bag
+ name="items"
+ inverse="true"
+ order-by="DATE_TIME"
+ cascade="all">
+
+ <key column="BLOG_ID"/>
+ <one-to-many class="BlogItem"/>
+
+ </bag>
+
+ </class>
+
+</hibernate-mapping>]]></programlisting>
+
+ <programlisting><![CDATA[<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC
+ "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+ "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<hibernate-mapping package="eg">
+
+ <class
+ name="BlogItem"
+ table="BLOG_ITEMS"
+ dynamic-update="true">
+
+ <id
+ name="id"
+ column="BLOG_ITEM_ID">
+
+ <generator class="native"/>
+
+ </id>
+
+ <property
+ name="title"
+ column="TITLE"
+ not-null="true"/>
+
+ <property
+ name="text"
+ column="TEXT"
+ not-null="true"/>
+
+ <property
+ name="datetime"
+ column="DATE_TIME"
+ not-null="true"/>
+
+ <many-to-one
+ name="blog"
+ column="BLOG_ID"
+ not-null="true"/>
+
+ </class>
+
+</hibernate-mapping>]]></programlisting>
+
+ </sect1>
+
+ <sect1 id="example-weblog-code">
+ <title>Hibernate 代ç </title>
+
+ <para>
+ ä¸é¢çç±»æ¼ç¤ºäºæ们å¯ä»¥ä½¿ç¨Hibernate对è¿äºç±»è¿è¡çä¸äºæä½ã
+ </para>
+
+ <programlisting><![CDATA[package eg;
+
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.Iterator;
+import java.util.List;
+
+import org.hibernate.HibernateException;
+import org.hibernate.Query;
+import org.hibernate.Session;
+import org.hibernate.SessionFactory;
+import org.hibernate.Transaction;
+import org.hibernate.cfg.Configuration;
+import org.hibernate.tool.hbm2ddl.SchemaExport;
+
+public class BlogMain {
+
+ private SessionFactory _sessions;
+
+ public void configure() throws HibernateException {
+ _sessions = new Configuration()
+ .addClass(Blog.class)
+ .addClass(BlogItem.class)
+ .buildSessionFactory();
+ }
+
+ public void exportTables() throws HibernateException {
+ Configuration cfg = new Configuration()
+ .addClass(Blog.class)
+ .addClass(BlogItem.class);
+ new SchemaExport(cfg).create(true, true);
+ }
+
+ public Blog createBlog(String name) throws HibernateException {
+
+ Blog blog = new Blog();
+ blog.setName(name);
+ blog.setItems( new ArrayList() );
+
+ Session session = _sessions.openSession();
+ Transaction tx = null;
+ try {
+ tx = session.beginTransaction();
+ session.persist(blog);
+ tx.commit();
+ }
+ catch (HibernateException he) {
+ if (tx!=null) tx.rollback();
+ throw he;
+ }
+ finally {
+ session.close();
+ }
+ return blog;
+ }
+
+ public BlogItem createBlogItem(Blog blog, String title, String text)
+ throws HibernateException {
+
+ BlogItem item = new BlogItem();
+ item.setTitle(title);
+ item.setText(text);
+ item.setBlog(blog);
+ item.setDatetime( Calendar.getInstance() );
+ blog.getItems().add(item);
+
+ Session session = _sessions.openSession();
+ Transaction tx = null;
+ try {
+ tx = session.beginTransaction();
+ session.update(blog);
+ tx.commit();
+ }
+ catch (HibernateException he) {
+ if (tx!=null) tx.rollback();
+ throw he;
+ }
+ finally {
+ session.close();
+ }
+ return item;
+ }
+
+ public BlogItem createBlogItem(Long blogid, String title, String text)
+ throws HibernateException {
+
+ BlogItem item = new BlogItem();
+ item.setTitle(title);
+ item.setText(text);
+ item.setDatetime( Calendar.getInstance() );
+
+ Session session = _sessions.openSession();
+ Transaction tx = null;
+ try {
+ tx = session.beginTransaction();
+ Blog blog = (Blog) session.load(Blog.class, blogid);
+ item.setBlog(blog);
+ blog.getItems().add(item);
+ tx.commit();
+ }
+ catch (HibernateException he) {
+ if (tx!=null) tx.rollback();
+ throw he;
+ }
+ finally {
+ session.close();
+ }
+ return item;
+ }
+
+ public void updateBlogItem(BlogItem item, String text)
+ throws HibernateException {
+
+ item.setText(text);
+
+ Session session = _sessions.openSession();
+ Transaction tx = null;
+ try {
+ tx = session.beginTransaction();
+ session.update(item);
+ tx.commit();
+ }
+ catch (HibernateException he) {
+ if (tx!=null) tx.rollback();
+ throw he;
+ }
+ finally {
+ session.close();
+ }
+ }
+
+ public void updateBlogItem(Long itemid, String text)
+ throws HibernateException {
+
+ Session session = _sessions.openSession();
+ Transaction tx = null;
+ try {
+ tx = session.beginTransaction();
+ BlogItem item = (BlogItem) session.load(BlogItem.class, itemid);
+ item.setText(text);
+ tx.commit();
+ }
+ catch (HibernateException he) {
+ if (tx!=null) tx.rollback();
+ throw he;
+ }
+ finally {
+ session.close();
+ }
+ }
+
+ public List listAllBlogNamesAndItemCounts(int max)
+ throws HibernateException {
+
+ Session session = _sessions.openSession();
+ Transaction tx = null;
+ List result = null;
+ try {
+ tx = session.beginTransaction();
+ Query q = session.createQuery(
+ "select blog.id, blog.name, count(blogItem) " +
+ "from Blog as blog " +
+ "left outer join blog.items as blogItem " +
+ "group by blog.name, blog.id " +
+ "order by max(blogItem.datetime)"
+ );
+ q.setMaxResults(max);
+ result = q.list();
+ tx.commit();
+ }
+ catch (HibernateException he) {
+ if (tx!=null) tx.rollback();
+ throw he;
+ }
+ finally {
+ session.close();
+ }
+ return result;
+ }
+
+ public Blog getBlogAndAllItems(Long blogid)
+ throws HibernateException {
+
+ Session session = _sessions.openSession();
+ Transaction tx = null;
+ Blog blog = null;
+ try {
+ tx = session.beginTransaction();
+ Query q = session.createQuery(
+ "from Blog as blog " +
+ "left outer join fetch blog.items " +
+ "where blog.id = :blogid"
+ );
+ q.setParameter("blogid", blogid);
+ blog = (Blog) q.uniqueResult();
+ tx.commit();
+ }
+ catch (HibernateException he) {
+ if (tx!=null) tx.rollback();
+ throw he;
+ }
+ finally {
+ session.close();
+ }
+ return blog;
+ }
+
+ public List listBlogsAndRecentItems() throws HibernateException {
+
+ Session session = _sessions.openSession();
+ Transaction tx = null;
+ List result = null;
+ try {
+ tx = session.beginTransaction();
+ Query q = session.createQuery(
+ "from Blog as blog " +
+ "inner join blog.items as blogItem " +
+ "where blogItem.datetime > :minDate"
+ );
+
+ Calendar cal = Calendar.getInstance();
+ cal.roll(Calendar.MONTH, false);
+ q.setCalendar("minDate", cal);
+
+ result = q.list();
+ tx.commit();
+ }
+ catch (HibernateException he) {
+ if (tx!=null) tx.rollback();
+ throw he;
+ }
+ finally {
+ session.close();
+ }
+ return result;
+ }
+}]]></programlisting>
+
+ </sect1>
+
+</chapter>
+
Copied: core/trunk/documentation/manual/zh-CN/src/main/docbook/content/filters.xml (from rev 14080, core/trunk/documentation/manual/zh-CN/src/main/docbook/modules/filters.xml)
===================================================================
--- core/trunk/documentation/manual/zh-CN/src/main/docbook/content/filters.xml (rev 0)
+++ core/trunk/documentation/manual/zh-CN/src/main/docbook/content/filters.xml 2007-10-09 20:10:34 UTC (rev 14081)
@@ -0,0 +1,140 @@
+<chapter id="filters">
+ <title>è¿æ»¤æ°æ®</title>
+ <para>
+
+ Hibernate3 æä¾äºä¸ç§åæ°çæ¹å¼æ¥å¤çå
·æâæ¾æ§(visibility)âè§åçæ°æ®ï¼é£å°±æ¯ä½¿ç¨<emphasis>Hibernate filter</emphasis>ã
+ <emphasis>Hibernate filter</emphasis>æ¯å
¨å±ææçãå
·æååãå¯ä»¥å¸¦åæ°çè¿æ»¤å¨ï¼
+ 对äºæ个ç¹å®çHibernate sessionæ¨å¯ä»¥éæ©æ¯å¦å¯ç¨ï¼æç¦ç¨ï¼æ个è¿æ»¤å¨ã
+ </para>
+
+ <sect1 id="objectstate-filters" revision="1">
+ <title>Hibernate è¿æ»¤å¨(filters)</title>
+
+ <para>
+ Hibernate3æ°å¢äºå¯¹æ个类æè
éå使ç¨é¢å
å®ä¹çè¿æ»¤å¨æ¡ä»¶(filter criteria)çåè½ãè¿æ»¤å¨æ¡ä»¶ç¸å½äºå®ä¹ä¸ä¸ª
+ é常类似äºç±»ååç§éåä¸çâwhereâå±æ§ç约æåå¥ï¼ä½æ¯è¿æ»¤å¨æ¡ä»¶å¯ä»¥å¸¦åæ°ã
+ åºç¨ç¨åºå¯ä»¥å¨è¿è¡æ¶å³å®æ¯å¦å¯ç¨ç»å®çè¿æ»¤å¨ï¼ä»¥å使ç¨ä»ä¹æ ·çåæ°å¼ã
+ è¿æ»¤å¨çç¨æ³å¾åæ°æ®åºè§å¾ï¼åªä¸è¿æ¯å¨åºç¨ç¨åºä¸ç¡®å®ä½¿ç¨ä»ä¹æ ·çåæ°çã
+
+ </para>
+
+ <para>
+
+ è¦ä½¿ç¨è¿æ»¤å¨ï¼å¿
é¡»é¦å
å¨ç¸åºçæ å°èç¹ä¸å®ä¹ãèå®ä¹ä¸ä¸ªè¿æ»¤å¨ï¼è¦ç¨å°ä½äº<literal><hibernate-mapping/></literal>
+ èç¹ä¹å
ç<literal><filter-def/></literal>èç¹ï¼
+ </para>
+
+ <programlisting><![CDATA[<filter-def name="myFilter">
+ <filter-param name="myFilterParam" type="string"/>
+</filter-def>]]></programlisting>
+
+ <para>
+ å®ä¹å¥½ä¹åï¼å°±å¯ä»¥å¨æ个类ä¸ä½¿ç¨è¿ä¸ªè¿æ»¤å¨ï¼
+ </para>
+
+ <programlisting><![CDATA[<class name="myClass" ...>
+ ...
+ <filter name="myFilter" condition=":myFilterParam = MY_FILTERED_COLUMN"/>
+</class>]]></programlisting>
+
+ <para>
+ ä¹å¯ä»¥å¨æ个éå使ç¨å®ï¼
+ </para>
+
+ <programlisting><![CDATA[<set ...>
+ <filter name="myFilter" condition=":myFilterParam = MY_FILTERED_COLUMN"/>
+</set>]]></programlisting>
+
+ <para>
+ å¯ä»¥å¨å¤ä¸ªç±»æéåä¸ä½¿ç¨æ个è¿æ»¤å¨ï¼æ个类æè
éåä¸ä¹å¯ä»¥ä½¿ç¨å¤ä¸ªè¿æ»¤å¨ã
+ </para>
+
+ <para>
+
+ <literal>Session</literal>对象ä¸ä¼ç¨å°çæ¹æ³æï¼<literal>enableFilter(String filterName)</literal>,
+ <literal>getEnabledFilter(String filterName)</literal>, å <literal>disableFilter(String filterName)</literal>.
+ Sessionä¸é»è®¤æ¯<emphasis>ä¸</emphasis>å¯ç¨è¿æ»¤å¨çï¼å¿
é¡»éè¿<literal>Session.enabledFilter()</literal>æ¹æ³æ¾å¼çå¯ç¨ã
+ 该æ¹æ³è¿å被å¯ç¨ç<literal>Filter</literal>çå®ä¾ã以ä¸æå®ä¹çè¿æ»¤å¨ä¸ºä¾ï¼
+ </para>
+
+ <programlisting><![CDATA[session.enableFilter("myFilter").setParameter("myFilterParam", "some-value");]]></programlisting>
+
+ <para>
+ 注æï¼org.hibernate.Filterçæ¹æ³å
许é¾å¼æ¹æ³è°ç¨ãï¼ç±»ä¼¼ä¸é¢ä¾åä¸å¯ç¨Filterä¹å设å®Filteråæ°è¿ä¸ªâæ¹æ³é¾âï¼
+ Hibernateçå
¶ä»é¨åä¹å¤§å¤æè¿ä¸ªç¹æ§ã
+ </para>
+
+ <para>
+ ä¸é¢æ¯ä¸ä¸ªæ¯è¾å®æ´çä¾åï¼ä½¿ç¨äºè®°å½çææ¥æ模å¼è¿æ»¤ææ¶æçæ°æ®ï¼
+ </para>
+
+ <programlisting><![CDATA[<filter-def name="effectiveDate">
+ <filter-param name="asOfDate" type="date"/>
+</filter-def>
+
+<class name="Employee" ...>
+...
+ <many-to-one name="department" column="dept_id" class="Department"/>
+ <property name="effectiveStartDate" type="date" column="eff_start_dt"/>
+ <property name="effectiveEndDate" type="date" column="eff_end_dt"/>
+...
+ <!--
+ Note that this assumes non-terminal records have an eff_end_dt set to
+ a max db date for simplicity-sake
+
+ 注æï¼ä¸ºäºç®åèµ·è§ï¼æ¤å¤å设éç¨å
³ç³»çææå°æªç»æçè®°å½çeff_end_dtå段çå¼çäºæ°æ®åºæ大çæ¥æ
+ -->
+ <filter name="effectiveDate"
+ condition=":asOfDate BETWEEN eff_start_dt and eff_end_dt"/>
+</class>
+
+<class name="Department" ...>
+...
+ <set name="employees" lazy="true">
+ <key column="dept_id"/>
+ <one-to-many class="Employee"/>
+ <filter name="effectiveDate"
+ condition=":asOfDate BETWEEN eff_start_dt and eff_end_dt"/>
+ </set>
+</class>]]></programlisting>
+
+ <para>
+ å®ä¹å¥½åï¼å¦ææ³è¦ä¿è¯ååçé½æ¯ç®åå¤äºçææçè®°å½ï¼åªéå¨è·åéåæ°æ®çæä½ä¹åå
å¼å¯è¿æ»¤å¨å³å¯ï¼
+ </para>
+
+<programlisting><![CDATA[Session session = ...;
+session.enabledFilter("effectiveDate").setParameter("asOfDate", new Date());
+List results = session.createQuery("from Employee as e where e.salary > :targetSalary")
+ .setLong("targetSalary", new Long(1000000))
+ .list();
+]]></programlisting>
+
+ <para>
+
+ å¨ä¸é¢çHQLä¸ï¼è½ç¶æ们ä»
ä»
æ¾å¼ç使ç¨äºä¸ä¸ªèªæ°´æ¡ä»¶ï¼ä½å 为å¯ç¨äºè¿æ»¤å¨ï¼æ¥è¯¢å°ä»
è¿åé£äºç®åéç¨
+ å
³ç³»å¤äºçææçï¼å¹¶ä¸èªæ°´é«äºä¸ç¾ä¸ç¾åçéåçæ°æ®ã
+
+ </para>
+
+ <para>
+
+ 注æï¼å¦æä½ æç®å¨ä½¿ç¨å¤è¿æ¥ï¼æè
éè¿HQLæload fetchingï¼çåæ¶ä½¿ç¨è¿æ»¤å¨ï¼è¦æ³¨ææ¡ä»¶è¡¨è¾¾å¼çæ¹åï¼å·¦è¿æ¯å³ï¼ã
+ æå®å
¨çæ¹å¼æ¯ä½¿ç¨å·¦å¤è¿æ¥ï¼left outer joiningï¼ã并ä¸é常æ¥è¯´ï¼å
ååæ°ï¼
+ ç¶åæ¯æä½ç¬¦ï¼æååæ°æ®åºå段åã
+ </para>
+
+ <para>
+ å¨Filterå®ä¹ä¹å,å®å¯è½è¢«éå å°å¤ä¸ªå®ä½å/æéåç±»,æ¯ä¸ªé½æèªå·±çæ¡ä»¶ãåè¥è¿äºæ¡ä»¶é½æ¯ä¸æ ·çï¼æ¯æ¬¡é½è¦å®ä¹å°±æ¾å¾å¾ç¹çãå æ¤ï¼<literal><filter-def/></literal>被ç¨æ¥å®ä¹ä¸ä¸ªé»è®¤æ¡ä»¶ï¼å®å¯è½ä½ä¸ºå±æ§æè
CDATAåºç°ï¼
+ </para>
+
+ <programlisting><![CDATA[<filter-def name="myFilter" condition="abc > xyz">...</filter-def>
+<filter-def name="myOtherFilter">abc=xyz</filter-def>]]></programlisting>
+
+ <para>
+ å½è¿ä¸ªfilter被éå å°ä»»ä½ç®çå°ï¼èå没ææææ¡ä»¶æ¶ï¼è¿ä¸ªæ¡ä»¶å°±ä¼è¢«ä½¿ç¨ã注æï¼æ¢å¥è¯è¯´ï¼ä½ å¯ä»¥éè¿ç»filteréå ç¹å«çæ¡ä»¶æ¥éè½½é»è®¤æ¡ä»¶ã
+ </para>
+
+
+ </sect1>
+
+</chapter>
\ No newline at end of file
Copied: core/trunk/documentation/manual/zh-CN/src/main/docbook/content/inheritance_mapping.xml (from rev 14080, core/trunk/documentation/manual/zh-CN/src/main/docbook/modules/inheritance_mapping.xml)
===================================================================
--- core/trunk/documentation/manual/zh-CN/src/main/docbook/content/inheritance_mapping.xml (rev 0)
+++ core/trunk/documentation/manual/zh-CN/src/main/docbook/content/inheritance_mapping.xml 2007-10-09 20:10:34 UTC (rev 14081)
@@ -0,0 +1,467 @@
+ <chapter id="inheritance">
+ <title>继æ¿æ å°(Inheritance Mappings)</title>
+
+ <sect1 id="inheritance-strategies" revision="3">
+ <title> ä¸ç§çç¥</title>
+
+
+ <para>
+ Hibernateæ¯æä¸ç§åºæ¬ç继æ¿æ å°çç¥ï¼
+ </para>
+
+ <itemizedlist>
+ <listitem>
+ <para>
+ æ¯ä¸ªç±»åå±ç»æä¸å¼ 表(table per class hierarchy)
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ æ¯ä¸ªåç±»ä¸å¼ 表(table per subclass)
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ æ¯ä¸ªå
·ä½ç±»ä¸å¼ 表(table per concrete class)
+ </para>
+ </listitem>
+ </itemizedlist>
+ <para>
+ æ¤å¤ï¼Hibernateè¿æ¯æ第åç§ç¨æä¸åçå¤ææ å°çç¥ï¼
+ </para>
+
+ <itemizedlist>
+ <listitem>
+ <para>
+ éå¼å¤æ(implicit polymorphism)
+ </para>
+ </listitem>
+ </itemizedlist>
+
+ <para>
+ 对äºåä¸ä¸ªç»§æ¿å±æ¬¡å
çä¸ååæ¯ï¼å¯ä»¥éç¨ä¸åçæ å°çç¥ï¼ç¶åç¨éå¼å¤
+ ææ¥å®æè·¨è¶æ´ä¸ªå±æ¬¡çå¤æãä½æ¯å¨åä¸ä¸ª<literal><class></literal>æ ¹å
ç´
+ ä¸ï¼Hibernateä¸æ¯ææ··åäºå
ç´ <literal><subclass></literal>ã
+ <literal><joined-subclass></literal>å<literal><union-subclass></literal>
+ çæ å°ãå¨åä¸ä¸ª<literal><class></literal>å
ç´ ä¸ï¼å¯ä»¥æ··å使ç¨
+ âæ¯ä¸ªç±»åå±ç»æä¸å¼ 表âï¼table per hierarchyï¼ åâæ¯ä¸ªåç±»ä¸å¼ 表âï¼table per subclassï¼
+ è¿ä¸¤ç§æ å°çç¥ï¼è¿æ¯éè¿ç»åå
ç´ <literal><subclass></literal>å
+ <literal><join></literal>æ¥å®ç°çï¼è§åï¼ã
+
+ </para>
+
+ <para>
+ å¨å¤ä¸ªæ å°æ件ä¸ï¼å¯ä»¥ç´æ¥å¨<literal>hibernate-mapping</literal>æ ¹ä¸å®ä¹<literal>subclass</literal>ï¼<literal>union-subclass</literal>å<literal>joined-subclass</literal>ãä¹å°±æ¯è¯´ï¼ä½ å¯ä»¥ä»
å å
¥ä¸ä¸ªæ°çæ å°æ件æ¥æ©å±ç±»å±æ¬¡ãä½ å¿
é¡»å¨subclassçæ å°ä¸ææ<literal>extends</literal>å±æ§ï¼ç»åºä¸ä¸ªä¹åå®ä¹çè¶
ç±»çååã注æï¼å¨ä»¥åï¼è¿ä¸åè½å¯¹æ å°æ件ç顺åºæä¸¥æ ¼çè¦æ±ï¼ä»Hibernate 3å¼å§ï¼ä½¿ç¨extendså
³é®åçæ¶ä¾¯ï¼å¯¹æ å°æ件ç顺åºä¸åæè¦æ±ï¼ä½å¨æ¯ä¸ªæ å°æ件éï¼è¶
ç±»å¿
é¡»å¨åç±»ä¹åå®ä¹ã
+ </para>
+
+ <programlisting><![CDATA[
+ <hibernate-mapping>
+ <subclass name="DomesticCat" extends="Cat" discriminator-value="D">
+ <property name="name" type="string"/>
+ </subclass>
+ </hibernate-mapping>]]></programlisting>
+
+ <sect2 id="inheritance-tableperclass" >
+ <title>æ¯ä¸ªç±»åå±ç»æä¸å¼ 表(Table per class hierarchy)</title>
+
+
+ <para>
+ å设æ们ææ¥å£<literal>Payment</literal>åå®çå 个å®ç°ç±»ï¼
+ <literal>CreditCardPayment</literal>, <literal>CashPayment</literal>,
+ å<literal>ChequePayment</literal>ãåâæ¯ä¸ªç±»åå±ç»æä¸å¼ 表â(Table per
+ class hierarchy)çæ å°ä»£ç å¦ä¸æ示ï¼
+ </para>
+
+ <programlisting><![CDATA[<class name="Payment" table="PAYMENT">
+ <id name="id" type="long" column="PAYMENT_ID">
+ <generator class="native"/>
+ </id>
+ <discriminator column="PAYMENT_TYPE" type="string"/>
+ <property name="amount" column="AMOUNT"/>
+ ...
+ <subclass name="CreditCardPayment" discriminator-value="CREDIT">
+ <property name="creditCardType" column="CCTYPE"/>
+ ...
+ </subclass>
+ <subclass name="CashPayment" discriminator-value="CASH">
+ ...
+ </subclass>
+ <subclass name="ChequePayment" discriminator-value="CHEQUE">
+ ...
+ </subclass>
+</class>]]></programlisting>
+
+ <para>
+ éç¨è¿ç§çç¥åªéè¦ä¸å¼ 表å³å¯ãå®æä¸ä¸ªå¾å¤§çéå¶ï¼è¦æ±é£äºç±åç±»å®ä¹çå段ï¼
+ å¦<literal>CCTYPE</literal>ï¼ä¸è½æ<literal>é空(NOT NULL)</literal>约æã
+ </para>
+
+ </sect2>
+
+ <sect2 id="inheritance-tablepersubclass">
+
+ <title>æ¯ä¸ªåç±»ä¸å¼ 表(Table per subclass)</title>
+
+
+ <para>
+ 对äºä¸ä¾ä¸çå 个类èè¨ï¼éç¨âæ¯ä¸ªåç±»ä¸å¼ 表âçæ å°çç¥ï¼ä»£ç å¦ä¸æ示ï¼
+ </para>
+
+ <programlisting><![CDATA[<class name="Payment" table="PAYMENT">
+ <id name="id" type="long" column="PAYMENT_ID">
+ <generator class="native"/>
+ </id>
+ <property name="amount" column="AMOUNT"/>
+ ...
+ <joined-subclass name="CreditCardPayment" table="CREDIT_PAYMENT">
+ <key column="PAYMENT_ID"/>
+ ...
+ </joined-subclass>
+ <joined-subclass name="CashPayment" table="CASH_PAYMENT">
+ <key column="PAYMENT_ID"/>
+ <property name="creditCardType" column="CCTYPE"/>
+ ...
+ </joined-subclass>
+ <joined-subclass name="ChequePayment" table="CHEQUE_PAYMENT">
+ <key column="PAYMENT_ID"/>
+ ...
+ </joined-subclass>
+</class>]]></programlisting>
+ <para>
+ éè¦åå¼ è¡¨ãä¸ä¸ªå类表éè¿ä¸»é®å
³èå°è¶
类表(å èå
³ç³»æ¨¡åå®é
ä¸æ¯ä¸å¯¹ä¸å
³è)ã
+ </para>
+
+ </sect2>
+
+ <sect2 id="inheritance-tablepersubclass-discriminator" revision="2">
+
+ <title>æ¯ä¸ªåç±»ä¸å¼ 表(Table per subclass)ï¼ä½¿ç¨è¾¨å«æ å¿(Discriminator)</title>
+
+ <para>
+ 注æï¼å¯¹âæ¯ä¸ªåç±»ä¸å¼ 表âçæ å°çç¥ï¼Hibernateçå®ç°ä¸éè¦è¾¨å«å段ï¼èå
¶ä»
+ ç对象/å
³ç³»æ å°å·¥å
·ä½¿ç¨äºä¸ç§ä¸åäºHibernateçå®ç°æ¹æ³ï¼è¯¥æ¹æ³è¦æ±å¨è¶
ç±»
+ 表ä¸æä¸ä¸ªç±»å辨å«å段(type discriminator column)ãHibernateéç¨çæ¹æ³æ´
+ é¾å®ç°ï¼ä½ä»å
³ç³»ï¼æ°æ®åºï¼çè§åº¦æ¥çï¼æç说å®æ´æ£ç¡®ãè¥ä½ æ¿æ使ç¨å¸¦æ辨å«å
+ 段çâæ¯ä¸ªåç±»ä¸å¼ 表âççç¥ï¼ä½ å¯ä»¥ç»å使ç¨<literal><subclass></literal>
+ ä¸<literal><join></literal>ï¼å¦ä¸æ示ï¼
+ </para>
+
+ <programlisting><![CDATA[<class name="Payment" table="PAYMENT">
+ <id name="id" type="long" column="PAYMENT_ID">
+ <generator class="native"/>
+ </id>
+ <discriminator column="PAYMENT_TYPE" type="string"/>
+ <property name="amount" column="AMOUNT"/>
+ ...
+ <subclass name="CreditCardPayment" discriminator-value="CREDIT">
+ <join table="CREDIT_PAYMENT">
+ <key column="PAYMENT_ID"/>
+ <property name="creditCardType" column="CCTYPE"/>
+ ...
+ </join>
+ </subclass>
+ <subclass name="CashPayment" discriminator-value="CASH">
+ <join table="CASH_PAYMENT">
+ <key column="PAYMENT_ID"/>
+ ...
+ </join>
+ </subclass>
+ <subclass name="ChequePayment" discriminator-value="CHEQUE">
+ <join table="CHEQUE_PAYMENT" fetch="select">
+ <key column="PAYMENT_ID"/>
+ ...
+ </join>
+ </subclass>
+</class>]]></programlisting>
+
+
+ <para>
+ å¯éç声æ<literal>fetch="select"</literal>ï¼æ¯ç¨æ¥åè¯Hibernateï¼å¨æ¥è¯¢è¶
ç±»æ¶ï¼
+ ä¸è¦ä½¿ç¨å¤é¨è¿æ¥(outer join)æ¥æååç±»<literal>ChequePayment</literal>çæ°æ®ã
+ </para>
+
+ </sect2>
+
+ <sect2 id="inheritance-mixing-tableperclass-tablepersubclass">
+ <title>æ··å使ç¨âæ¯ä¸ªç±»åå±ç»æä¸å¼ 表âåâæ¯ä¸ªåç±»ä¸å¼ 表â</title>
+
+ <para>
+ ä½ çè³å¯ä»¥éåå¦ä¸æ¹æ³æ··å使ç¨âæ¯ä¸ªç±»åå±ç»æä¸å¼ 表âåâæ¯ä¸ªåç±»ä¸å¼ 表âè¿ä¸¤ç§çç¥ï¼
+ </para>
+
+ <programlisting><![CDATA[<class name="Payment" table="PAYMENT">
+ <id name="id" type="long" column="PAYMENT_ID">
+ <generator class="native"/>
+ </id>
+ <discriminator column="PAYMENT_TYPE" type="string"/>
+ <property name="amount" column="AMOUNT"/>
+ ...
+ <subclass name="CreditCardPayment" discriminator-value="CREDIT">
+ <join table="CREDIT_PAYMENT">
+ <property name="creditCardType" column="CCTYPE"/>
+ ...
+ </join>
+ </subclass>
+ <subclass name="CashPayment" discriminator-value="CASH">
+ ...
+ </subclass>
+ <subclass name="ChequePayment" discriminator-value="CHEQUE">
+ ...
+ </subclass>
+</class>]]></programlisting>
+
+ <para>
+ 对ä¸è¿°ä»»ä½ä¸ç§æ å°çç¥èè¨ï¼æåæ ¹ç±»<literal>Payment</literal>ç
+ å
³èæ¯ä½¿ç¨<literal><many-to-one></literal>è¿è¡æ å°çã
+ </para>
+
+ <programlisting><![CDATA[<many-to-one name="payment" column="PAYMENT_ID" class="Payment"/>]]></programlisting>
+
+ </sect2>
+
+ <sect2 id="inheritance-tableperconcrete" revision="2">
+ <title>æ¯ä¸ªå
·ä½ç±»ä¸å¼ 表(Table per concrete class)</title>
+
+ <para>
+ 对äºâæ¯ä¸ªå
·ä½ç±»ä¸å¼ 表âçæ å°çç¥ï¼å¯ä»¥éç¨ä¸¤ç§æ¹æ³ã第ä¸ç§æ¹æ³æ¯ä½¿ç¨
+ <literal><union-subclass></literal>ã
+ </para>
+
+ <programlisting><![CDATA[<class name="Payment">
+ <id name="id" type="long" column="PAYMENT_ID">
+ <generator class="sequence"/>
+ </id>
+ <property name="amount" column="AMOUNT"/>
+ ...
+ <union-subclass name="CreditCardPayment" table="CREDIT_PAYMENT">
+ <property name="creditCardType" column="CCTYPE"/>
+ ...
+ </union-subclass>
+ <union-subclass name="CashPayment" table="CASH_PAYMENT">
+ ...
+ </union-subclass>
+ <union-subclass name="ChequePayment" table="CHEQUE_PAYMENT">
+ ...
+ </union-subclass>
+</class>]]></programlisting>
+
+ <para>
+ è¿éæ¶åä¸å¼ ä¸åç±»ç¸å
³ç表ãæ¯å¼ 表为对åºç±»çææå±æ§ï¼å
æ¬ä»è¶
类继æ¿çå±æ§ï¼å®ä¹ç¸åºå段ã
+ </para>
+
+ <para>
+ è¿ç§æ¹å¼çå±éå¨äºï¼å¦æä¸ä¸ªå±æ§å¨è¶
ç±»ä¸åäºæ å°ï¼å
¶å段åå¿
é¡»ä¸ææåç±»
+ 表ä¸å®ä¹çç¸åã(æ们å¯è½ä¼å¨Hibernateçåç»åå¸çæ¬ä¸æ¾å®½æ¤éå¶ã)
+ ä¸å
许å¨èååç±»(union subclass)ç继æ¿å±æ¬¡ä¸ä½¿ç¨æ è¯çæå¨çç¥(identity generator strategy),
+ å®é
ä¸, 主é®çç§å(primary key seed)ä¸å¾ä¸ä¸ºåä¸ç»§æ¿å±æ¬¡ä¸çå
¨é¨è¢«èååç±»æå
±ç¨.
+ </para>
+
+ <para>
+ åè¥è¶
ç±»æ¯æ½è±¡ç±»ï¼è¯·ä½¿ç¨<literal>abstract="true"</literal>ãå½ç¶ï¼åè¥å®ä¸æ¯æ½è±¡çï¼éè¦ä¸ä¸ªé¢å¤ç表ï¼ä¸é¢çä¾åä¸ï¼é»è®¤æ¯<literal>PAYMENT</literal>ï¼ï¼æ¥ä¿åè¶
ç±»çå®ä¾ã
+ </para>
+
+ </sect2>
+
+ <sect2 id="inheritance-tableperconcreate-polymorphism">
+ <title>Table per concrete class, using implicit polymorphism</title>
+ <title>æ¯ä¸ªå
·ä½ç±»ä¸å¼ 表ï¼ä½¿ç¨éå¼å¤æ</title>
+
+ <para>
+ å¦ä¸ç§å¯ä¾éæ©çæ¹æ³æ¯éç¨éå¼å¤æï¼
+ </para>
+
+ <programlisting><![CDATA[<class name="CreditCardPayment" table="CREDIT_PAYMENT">
+ <id name="id" type="long" column="CREDIT_PAYMENT_ID">
+ <generator class="native"/>
+ </id>
+ <property name="amount" column="CREDIT_AMOUNT"/>
+ ...
+</class>
+
+<class name="CashPayment" table="CASH_PAYMENT">
+ <id name="id" type="long" column="CASH_PAYMENT_ID">
+ <generator class="native"/>
+ </id>
+ <property name="amount" column="CASH_AMOUNT"/>
+ ...
+</class>
+
+<class name="ChequePayment" table="CHEQUE_PAYMENT">
+ <id name="id" type="long" column="CHEQUE_PAYMENT_ID">
+ <generator class="native"/>
+ </id>
+ <property name="amount" column="CHEQUE_AMOUNT"/>
+ ...
+</class>]]></programlisting>
+
+ <para>
+ 注æï¼æ们没æå¨ä»»ä½å°æ¹æç¡®çæåæ¥å£<literal>Payment</literal>ãåæ¶æ³¨æ
+ <literal>Payment</literal>çå±æ§å¨æ¯ä¸ªåç±»ä¸é½è¿è¡äºæ å°ãå¦æä½ æ³é¿å
éå¤ï¼
+ å¯ä»¥èè使ç¨XMLå®ä½(ä¾å¦ï¼ä½äº<literal>DOCTYPE</literal>声æå
ç
+ <literal>[ <!ENTITY allproperties SYSTEM "allproperties.xml"> ]</literal>
+ åæ å°ä¸ç<literal>&allproperties;</literal>)ã
+ </para>
+
+ <para>
+ è¿ç§æ¹æ³ç缺é·å¨äºï¼å¨Hibernateæ§è¡å¤ææ¥è¯¢æ¶(polymorphic queries)æ æ³çæ带
+ <literal>UNION</literal>çSQLè¯å¥ã
+ </para>
+
+ <para>
+ 对äºè¿ç§æ å°çç¥èè¨ï¼é常ç¨<literal><any></literal>æ¥å®ç°å°
+ <literal>Payment</literal>çå¤æå
³èæ å°ã
+ </para>
+
+ <programlisting><![CDATA[<any name="payment" meta-type="string" id-type="long">
+ <meta-value value="CREDIT" class="CreditCardPayment"/>
+ <meta-value value="CASH" class="CashPayment"/>
+ <meta-value value="CHEQUE" class="ChequePayment"/>
+ <column name="PAYMENT_CLASS"/>
+ <column name="PAYMENT_ID"/>
+</any>]]></programlisting>
+
+ </sect2>
+
+ <sect2 id="inheritace-mixingpolymorphism">
+ <title>éå¼å¤æåå
¶ä»ç»§æ¿æ å°æ··å使ç¨</title>
+
+ <para>
+ 对è¿ä¸æ å°è¿æä¸ç¹éè¦æ³¨æãå 为æ¯ä¸ªåç±»é½å¨åèªç¬ç«çå
ç´ <literal><class></literal>
+ ä¸æ å°(并ä¸<literal>Payment</literal>åªæ¯ä¸ä¸ªæ¥å£)ï¼æ¯ä¸ªåç±»å¯ä»¥å¾å®¹æçæ为å¦ä¸
+ 个继æ¿ä½ç³»ä¸çä¸é¨åï¼(ä½ ä»ç¶å¯ä»¥å¯¹æ¥å£<literal>Payment</literal>使ç¨å¤ææ¥è¯¢ã)
+ </para>
+
+ <programlisting><![CDATA[<class name="CreditCardPayment" table="CREDIT_PAYMENT">
+ <id name="id" type="long" column="CREDIT_PAYMENT_ID">
+ <generator class="native"/>
+ </id>
+ <discriminator column="CREDIT_CARD" type="string"/>
+ <property name="amount" column="CREDIT_AMOUNT"/>
+ ...
+ <subclass name="MasterCardPayment" discriminator-value="MDC"/>
+ <subclass name="VisaPayment" discriminator-value="VISA"/>
+</class>
+
+<class name="NonelectronicTransaction" table="NONELECTRONIC_TXN">
+ <id name="id" type="long" column="TXN_ID">
+ <generator class="native"/>
+ </id>
+ ...
+ <joined-subclass name="CashPayment" table="CASH_PAYMENT">
+ <key column="PAYMENT_ID"/>
+ <property name="amount" column="CASH_AMOUNT"/>
+ ...
+ </joined-subclass>
+ <joined-subclass name="ChequePayment" table="CHEQUE_PAYMENT">
+ <key column="PAYMENT_ID"/>
+ <property name="amount" column="CHEQUE_AMOUNT"/>
+ ...
+ </joined-subclass>
+</class>]]></programlisting>
+
+ <para>
+ æ们è¿æ¯æ²¡ææç¡®çæå°<literal>Payment</literal>ã
+ å¦ææ们é对æ¥å£<literal>Payment</literal>æ§è¡æ¥è¯¢
+ ââå¦<literal>from Payment</literal>ââ Hibernate
+ èªå¨è¿å<literal>CreditCardPayment</literal>(åå®çåç±»ï¼å 为
+ å®ä»¬ä¹å®ç°äºæ¥å£<literal>Payment</literal>)ã
+ <literal>CashPayment</literal>å<literal>Chequepayment</literal>çå®ä¾ï¼
+ ä½ä¸è¿å<literal>NonelectronicTransaction</literal>çå®ä¾ã
+ </para>
+
+ </sect2>
+
+ </sect1>
+
+ <sect1 id="inheritance-limitations">
+ <title>éå¶</title>
+
+ <para>
+ 对âæ¯ä¸ªå
·ä½ç±»æ å°ä¸å¼ 表âï¼table per concrete-classï¼çæ å°çç¥èè¨ï¼éå¼å¤æç
+ æ¹å¼æä¸å®çéå¶ãè<literal><union-subclass></literal>æ å°çéå¶å没æé£
+ ä¹ä¸¥æ ¼ã
+ </para>
+
+ <para>
+ ä¸é¢è¡¨æ ¼ä¸ååºäºå¨Hibernteä¸âæ¯ä¸ªå
·ä½ç±»ä¸å¼ 表âççç¥åéå¼å¤æçéå¶ã
+ </para>
+
+ <table frame="topbot">
+ <title>继æ¿æ å°ç¹æ§(Features of inheritance mappings) </title>
+ <tgroup cols='8' align='left' colsep='1' rowsep='1'>
+ <colspec colname='c1' colwidth="1*"/>
+ <colspec colname='c2' colwidth="1*"/>
+ <colspec colname='c3' colwidth="1*"/>
+ <colspec colname='c4' colwidth="1*"/>
+ <colspec colname='c5' colwidth="1*"/>
+ <colspec colname='c6' colwidth="1*"/>
+ <colspec colname='c7' colwidth="1*"/>
+ <colspec colname='c8' colwidth="1*"/>
+ <thead>
+ <row>
+ <entry>继æ¿çç¥(Inheritance strategy)</entry>
+ <entry>å¤æå¤å¯¹ä¸</entry>
+ <entry>å¤æä¸å¯¹ä¸</entry>
+ <entry>å¤æä¸å¯¹å¤</entry>
+ <entry>å¤æå¤å¯¹å¤</entry>
+ <entry>å¤æ <literal>load()/get()</literal></entry>
+ <entry>å¤ææ¥è¯¢</entry>
+ <entry>å¤æè¿æ¥(join)</entry>
+ <entry>å¤è¿æ¥(Outer join)读å</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+
+ <entry>æ¯ä¸ªç±»åå±ç»æä¸å¼ 表</entry>
+ <entry><literal><many-to-one></literal></entry>
+ <entry><literal><one-to-one></literal></entry>
+ <entry><literal><one-to-many></literal></entry>
+ <entry><literal><many-to-many></literal></entry>
+ <entry><literal>s.get(Payment.class, id)</literal></entry>
+ <entry><literal>from Payment p</literal></entry>
+ <entry><literal>from Order o join o.payment p</literal></entry>
+ <entry><emphasis>æ¯æ</emphasis></entry>
+ </row>
+ <row>
+ <entry>æ¯ä¸ªåç±»ä¸å¼ 表</entry>
+ <entry><literal><many-to-one></literal></entry>
+ <entry><literal><one-to-one></literal></entry>
+ <entry><literal><one-to-many></literal></entry>
+ <entry><literal><many-to-many></literal></entry>
+ <entry><literal>s.get(Payment.class, id)</literal></entry>
+ <entry><literal>from Payment p</literal></entry>
+ <entry><literal>from Order o join o.payment p</literal></entry>
+ <entry><emphasis>æ¯æ</emphasis></entry>
+ </row>
+ <row>
+
+ <entry>æ¯ä¸ªå
·ä½ç±»ä¸å¼ 表(union-subclass)</entry>
+ <entry><literal><many-to-one></literal></entry>
+ <entry><literal><one-to-one></literal></entry>
+ <entry><literal><one-to-many></literal> (ä»
对äº<literal>inverse="true"</literal>çæ
åµ)</entry>
+ <entry><literal><many-to-many></literal></entry>
+ <entry><literal>s.get(Payment.class, id)</literal></entry>
+ <entry><literal>from Payment p</literal></entry>
+ <entry><literal>from Order o join o.payment p</literal></entry>
+ <entry><emphasis>æ¯æ</emphasis></entry>
+ </row>
+ <row>
+
+ <entry>æ¯ä¸ªå
·ä½ç±»ä¸å¼ 表(éå¼å¤æ)</entry>
+ <entry><literal><any></literal></entry>
+ <entry><emphasis>ä¸æ¯æ</emphasis></entry>
+ <entry><emphasis>ä¸æ¯æ</emphasis></entry>
+ <entry><literal><many-to-any></literal></entry>
+ <entry><literal>s.createCriteria(Payment.class).add( Restrictions.idEq(id) ).uniqueResult()</literal></entry>
+ <entry><literal>from Payment p</literal></entry>
+ <entry><emphasis>ä¸æ¯æ</emphasis></entry>
+ <entry><emphasis>ä¸æ¯æ</emphasis></entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </table>
+
+ </sect1>
+
+ </chapter>
Copied: core/trunk/documentation/manual/zh-CN/src/main/docbook/content/performance.xml (from rev 14080, core/trunk/documentation/manual/zh-CN/src/main/docbook/modules/performance.xml)
===================================================================
--- core/trunk/documentation/manual/zh-CN/src/main/docbook/content/performance.xml (rev 0)
+++ core/trunk/documentation/manual/zh-CN/src/main/docbook/content/performance.xml 2007-10-09 20:10:34 UTC (rev 14081)
@@ -0,0 +1,1315 @@
+<chapter id="performance">
+ <title>æåæ§è½
+ </title>
+ <sect1 id="performance-fetching" revision="2">
+ <title>
+ æåçç¥(Fetching strategies)
+ </title>
+
+ <para>
+
+ <emphasis>æåçç¥ï¼fetching strategyï¼</emphasis> æ¯æï¼å½åºç¨ç¨åºéè¦å¨ï¼Hibernateå®ä½å¯¹è±¡å¾çï¼å
³èå
³ç³»é´è¿è¡å¯¼èªçæ¶åï¼
+ Hibernateå¦ä½è·åå
³è对象ççç¥ãæåçç¥å¯ä»¥å¨O/Ræ å°çå
æ°æ®ä¸å£°æï¼ä¹å¯ä»¥å¨ç¹å®çHQL
+ æ<literal>æ¡ä»¶æ¥è¯¢ï¼Criteria Queryï¼</literal>ä¸é载声æã
+ </para>
+
+ <para>
+ Hibernate3 å®ä¹äºå¦ä¸å ç§æåçç¥ï¼
+ </para>
+
+ <itemizedlist>
+ <listitem>
+ <para>
+
+ <emphasis>è¿æ¥æåï¼Join fetchingï¼</emphasis> - Hibernateéè¿
+ å¨<literal>SELECT</literal>è¯å¥ä½¿ç¨<literal>OUTER JOIN</literal>ï¼å¤è¿æ¥ï¼æ¥
+ è·å¾å¯¹è±¡çå
³èå®ä¾æè
å
³èéåã
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+
+ <emphasis>æ¥è¯¢æåï¼Select fetchingï¼</emphasis> - å¦å¤åéä¸æ¡ <literal>SELECT</literal>
+ è¯å¥æåå½å对象çå
³èå®ä½æéåãé¤éä½ æ¾å¼çæå®<literal>lazy="false"</literal>ç¦æ¢
+ 延è¿æåï¼lazy fetchingï¼ï¼å¦ååªæå½ä½ çæ£è®¿é®å
³èå
³ç³»çæ¶åï¼æä¼æ§è¡ç¬¬äºæ¡selectè¯å¥ã
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ <emphasis>åæ¥è¯¢æåï¼Subselect fetchingï¼</emphasis> - å¦å¤åéä¸æ¡<literal>SELECT</literal>
+ è¯å¥æåå¨åé¢æ¥è¯¢å°ï¼æè
æåå°ï¼çææå®ä½å¯¹è±¡çå
³èéåãé¤éä½ æ¾å¼çæå®<literal>lazy="false"</literal>
+ ç¦æ¢å»¶è¿æåï¼lazy fetchingï¼ï¼å¦ååªæå½ä½ çæ£è®¿é®å
³èå
³ç³»çæ¶åï¼æä¼æ§è¡ç¬¬äºæ¡selectè¯å¥ã
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+
+ <emphasis>æ¹éæåï¼Batch fetchingï¼</emphasis> - 对æ¥è¯¢æåçä¼åæ¹æ¡ï¼
+ éè¿æå®ä¸ä¸ªä¸»é®æå¤é®å表ï¼Hibernate使ç¨åæ¡<literal>SELECT</literal>è¯å¥è·åä¸æ¹å¯¹è±¡å®ä¾æéåã
+ </para>
+ </listitem>
+ </itemizedlist>
+
+ <para>
+ Hibernateä¼åºåä¸ååç§æ
åµï¼
+ </para>
+
+ <itemizedlist>
+ <listitem>
+ <para>
+ <emphasis>Immediate fetchingï¼ç«å³æå</emphasis> - å½å®¿ä¸»è¢«å è½½æ¶ï¼å
³èãéåæå±æ§è¢«ç«å³æåã
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ <emphasis>Lazy collection fetchingï¼å»¶è¿éåæå</emphasis>- ç´å°åºç¨ç¨åºå¯¹éåè¿è¡äºä¸æ¬¡æä½æ¶ï¼éåæ被æåãï¼å¯¹éåèè¨è¿æ¯é»è®¤è¡ä¸ºãï¼
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ <emphasis>"Extra-lazy" collection fetching,"Extra-lazy"éåæå</emphasis> -对éåç±»ä¸çæ¯ä¸ªå
ç´ èè¨ï¼é½æ¯ç´å°éè¦æ¶æå»è®¿é®æ°æ®åºãé¤éç»å¯¹å¿
è¦ï¼Hibernateä¸ä¼è¯å¾å»ææ´ä¸ªéåé½æåå°å
åéæ¥ï¼éç¨äºé常大çéåï¼ã
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ <emphasis>Proxy fetchingï¼ä»£çæå</emphasis> - 对è¿ååå¼çå
³èèè¨ï¼å½å
¶æ个æ¹æ³è¢«è°ç¨ï¼èé对å
¶å
³é®åè¿è¡getæä½æ¶ææåã
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ <emphasis>"No-proxy" fetching,é代çæå</emphasis> - 对è¿ååå¼çå
³èèè¨ï¼å½å®ä¾åé被访é®çæ¶åè¿è¡æåãä¸ä¸é¢ç代çæåç¸æ¯ï¼è¿ç§æ¹æ³æ²¡æé£ä¹â延è¿âå¾å害(å°±ç®åªè®¿é®æ è¯ç¬¦ï¼ä¹ä¼å¯¼è´å
³èæå)ä½æ¯æ´å éæï¼å 为对åºç¨ç¨åºæ¥è¯´ï¼ä¸åçå°proxyãè¿ç§æ¹æ³éè¦å¨ç¼è¯æé´è¿è¡åèç å¢å¼ºæä½ï¼å æ¤å¾å°éè¦ç¨å°ã
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ <emphasis>Lazy attribute fetchingï¼å±æ§å»¶è¿å è½½</emphasis> - 对å±æ§æè¿ååå¼çå
³èèè¨ï¼å½å
¶å®ä¾åé被访é®çæ¶åè¿è¡æåãéè¦ç¼è¯æåèç 强åï¼å æ¤è¿ä¸æ¹æ³å¾å°æ¯å¿
è¦çã
+ </para>
+ </listitem>
+ </itemizedlist>
+
+ <para>
+ è¿éæ两个æ£äº¤çæ¦å¿µï¼å
³è<emphasis>ä½æ¶</emphasis>被æåï¼ä»¥å被<emphasis>å¦ä½</emphasis>æåï¼ä¼éç¨ä»ä¹æ ·çSQLè¯å¥ï¼ãä¸è¦æ··æ·å®ä»¬ï¼æ们使ç¨<literal>æå</literal>æ¥æ¹åæ§è½ãæ们使ç¨<literal>延è¿</literal>æ¥å®ä¹ä¸äºå¥çº¦ï¼å¯¹æç¹å®ç±»çæ个è±ç®¡çå®ä¾ï¼ç¥éæåªäºæ°æ®æ¯å¯ä»¥ä½¿ç¨çã
+ </para>
+
+ <sect2 id="performance-fetching-lazy">
+ <title>æä½å»¶è¿å è½½çå
³è</title>
+
+ <para>
+ é»è®¤æ
åµä¸ï¼Hibernate 3对éå使ç¨å»¶è¿selectæåï¼å¯¹è¿ååå¼çå
³è使ç¨å»¶è¿ä»£çæåã对å ä¹æ¯ææçåºç¨èè¨ï¼å
¶ç»å¤§å¤æ°çå
³èï¼è¿ç§çç¥é½æ¯ææçã
+ </para>
+
+ <para>
+ <emphasis>注æ:</emphasis>åè¥ä½ 设置äº<literal>hibernate.default_batch_fetch_size</literal>,Hibernateä¼å¯¹å»¶è¿å è½½éåæ¹éæåä¼åæªæ½ï¼è¿ç§ä¼åä¹å¯è½ä¼å¨æ´ç»åç级å«æå¼ï¼ã
+ </para>
+
+ <para>
+ ç¶èï¼ä½ å¿
é¡»äºè§£å»¶è¿æå带æ¥çä¸ä¸ªé®é¢ãå¨ä¸ä¸ªæå¼çHibernate sessionä¸ä¸æä¹å¤è°ç¨å»¶è¿éåä¼å¯¼è´ä¸æ¬¡æå¤ãæ¯å¦ï¼
+ </para>
+
+ <programlisting><![CDATA[s = sessions.openSession();
+Transaction tx = s.beginTransaction();
+
+User u = (User) s.createQuery("from User u where u.name=:userName")
+ .setString("userName", userName).uniqueResult();
+Map permissions = u.getPermissions();
+
+tx.commit();
+s.close();
+
+Integer accessLevel = (Integer) permissions.get("accounts"); // Error!]]></programlisting>
+
+ <para>
+ å¨<literal>Session</literal>å
³éåï¼permessionséåå°æ¯æªå®ä¾åçãä¸åå¯ç¨ï¼å æ¤æ æ³æ£å¸¸è½½å
¥å
¶ç¶æã
+ <emphasis>Hibernate对è±ç®¡å¯¹è±¡ä¸æ¯æ延è¿å®ä¾å</emphasis>. è¿éçä¿®æ¹æ¹æ³æ¯ï¼å°permissions读åæ°æ®ç代ç
+ 移å°tx.commit()ä¹åã
+ </para>
+
+ <para>
+ é¤æ¤ä¹å¤ï¼éè¿å¯¹å
³èæ å°æå®<literal>lazy="false"</literal>,æ们ä¹å¯ä»¥ä½¿ç¨é延è¿çéåæå
³èãä½æ¯ï¼
+ 对ç»å¤§é¨åéåæ¥è¯´ï¼æ´æ¨è使ç¨å»¶è¿æ¹å¼æåæ°æ®ãå¦æå¨ä½ ç对象模åä¸å®ä¹äºå¤ªå¤çé延è¿å
³èï¼Hibernateæç»å ä¹éè¦å¨æ¯ä¸ªäºå¡ä¸è½½å
¥æ´ä¸ªæ°æ®åºå°å
åä¸ï¼
+ </para>
+
+ <para>
+
+ ä½æ¯ï¼å¦ä¸æ¹é¢ï¼å¨ä¸äºç¹æ®çäºå¡ä¸ï¼æ们ä¹ç»å¸¸éè¦ä½¿ç¨å°è¿æ¥æåï¼å®æ¬èº«ä¸å°±æ¯é延è¿çï¼ï¼ä»¥ä»£æ¿æ¥è¯¢æåã
+ ä¸é¢æ们å°ä¼å¾å¿«æç½å¦ä½å
·ä½çå®å¶Hibernateä¸çæåçç¥ãå¨Hibernate3ä¸ï¼å
·ä½éæ©åªç§æåçç¥çæºå¶æ¯åéæ©
+ åå¼å
³èæéåå
³èç¸ä¸è´çã
+ </para>
+ </sect2>
+
+
+ <sect2 id="performance-fetching-custom" revision="4">
+ <title>
+
+ è°æ´æåçç¥ï¼Tuning fetch strategiesï¼
+ </title>
+
+ <para>
+
+ æ¥è¯¢æåï¼é»è®¤çï¼å¨N+1æ¥è¯¢çæ
åµä¸æ¯æå
¶èå¼±çï¼å æ¤æ们å¯è½ä¼è¦æ±å¨æ å°ææ¡£ä¸å®ä¹ä½¿ç¨è¿æ¥æåï¼
+ </para>
+ <programlisting><![CDATA[<set name="permissions"
+ fetch="join">
+ <key column="userId"/>
+ <one-to-many class="Permission"/>
+</set]]></programlisting>
+
+ <programlisting><![CDATA[<many-to-one name="mother" class="Cat" fetch="join"/>]]></programlisting>
+
+ <para>
+ å¨æ å°ææ¡£ä¸å®ä¹ç<literal>æå</literal>çç¥å°ä¼å¯¹ä»¥ä¸å表æ¡ç®äº§çå½±åï¼
+ </para>
+
+ <itemizedlist>
+ <listitem>
+ <para>
+
+ éè¿<literal>get()</literal>æ<literal>load()</literal>æ¹æ³åå¾æ°æ®ã
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ åªæå¨å
³èä¹é´è¿è¡å¯¼èªæ¶ï¼æä¼éå¼çåå¾æ°æ®ã
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ <literal>æ¡ä»¶æ¥è¯¢</literal>
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ 使ç¨äº<literal>subselect</literal>æåçHQLæ¥è¯¢
+ </para>
+ </listitem>
+ </itemizedlist>
+
+ <para>
+ ä¸ç®¡ä½ 使ç¨åªç§æåçç¥ï¼å®ä¹ä¸ºé延è¿çç±»å¾ä¼è¢«ä¿è¯ä¸å®è£
è½½å
¥å
åã注æè¿å¯è½æå³çå¨ä¸æ¡HQLæ¥è¯¢åç´§è·çä¸ç³»åçæ¥è¯¢ã
+ </para>
+
+ <para>
+ é常æ
åµä¸ï¼æ们并ä¸ä½¿ç¨æ å°ææ¡£è¿è¡æåçç¥çå®å¶ãæ´å¤çæ¯ï¼ä¿æå
¶é»è®¤å¼ï¼ç¶åå¨ç¹å®çäºå¡ä¸ï¼
+ 使ç¨HQLç<literal>å·¦è¿æ¥æåï¼left join fetchï¼</literal> 对å
¶è¿è¡éè½½ãè¿å°éç¥
+ Hibernateå¨ç¬¬ä¸æ¬¡æ¥è¯¢ä¸ä½¿ç¨å¤é¨å
³èï¼outer joinï¼ï¼ç´æ¥å¾å°å
¶å
³èæ°æ®ã
+ å¨<literal>æ¡ä»¶æ¥è¯¢</literal> APIä¸ï¼åºè¯¥è°ç¨ <literal>setFetchMode(FetchMode.JOIN)</literal>è¯å¥ã
+ </para>
+
+ <para>
+ ä¹è®¸ä½ å欢ä»
ä»
éè¿æ¡ä»¶æ¥è¯¢ï¼å°±å¯ä»¥æ¹å<literal>get()</literal>
+ æ <literal>load()</literal>è¯å¥ä¸çæ°æ®æåçç¥ãä¾å¦ï¼
+ </para>
+
+ <programlisting><![CDATA[User user = (User) session.createCriteria(User.class)
+ .setFetchMode("permissions", FetchMode.JOIN)
+ .add( Restrictions.idEq(userId) )
+ .uniqueResult();]]></programlisting>
+
+ <para>
+
+ ï¼è¿å°±æ¯å
¶ä»ORM解å³æ¹æ¡çâæå计å(fetch plan)âå¨Hibernateä¸ççä»·ç©ãï¼
+ </para>
+
+
+ <para>
+ æªç¶ä¸åçä¸ç§é¿å
N+1次æ¥è¯¢çæ¹æ³æ¯ï¼ä½¿ç¨äºçº§ç¼åã
+ </para>
+
+ </sect2>
+
+ <sect2 id="performance-fetching-proxies" revision="2">
+ <title>å端å
³è代çï¼Single-ended association proxiesï¼
+ </title>
+
+ <para>
+ å¨Hinerbateä¸ï¼å¯¹éåç延è¿æåçéç¨äºèªå·±çå®ç°æ¹æ³ãä½æ¯ï¼å¯¹äºå端å
³èç延è¿æåï¼åéè¦éç¨
+ å
¶ä»ä¸åçæºå¶ãå端å
³èçç®æ å®ä½å¿
须使ç¨ä»£çï¼Hihernateå¨è¿è¡æäºè¿å¶çº§ï¼éè¿ä¼å¼çCGLIBåºï¼ï¼
+ 为æä¹
对象å®ç°äºå»¶è¿è½½å
¥ä»£çã
+ </para>
+
+ <para>
+ é»è®¤çï¼Hibernate3å°ä¼ä¸ºææçæä¹
对象产ç代çï¼å¨å¯å¨é¶æ®µï¼ï¼ç¶å使ç¨ä»ä»¬å®ç°
+ <literal>å¤å¯¹ä¸ï¼many-to-oneï¼</literal>å
³èå<literal>ä¸å¯¹ä¸ï¼one-to-oneï¼</literal>
+ å
³èç延è¿æåã
+ </para>
+
+ <para>
+ å¨æ å°æ件ä¸ï¼å¯ä»¥éè¿è®¾ç½®<literal>proxy</literal>å±æ§ä¸ºç®æ class声æä¸ä¸ªæ¥å£ä¾ä»£çæ¥å£ä½¿ç¨ã
+ é»è®¤çï¼Hibernateå°ä¼ä½¿ç¨è¯¥ç±»çä¸ä¸ªåç±»ã
+ <emphasis>注æï¼è¢«ä»£ççç±»å¿
é¡»å®ç°ä¸ä¸ªè³å°å
å¯è§çé»è®¤æé å½æ°ï¼æ们建议ææçæä¹
ç±»é½åºæ¥æè¿æ ·çæé å½æ°</emphasis>
+ </para>
+
+ <para>
+ å¨å¦æ¤æ¹å¼å®ä¹ä¸ä¸ªå¤æç±»çæ¶åï¼æ许å¤å¼å¾æ³¨æç常è§æ§çé®é¢ï¼ä¾å¦ï¼
+ </para>
+
+ <programlisting><![CDATA[<class name="Cat" proxy="Cat">
+ ......
+ <subclass name="DomesticCat">
+ .....
+ </subclass>
+</class>]]></programlisting>
+
+ <para>
+ é¦å
ï¼<literal>Cat</literal>å®ä¾æ°¸è¿ä¸å¯ä»¥è¢«å¼ºå¶è½¬æ¢ä¸º<literal>DomesticCat</literal>,
+ å³ä½¿å®æ¬èº«å°±æ¯<literal>DomesticCat</literal>å®ä¾ã
+ </para>
+
+ <programlisting><![CDATA[Cat cat = (Cat) session.load(Cat.class, id); // instantiate a proxy (does not hit the db)
+if ( cat.isDomesticCat() ) { // hit the db to initialize the proxy
+ DomesticCat dc = (DomesticCat) cat; // Error!
+ ....
+}]]></programlisting>
+
+ <para>
+ å
¶æ¬¡ï¼ä»£ççâ<literal>==</literal>âå¯è½ä¸åæç«ã
+ </para>
+
+ <programlisting><![CDATA[Cat cat = (Cat) session.load(Cat.class, id); // instantiate a Cat proxy
+DomesticCat dc =
+ (DomesticCat) session.load(DomesticCat.class, id); // acquire new DomesticCat proxy!
+System.out.println(cat==dc); // false]]></programlisting>
+
+ <para>
+ è½ç¶å¦æ¤ï¼ä½å®é
æ
åµå¹¶æ²¡æçä¸å»é£ä¹ç³ç³ãè½ç¶æ们ç°å¨æ两个ä¸åçå¼ç¨ï¼åå«æåè¿ä¸¤ä¸ªä¸åç代ç对象ï¼
+ ä½å®é
ä¸ï¼å
¶åºå±åºè¯¥æ¯åä¸ä¸ªå®ä¾å¯¹è±¡ï¼
+ </para>
+
+ <programlisting><![CDATA[cat.setWeight(11.0); // hit the db to initialize the proxy
+System.out.println( dc.getWeight() ); // 11.0]]></programlisting>
+
+ <para>
+ 第ä¸ï¼ä½ ä¸è½å¯¹âfinalç±»âæâå
·æfinalæ¹æ³çç±»â使ç¨CGLIB代çã
+ </para>
+
+ <para>
+ æåï¼å¦æä½ çæä¹
å对象å¨å®ä¾åæ¶éè¦æäºèµæºï¼ä¾å¦ï¼å¨å®ä¾åæ¹æ³ãé»è®¤æé æ¹æ³ä¸ï¼ï¼
+ é£ä¹ä»£ç对象ä¹åæ ·éè¦ä½¿ç¨è¿äºèµæºãå®é
ä¸ï¼ä»£çç±»æ¯æä¹
åç±»çåç±»ã
+ </para>
+
+ <para>
+
+ è¿äºé®é¢é½æºäºJavaçåæ ¹ç»§æ¿æ¨¡åç天çéå¶ãå¦æä½ å¸æé¿å
è¿äºé®é¢ï¼é£ä¹ä½ çæ¯ä¸ªæä¹
åç±»å¿
é¡»å®ç°ä¸ä¸ªæ¥å£ï¼
+ å¨æ¤æ¥å£ä¸å·²ç»å£°æäºå
¶ä¸å¡æ¹æ³ãç¶åï¼ä½ éè¦å¨æ å°ææ¡£ä¸åæå®è¿äºæ¥å£ãä¾å¦ï¼
+ </para>
+
+ <programlisting><![CDATA[<class name="CatImpl" proxy="Cat">
+ ......
+ <subclass name="DomesticCatImpl" proxy="DomesticCat">
+ .....
+ </subclass>
+</class>]]></programlisting>
+
+ <para>
+
+ è¿é<literal>CatImpl</literal>å®ç°äº<literal>Cat</literal>æ¥å£ï¼
+ <literal>DomesticCatImpl</literal>å®ç°<literal>DomesticCat</literal>æ¥å£ã
+ å¨<literal>load()</literal>ã<literal>iterate()</literal>æ¹æ³ä¸å°±ä¼è¿å
+ <literal>Cat</literal>å<literal>DomesticCat</literal>ç代ç对象ã
+ (注æ<literal>list()</literal>并ä¸ä¼è¿å代ç对象ã)
+ </para>
+
+ <programlisting><![CDATA[Cat cat = (Cat) session.load(CatImpl.class, catid);
+Iterator iter = session.createQuery("from CatImpl as cat where cat.name='fritz'").iterate();
+Cat fritz = (Cat) iter.next();]]></programlisting>
+
+ <para>
+
+ è¿éï¼å¯¹è±¡ä¹é´çå
³ç³»ä¹å°è¢«å»¶è¿è½½å
¥ãè¿å°±æå³çï¼ä½ åºè¯¥å°å±æ§å£°æ为<literal>Cat</literal>ï¼èä¸æ¯<literal>CatImpl</literal>ã
+ </para>
+
+ <para>
+
+ ä½æ¯ï¼å¨æäºæ¹æ³ä¸æ¯<emphasis>ä¸éè¦</emphasis>使ç¨ä»£ççãä¾å¦ï¼
+ </para>
+
+ <itemizedlist spacing="compact">
+ <listitem>
+ <para>
+ <literal>equals()</literal>æ¹æ³ï¼å¦ææä¹
类没æéè½½<literal>equals()</literal>æ¹æ³ã
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ <literal>hashCode()</literal>æ¹æ³ï¼å¦ææä¹
类没æéè½½<literal>hashCode()</literal>æ¹æ³ã
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ æ å¿ç¬¦çgetteræ¹æ³ã
+ </para>
+ </listitem>
+ </itemizedlist>
+
+ <para>
+ Hibernateå°ä¼è¯å«åºé£äºéè½½äº<literal>equals()</literal>ãæ<literal>hashCode()</literal>æ¹æ³çæä¹
åç±»ã
+ </para>
+ <para>
+ è¥éæ©<literal>lazy="no-proxy"</literal>èéé»è®¤ç<literal>lazy="proxy"</literal>ï¼æ们å¯ä»¥é¿å
ç±»å转æ¢å¸¦æ¥çé®é¢ãç¶èï¼è¿æ ·æ们就éè¦ç¼è¯æåèç å¢å¼ºï¼å¹¶ä¸ææçæä½é½ä¼å¯¼è´ç«å»è¿è¡ä»£çåå§åã
+
+ </para>
+
+ </sect2>
+
+ <sect2 id="performance-fetching-initialization" revision="1">
+ <title>å®ä¾åéåå代çï¼Initializing collections and proxiesï¼
+ </title>
+
+ <para>
+ å¨<literal>Session</literal>èå´ä¹å¤è®¿é®æªåå§åçéåæ代çï¼Hibernateå°ä¼æåº<literal>LazyInitializationException</literal>å¼å¸¸ã
+ ä¹å°±æ¯è¯´ï¼å¨å离ç¶æä¸ï¼è®¿é®ä¸ä¸ªå®ä½ææ¥æçéåï¼æè
访é®å
¶æå代ççå±æ§æ¶ï¼ä¼å¼åæ¤å¼å¸¸ã
+ </para>
+
+ <para>
+
+ ææ¶åæ们éè¦ä¿è¯æ个代çæè
éåå¨Sessionå
³éå就已ç»è¢«åå§åäºã
+ å½ç¶ï¼æ们å¯ä»¥éè¿å¼ºè¡è°ç¨<literal>cat.getSex()</literal>æè
<literal>cat.getKittens().size()</literal>ä¹ç±»çæ¹æ³æ¥ç¡®ä¿è¿ä¸ç¹ã
+ ä½æ¯è¿æ ·çç¨åºä¼é æ读è
ççæï¼ä¹ä¸ç¬¦åé常ç代ç è§èã
+ </para>
+
+ <para>
+
+ éææ¹æ³<literal>Hibernate.initialized()</literal>
+ ä¸ºä½ çåºç¨ç¨åºæä¾äºä¸ä¸ªä¾¿æ·çéå¾æ¥å»¶è¿å è½½éåæ代çã
+ åªè¦å®çSessionå¤äºopenç¶æï¼<literal>Hibernate.initialize(cat)</literal> å°ä¼ä¸ºcat强å¶å¯¹ä»£çå®ä¾åã
+ åæ ·ï¼<literal>Hibernate.initialize( cat.getKittens() )</literal> 对kittensçéåå
·æåæ ·çåè½ã
+ </para>
+
+ <para>
+
+ è¿æå¦å¤ä¸ç§éæ©ï¼å°±æ¯ä¿æ<literal>Session</literal>ä¸ç´å¤äºopenç¶æï¼ç´å°ææéè¦çéåæ代çé½è¢«è½½å
¥ã
+ å¨æäºåºç¨æ¶æä¸ï¼ç¹å«æ¯å¯¹äºé£äºä½¿ç¨Hibernateè¿è¡æ°æ®è®¿é®ç代ç ï¼ä»¥åé£äºå¨ä¸ååºç¨å±åä¸åç©çè¿ç¨ä¸ä½¿ç¨Hibernateç代ç ã
+ å¨éåå®ä¾åæ¶ï¼å¦ä½ä¿è¯<literal>Session</literal>å¤äºopenç¶æç»å¸¸ä¼æ¯ä¸ä¸ªé®é¢ãæ两ç§æ¹æ³å¯ä»¥è§£å³æ¤é®é¢ï¼
+ </para>
+
+ <itemizedlist>
+ <listitem>
+ <para>
+ å¨ä¸ä¸ªåºäºWebçåºç¨ä¸ï¼å¯ä»¥å©ç¨servletè¿æ»¤å¨ï¼filterï¼ï¼å¨ç¨æ·è¯·æ±ï¼requestï¼ç»æã页é¢çæ
+ ç»ææ¶å
³é<literal>Session</literal>ï¼è¿é使ç¨äº<emphasis>å¨å±ç¤ºå±ä¿ææå¼Session模å¼ï¼Open Session in Viewï¼</emphasis>ï¼ï¼
+ å½ç¶ï¼è¿å°ä¾èµäºåºç¨æ¡æ¶ä¸å¼å¸¸éè¦è¢«æ£ç¡®çå¤çãå¨è¿åçé¢ç»ç¨æ·ä¹åï¼ä¹è³å¨çæçé¢è¿ç¨ä¸åçå¼å¸¸çæ
åµä¸ï¼
+ æ£ç¡®å
³é<literal>Session</literal>åç»æäºå¡å°æ¯é常éè¦çï¼
+ 请åè§Hibernate wikiä¸ç"Open Session in View"模å¼ï¼ä½ å¯ä»¥æ¾å°ç¤ºä¾ã
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+
+ å¨ä¸ä¸ªæ¥æåç¬ä¸å¡å±çåºç¨ä¸ï¼ä¸å¡å±å¿
é¡»å¨è¿åä¹åï¼ä¸ºwebå±âåå¤â好å
¶æéçæ°æ®éåãè¿å°±æå³ç
+ ä¸å¡å±åºè¯¥è½½å
¥ææ表ç°å±/webå±æéçæ°æ®ï¼å¹¶å°è¿äºå·²å®ä¾åå®æ¯çæ°æ®è¿åãé常ï¼åºç¨ç¨åºåºè¯¥
+ 为webå±æéçæ¯ä¸ªéåè°ç¨<literal>Hibernate.initialize()</literal>ï¼è¿ä¸ªè°ç¨å¿
é¡»åçå±sessionå
³éä¹åï¼ï¼
+ æè
使ç¨å¸¦æ<literal>FETCH</literal>ä»å¥ï¼æ<literal>FetchMode.JOIN</literal>çHibernateæ¥è¯¢ï¼
+ äºå
åå¾ææçæ°æ®éåãå¦æä½ å¨åºç¨ä¸ä½¿ç¨äº<emphasis>Command</emphasis>模å¼ï¼ä»£æ¿<emphasis>Session Facade</emphasis> ï¼
+ é£ä¹è¿é¡¹ä»»å¡å°ä¼åå¾ç®åçå¤ã
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ ä½ ä¹å¯ä»¥éè¿<literal>merge()</literal>æ<literal>lock()</literal>æ¹æ³ï¼å¨è®¿é®æªå®ä¾åçéåï¼æ代çï¼ä¹åï¼
+ 为å
åè½½å
¥ç对象ç»å®ä¸ä¸ªæ°ç<literal>Session</literal>ã
+ æ¾ç¶ï¼Hibernateå°ä¸ä¼ï¼ä¹ä¸<emphasis>åºè¯¥</emphasis>èªå¨å®æè¿äºä»»å¡ï¼å 为è¿å°å¼å
¥ä¸ä¸ªç¹æ®çäºå¡è¯ä¹ã
+ </para>
+ </listitem>
+ </itemizedlist>
+
+ <para>
+ ææ¶åï¼ä½ 并ä¸éè¦å®å
¨å®ä¾åæ´ä¸ªå¤§çéåï¼ä»
éè¦äºè§£å®çé¨åä¿¡æ¯ï¼ä¾å¦å
¶å¤§å°ï¼ãæè
éåçé¨åå
容ã
+ </para>
+
+ <para>
+
+ ä½ å¯ä»¥ä½¿ç¨éåè¿æ»¤å¨å¾å°å
¶éåç大å°ï¼èä¸å¿
å®ä¾åæ´ä¸ªéåï¼
+ </para>
+
+ <programlisting><![CDATA[( (Integer) s.createFilter( collection, "select count(*)" ).list().get(0) ).intValue()]]></programlisting>
+
+ <para>
+ è¿éç<literal>createFilter()</literal>æ¹æ³ä¹å¯ä»¥è¢«ç¨æ¥ææçæåéåçé¨åå
容ï¼èæ éå®ä¾åæ´ä¸ªéåï¼
+ </para>
+
+ <programlisting><![CDATA[s.createFilter( lazyCollection, "").setFirstResult(0).setMaxResults(10).list();]]></programlisting>
+
+ </sect2>
+
+ <sect2 id="performance-fetching-batch">
+ <title>使ç¨æ¹éæåï¼Using batch fetchingï¼
+ </title>
+
+ <para>
+ Hibernateå¯ä»¥å
åææç使ç¨æ¹éæåï¼ä¹å°±æ¯è¯´ï¼å¦æä»
ä¸ä¸ªè®¿é®ä»£çï¼æéåï¼ï¼é£ä¹Hibernateå°ä¸è½½å
¥å
¶ä»æªå®ä¾åç代çã
+ æ¹éæåæ¯å»¶è¿æ¥è¯¢æåçä¼åæ¹æ¡ï¼ä½ å¯ä»¥å¨ä¸¤ç§æ¹éæåæ¹æ¡ä¹é´è¿è¡éæ©ï¼å¨ç±»çº§å«åéå级å«ã
+ </para>
+
+ <para>
+
+ ç±»/å®ä½çº§å«çæ¹éæåå¾å®¹æç解ãåè®¾ä½ å¨è¿è¡æ¶å°éè¦é¢å¯¹ä¸é¢çé®é¢ï¼ä½ å¨ä¸ä¸ª<literal>Session</literal>ä¸è½½å
¥äº25个
+ <literal>Cat</literal>å®ä¾ï¼æ¯ä¸ª<literal>Cat</literal>å®ä¾é½æ¥æä¸ä¸ªå¼ç¨æå<literal>owner</literal>ï¼
+ å
¶æå<literal>Person</literal>ï¼è<literal>Person</literal>ç±»æ¯ä»£çï¼åæ¶<literal>lazy="true"</literal>ã
+ å¦æä½ å¿
é¡»éåæ´ä¸ªcatséåï¼å¯¹æ¯ä¸ªå
ç´ è°ç¨<literal>getOwner()</literal>æ¹æ³ï¼Hibernateå°ä¼é»è®¤çæ§è¡25次<literal>SELECT</literal>æ¥è¯¢ï¼
+ å¾å°å
¶ownerç代ç对象ãè¿æ¶ï¼ä½ å¯ä»¥éè¿å¨æ å°æ件ç<literal>Person</literal>å±æ§ï¼æ¾å¼å£°æ<literal>batch-size</literal>ï¼æ¹åå
¶è¡ä¸ºï¼
+
+ </para>
+
+ <programlisting><![CDATA[<class name="Person" batch-size="10">...</class>]]></programlisting>
+
+ <para>
+ éä¹ï¼Hibernateå°åªéè¦æ§è¡ä¸æ¬¡æ¥è¯¢ï¼åå«ä¸º10ã10ã 5ã
+ </para>
+
+ <para>
+ ä½ ä¹å¯ä»¥å¨éå级å«å®ä¹æ¹éæåãä¾å¦ï¼å¦ææ¯ä¸ª<literal>Person</literal>é½æ¥æä¸ä¸ªå»¶è¿è½½å
¥ç<literal>Cats</literal>éåï¼
+ ç°å¨ï¼<literal>Sesssion</literal>ä¸è½½å
¥äº10个person对象ï¼éåpersonéåå°ä¼å¼èµ·10次<literal>SELECT</literal>æ¥è¯¢ï¼
+ æ¯æ¬¡æ¥è¯¢é½ä¼è°ç¨<literal>getCats()</literal>æ¹æ³ãå¦æä½ å¨<literal>Person</literal>çæ å°å®ä¹é¨åï¼å
许对<literal>cats</literal>æ¹éæå,
+ é£ä¹ï¼Hibernateå°å¯ä»¥é¢å
æåæ´ä¸ªéåã请çä¾åï¼
+ </para>
+
+ <programlisting><![CDATA[<class name="Person">
+ <set name="cats" batch-size="3">
+ ...
+ </set>
+</class>]]></programlisting>
+
+ <para>
+ å¦ææ´ä¸ªç<literal>batch-size</literal>æ¯3ï¼ç¬è¯¯ï¼ï¼ï¼é£ä¹Hibernateå°ä¼åå次æ§è¡<literal>SELECT</literal>æ¥è¯¢ï¼
+ æç
§3ã3ã3ã1ç大å°åå«è½½å
¥æ°æ®ãè¿éçæ¯æ¬¡è½½å
¥çæ°æ®éè¿å
·ä½ä¾èµäºå½å<literal>Session</literal>ä¸æªå®ä¾åéåç个æ°ã
+ </para>
+
+ <para>
+ å¦æä½ ç模åä¸æåµå¥çæ ç¶ç»æï¼ä¾å¦å
¸åçå¸åï¼åæç»æï¼bill-of-materials patternï¼ï¼éåçæ¹éæåæ¯é常æç¨çã
+ ï¼å°½ç®¡å¨æ´å¤æ
åµä¸å¯¹æ è¿è¡è¯»åæ¶ï¼<emphasis>åµå¥éåï¼nested setï¼</emphasis>æ<emphasis>åæè·¯å¾(materialized path)</emphasis>ï¼ÃÃï¼
+ æ¯æ´å¥½ç解å³æ¹æ³ãï¼
+ </para>
+
+ </sect2>
+
+ <sect2 id="performance-fetching-subselect">
+ <title>使ç¨åæ¥è¯¢æåï¼Using subselect fetchingï¼
+ </title>
+ <para>
+ åè¥ä¸ä¸ªå»¶è¿éåæåå¼ä»£çéè¦æåï¼Hibernateä¼ä½¿ç¨ä¸ä¸ªsubselectéæ°è¿è¡åæ¥çæ¥è¯¢ï¼ä¸æ¬¡æ§è¯»å
¥ææçå®ä¾ãè¿åæ¹éæåçå®ç°æ¹æ³æ¯ä¸æ ·çï¼ä¸ä¼æç ´ç¢çå è½½ã
+ </para>
+
+ <!-- TODO: Write more about this -->
+ </sect2>
+
+ <sect2 id="performance-fetching-lazyproperties">
+ <title>使ç¨å»¶è¿å±æ§æåï¼Using lazy property fetchingï¼
+ </title>
+
+ <para>
+ Hibernate3对åç¬çå±æ§æ¯æ延è¿æåï¼è¿é¡¹ä¼åææ¯ä¹è¢«ç§°ä¸º<emphasis>ç»æåï¼fetch groupsï¼</emphasis>ã
+ 请注æï¼è¯¥ææ¯æ´å¤çå±äºå¸åºç¹æ§ãå¨å®é
åºç¨ä¸ï¼ä¼åè¡è¯»åæ¯ä¼åå读åæ´éè¦ãä½æ¯ï¼ä»
è½½å
¥ç±»çé¨åå±æ§å¨æäºç¹å®æ
åµä¸ä¼æç¨ï¼ä¾å¦å¨åæ表ä¸æ¥æå ç¾åæ°æ®ãæ°æ®æ¨¡åæ æ³æ¹å¨çæ
åµä¸ã
+ </para>
+
+ <para>
+
+ å¯ä»¥å¨æ å°æ件ä¸å¯¹ç¹å®çå±æ§è®¾ç½®<literal>lazy</literal>ï¼å®ä¹è¯¥å±æ§ä¸ºå»¶è¿è½½å
¥ã
+ </para>
+
+ <programlisting><![CDATA[<class name="Document">
+ <id name="id">
+ <generator class="native"/>
+ </id>
+ <property name="name" not-null="true" length="50"/>
+ <property name="summary" not-null="true" length="200" lazy="true"/>
+ <property name="text" not-null="true" length="2000" lazy="true"/>
+</class>]]></programlisting>
+
+ <para>
+
+ å±æ§ç延è¿è½½å
¥è¦æ±å¨å
¶ä»£ç æ建æ¶å å
¥äºè¿å¶æ示æ令ï¼bytecode instrumentationï¼ï¼å¦æä½ çæä¹
类代ç ä¸æªå«æè¿äºæ令ï¼
+ Hibernateå°ä¼å¿½ç¥è¿äºå±æ§ç延è¿è®¾ç½®ï¼ä»ç¶å°å
¶ç´æ¥è½½å
¥ã
+ </para>
+
+ <para>
+ ä½ å¯ä»¥å¨AntçTaskä¸ï¼è¿è¡å¦ä¸å®ä¹ï¼å¯¹æä¹
类代ç å å
¥âäºè¿å¶æ令ãâ
+ </para>
+
+ <programlisting><![CDATA[<target name="instrument" depends="compile">
+ <taskdef name="instrument" classname="org.hibernate.tool.instrument.InstrumentTask">
+ <classpath path="${jar.path}"/>
+ <classpath path="${classes.dir}"/>
+ <classpath refid="lib.class.path"/>
+ </taskdef>
+
+ <instrument verbose="true">
+ <fileset dir="${testclasses.dir}/org/hibernate/auction/model">
+ <include name="*.class"/>
+ </fileset>
+ </instrument>
+</target>]]></programlisting>
+
+ <para>
+
+ è¿æä¸ç§å¯ä»¥ä¼åçæ¹æ³ï¼å®ä½¿ç¨HQLææ¡ä»¶æ¥è¯¢çæå½±ï¼projectionï¼ç¹æ§ï¼å¯ä»¥é¿å
读åéå¿
è¦çåï¼
+ è¿ä¸ç¹è³å°å¯¹åªè¯»äºå¡æ¯é常æç¨çãå®æ éå¨ä»£ç æ建æ¶âäºè¿å¶æ令âå¤çï¼å æ¤æ¯ä¸ä¸ªæ´å å¼å¾éæ©ç解å³æ¹æ³ã
+ </para>
+
+ <para>
+ ææ¶ä½ éè¦å¨HQLä¸éè¿<literal>æåææå±æ§</literal>ï¼å¼ºè¡æåææå
容ã
+ </para>
+
+ </sect2>
+
+ </sect1>
+
+ <sect1 id="performance-cache" revision="1">
+ <title>äºçº§ç¼åï¼The Second Level Cacheï¼
+ </title>
+
+ <para>
+ Hibernateç<literal>Session</literal>å¨äºå¡çº§å«è¿è¡æä¹
åæ°æ®çç¼åæä½ã
+ å½ç¶ï¼ä¹æå¯è½åå«ä¸ºæ¯ä¸ªç±»ï¼æéå)ï¼é
ç½®é群ãæJVM级å«(<literal>SessionFactory级å«</literal>)çç¼åã
+ ä½ çè³å¯ä»¥ä¸ºä¹æå
¥ä¸ä¸ªé群çç¼åã注æï¼ç¼åæ°¸è¿ä¸ç¥éå
¶ä»åºç¨ç¨åºå¯¹æä¹
åä»åºï¼æ°æ®åºï¼å¯è½è¿è¡çä¿®æ¹
+ ï¼å³ä½¿å¯ä»¥å°ç¼åæ°æ®è®¾å®ä¸ºå®æ失æï¼ã
+ </para>
+
+ <para revision="1">
+ éè¿å¨<literal>hibernate.cache.provider_class</literal>å±æ§ä¸æå®<literal>org.hibernate.cache.CacheProvider</literal>çæ个å®ç°çç±»å,ä½ å¯ä»¥éæ©è®©Hibernate使ç¨åªä¸ªç¼åå®ç°ãHibernateæå
ä¸äºå¼æºç¼åå®ç°ï¼æä¾å¯¹å®ä»¬çå
ç½®æ¯æï¼è§ä¸è¡¨ï¼ãé¤æ¤ä¹å¤ï¼ä½ ä¹å¯ä»¥å®ç°ä½ èªå·±çå®ç°ï¼å°å®ä»¬æå
¥å°ç³»ç»ä¸ã注æï¼å¨3.2çæ¬ä¹åï¼é»è®¤ä½¿ç¨EhCache ä½ä¸ºç¼åå®ç°ï¼ä½ä»3.2èµ·å°±ä¸åè¿æ ·äºã
+ </para>
+
+ <table frame="topbot" id="cacheproviders" revision="1">
+ <title>
+ ç¼åçç¥æä¾åï¼Cache Providersï¼
+ </title>
+ <tgroup cols='5' align='left' colsep='1' rowsep='1'>
+ <colspec colname='c1' colwidth="1*"/>
+ <colspec colname='c2' colwidth="3*"/>
+ <colspec colname='c3' colwidth="1*"/>
+ <colspec colname='c4' colwidth="1*"/>
+ <colspec colname='c5' colwidth="1*"/>
+ <thead>
+ <row>
+ <entry>Cache</entry>
+ <entry>Provider class</entry>
+ <entry>Type</entry>
+ <entry>Cluster Safe</entry>
+ <entry>Query Cache Supported</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry>Hashtable (not intended for production use)</entry>
+ <entry><literal>org.hibernate.cache.HashtableCacheProvider</literal></entry>
+ <entry>memory</entry>
+ <entry></entry>
+ <entry>yes</entry>
+ </row>
+ <row>
+ <entry>EHCache</entry>
+ <entry><literal>org.hibernate.cache.EhCacheProvider</literal></entry>
+ <entry>memory, disk</entry>
+ <entry></entry>
+ <entry>yes</entry>
+ </row>
+ <row>
+ <entry>OSCache</entry>
+ <entry><literal>org.hibernate.cache.OSCacheProvider</literal></entry>
+ <entry>memory, disk</entry>
+ <entry>yes (clustered invalidation)</entry>
+ <entry>yes</entry>
+ </row>
+ <row>
+ <entry>SwarmCache</entry>
+ <entry><literal>org.hibernate.cache.SwarmCacheProvider</literal></entry>
+ <entry>clustered (ip multicast)</entry>
+ <entry>yes (clustered invalidation)</entry>
+ <entry></entry>
+ </row>
+ <row>
+ <entry>JBoss TreeCache</entry>
+ <entry><literal>org.hibernate.cache.TreeCacheProvider</literal></entry>
+ <entry>clustered (ip multicast), transactional</entry>
+ <entry>yes (replication)</entry>
+ <entry>yes (clock sync req.)</entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </table>
+
+ <sect2 id="performance-cache-mapping" revision="2">
+ <title>ç¼åæ å°ï¼Cache mappingsï¼
+ </title>
+
+ <para>
+ ç±»æè
éåæ å°çâ<literal><cache></literal>å
ç´ âå¯ä»¥æä¸åå½¢å¼ï¼
+ </para>
+
+ <programlistingco>
+ <areaspec>
+ <area id="cache1" coords="2 70"/>
+ <area id="cache2" coords="3 70"/>
+ <area id="cache3" coords="4 70"/>
+ </areaspec>
+ <programlisting><![CDATA[<cache
+ usage="transactional|read-write|nonstrict-read-write|read-only"
+ region="RegionName"
+ include="all|non-lazy"
+/>]]></programlisting>
+ <calloutlist>
+ <callout arearefs="cache1">
+ <para>
+
+ <literal>usage</literal>(å¿
é¡»)说æäºç¼åççç¥:
+ <literal>transactional</literal>ã
+ <literal>read-write</literal>ã
+ <literal>nonstrict-read-write</literal>æ
+ <literal>read-only</literal>ã
+ </para>
+ </callout>
+ <callout arearefs="cache2">
+ <para>
+ <literal>region</literal> (å¯é, é»è®¤ä¸ºç±»æè
éåçåå(class or
+ collection role name)) æå®ç¬¬äºçº§ç¼åçåºåå(name of the second level cache
+ region)
+
+ </para>
+ </callout>
+ <callout arearefs="cache3">
+ <para>
+ <literal>include</literal> (å¯é,é»è®¤ä¸º <literal>all</literal>)
+ <literal>non-lazy</literal> å½å±æ§çº§å»¶è¿æåæå¼æ¶, æ 记为<literal>lazy="true"</literal>çå®ä½çå±æ§å¯è½æ æ³è¢«ç¼å
+ </para>
+ </callout>
+ </calloutlist>
+ </programlistingco>
+
+ <para>
+ å¦å¤(é¦é?), ä½ å¯ä»¥å¨hibernate.cfg.xmlä¸æå®<literal><class-cache></literal>å
+ <literal><collection-cache></literal> å
ç´ ã
+ </para>
+
+ <para>
+
+ è¿éç<literal>usage</literal> å±æ§ææäº<emphasis>ç¼å并åçç¥ï¼cache concurrency strategyï¼</emphasis>ã
+ </para>
+
+ </sect2>
+
+ <sect2 id="performance-cache-readonly">
+ <title>çç¥ï¼åªè¯»ç¼åï¼Strategy: read onlyï¼
+ </title>
+
+ <para>
+ å¦æä½ çåºç¨ç¨åºåªé读åä¸ä¸ªæä¹
åç±»çå®ä¾ï¼èæ é对å
¶ä¿®æ¹ï¼
+ é£ä¹å°±å¯ä»¥å¯¹å
¶è¿è¡<literal>åªè¯»</literal> ç¼åãè¿æ¯æç®åï¼ä¹æ¯å®ç¨æ§æ好çæ¹æ³ãçè³å¨é群ä¸ï¼å®ä¹è½å®ç¾å°è¿ä½ã
+ </para>
+
+ <programlisting><![CDATA[<class name="eg.Immutable" mutable="false">
+ <cache usage="read-only"/>
+ ....
+</class>]]></programlisting>
+
+ </sect2>
+
+
+ <sect2 id="performance-cache-readwrite">
+ <title>
+ çç¥:读/åç¼åï¼Strategy: read/writeï¼
+ </title>
+
+ <para>
+
+ å¦æåºç¨ç¨åºéè¦æ´æ°æ°æ®ï¼é£ä¹ä½¿ç¨<literal>读/åç¼å</literal> æ¯è¾åéã
+ å¦æåºç¨ç¨åºè¦æ±âåºååäºå¡âçé离级å«ï¼serializable transaction isolation levelï¼ï¼é£ä¹å°±å³ä¸è½ä½¿ç¨è¿ç§ç¼åçç¥ã
+ å¦æå¨JTAç¯å¢ä¸ä½¿ç¨ç¼åï¼ä½ å¿
é¡»æå®<literal>hibernate.transaction.manager_lookup_class</literal>å±æ§çå¼ï¼
+ éè¿å®ï¼Hibernateæè½ç¥é该åºç¨ç¨åºä¸JTAç<literal>TransactionManager</literal>çå
·ä½çç¥ã
+ å¨å
¶å®ç¯å¢ä¸ï¼ä½ å¿
é¡»ä¿è¯å¨<literal>Session.close()</literal>ãæ<literal>Session.disconnect()</literal>è°ç¨åï¼
+ æ´ä¸ªäºå¡å·²ç»ç»æã å¦æä½ æ³å¨é群ç¯å¢ä¸ä½¿ç¨æ¤çç¥ï¼ä½ å¿
é¡»ä¿è¯åºå±çç¼åå®ç°æ¯æéå®(locking)ãHibernateå
ç½®çç¼åçç¥å¹¶ä¸æ¯æéå®åè½ã
+ </para>
+
+ <programlisting><![CDATA[<class name="eg.Cat" .... >
+ <cache usage="read-write"/>
+ ....
+ <set name="kittens" ... >
+ <cache usage="read-write"/>
+ ....
+ </set>
+</class>]]></programlisting>
+
+ </sect2>
+
+ <sect2 id="performance-cache-nonstrict">
+ <title>
+ çç¥:éä¸¥æ ¼è¯»/åç¼åï¼Strategy: nonstrict read/writeï¼
+ </title>
+
+ <para>
+
+ å¦æåºç¨ç¨åºåªå¶å°éè¦æ´æ°æ°æ®ï¼ä¹å°±æ¯è¯´ï¼ä¸¤ä¸ªäºå¡åæ¶æ´æ°åä¸è®°å½çæ
åµå¾ä¸å¸¸è§ï¼ï¼ä¹ä¸éè¦ååä¸¥æ ¼çäºå¡é离ï¼
+ é£ä¹æ¯è¾éå使ç¨<literal>éä¸¥æ ¼è¯»/åç¼å</literal>çç¥ãå¦æå¨JTAç¯å¢ä¸ä½¿ç¨è¯¥çç¥ï¼
+ ä½ å¿
须为å
¶æå®<literal>hibernate.transaction.manager_lookup_class</literal>å±æ§çå¼ï¼
+ å¨å
¶å®ç¯å¢ä¸ï¼ä½ å¿
é¡»ä¿è¯å¨<literal>Session.close()</literal>ãæ<literal>Session.disconnect()</literal>è°ç¨åï¼
+ æ´ä¸ªäºå¡å·²ç»ç»æã
+ </para>
+
+ </sect2>
+
+ <sect2 id="performance-cache-transactional">
+ <title>
+
+ çç¥:äºå¡ç¼åï¼transactionalï¼
+ </title>
+
+ <para>
+ Hibernateç<literal>äºå¡ç¼å</literal>çç¥æä¾äºå
¨äºå¡çç¼åæ¯æï¼
+ ä¾å¦å¯¹JBoss TreeCacheçæ¯æãè¿æ ·çç¼ååªè½ç¨äºJTAç¯å¢ä¸ï¼ä½ å¿
é¡»æå®
+ 为å
¶<literal>hibernate.transaction.manager_lookup_class</literal>å±æ§ã
+ </para>
+
+ </sect2>
+
+ <para>
+ 没æä¸ç§ç¼åæä¾åè½å¤æ¯æä¸åçææç¼å并åçç¥ãä¸è¡¨ä¸ååºäºåç§æä¾å¨ãåå
¶åèªéç¨ç并åçç¥ã
+ </para>
+
+ <table frame="topbot">
+ <title>
+ åç§ç¼åæä¾å对ç¼å并åçç¥çæ¯ææ
åµï¼Cache Concurrency Strategy Supportï¼
+ </title>
+ <tgroup cols='5' align='left' colsep='1' rowsep='1'>
+ <colspec colname='c1' colwidth="1*"/>
+ <colspec colname='c2' colwidth="1*"/>
+ <colspec colname='c3' colwidth="1*"/>
+ <colspec colname='c4' colwidth="1*"/>
+ <colspec colname='c5' colwidth="1*"/>
+ <thead>
+ <row>
+ <entry>Cache</entry>
+ <entry>read-only</entry>
+ <entry>nonstrict-read-write</entry>
+ <entry>read-write</entry>
+ <entry>transactional</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry>Hashtable (not intended for production use)</entry>
+ <entry>yes</entry>
+ <entry>yes</entry>
+ <entry>yes</entry>
+ <entry></entry>
+ </row>
+ <row>
+ <entry>EHCache</entry>
+ <entry>yes</entry>
+ <entry>yes</entry>
+ <entry>yes</entry>
+ <entry></entry>
+ </row>
+ <row>
+ <entry>OSCache</entry>
+ <entry>yes</entry>
+ <entry>yes</entry>
+ <entry>yes</entry>
+ <entry></entry>
+ </row>
+ <row>
+ <entry>SwarmCache</entry>
+ <entry>yes</entry>
+ <entry>yes</entry>
+ <entry></entry>
+ <entry></entry>
+ </row>
+ <row>
+ <entry>JBoss TreeCache</entry>
+ <entry>yes</entry>
+ <entry></entry>
+ <entry></entry>
+ <entry>yes</entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </table>
+
+ </sect1>
+
+ <sect1 id="performance-sessioncache" revision="2">
+ <title>
+ 管çç¼åï¼Managing the cachesï¼
+ </title>
+
+ <para>
+ æ 论ä½æ¶ï¼å½ä½ ç»<literal>save()</literal>ã<literal>update()</literal>æ
+ <literal>saveOrUpdate()</literal>æ¹æ³ä¼ éä¸ä¸ªå¯¹è±¡æ¶ï¼æ使ç¨<literal>load()</literal>ã
+ <literal>get()</literal>ã<literal>list()</literal>ã<literal>iterate()</literal>
+ æ<literal>scroll()</literal>æ¹æ³è·å¾ä¸ä¸ªå¯¹è±¡æ¶,
+ 该对象é½å°è¢«å å
¥å°<literal>Session</literal>çå
é¨ç¼åä¸ã
+ </para>
+ <para>
+ å½éåflush()æ¹æ³è¢«è°ç¨æ¶ï¼å¯¹è±¡çç¶æä¼åæ°æ®åºåå¾åæ¥ã
+ å¦æä½ ä¸å¸ææ¤åæ¥æä½åçï¼æè
ä½ æ£å¤ç大é对象ãéè¦å¯¹ææ管çå
åæ¶ï¼ä½ å¯ä»¥è°ç¨<literal>evict()</literal>
+ æ¹æ³ï¼ä»ä¸çº§ç¼åä¸å»æè¿äºå¯¹è±¡åå
¶éåã
+ </para>
+
+ <programlisting><![CDATA[ScrollableResult cats = sess.createQuery("from Cat as cat").scroll(); //a huge result set
+while ( cats.next() ) {
+ Cat cat = (Cat) cats.get(0);
+ doSomethingWithACat(cat);
+ sess.evict(cat);
+}]]></programlisting>
+
+ <para>
+ Sessionè¿æä¾äºä¸ä¸ª<literal>contains()</literal>æ¹æ³ï¼ç¨æ¥å¤ææ个å®ä¾æ¯å¦å¤äºå½åsessionçç¼åä¸ã
+ </para>
+
+ <para>
+ å¦è¥è¦æææç对象ä»sessionç¼åä¸å½»åºæ¸
é¤ï¼åéè¦è°ç¨<literal>Session.clear()</literal>ã
+ </para>
+
+ <para>
+ 对äºäºçº§ç¼åæ¥è¯´ï¼å¨<literal>SessionFactory</literal>ä¸å®ä¹äºè®¸å¤æ¹æ³ï¼
+ æ¸
é¤ç¼åä¸å®ä¾ãæ´ä¸ªç±»ãéåå®ä¾æè
æ´ä¸ªéåã
+ </para>
+
+ <programlisting><![CDATA[sessionFactory.evict(Cat.class, catId); //evict a particular Cat
+sessionFactory.evict(Cat.class); //evict all Cats
+sessionFactory.evictCollection("Cat.kittens", catId); //evict a particular collection of kittens
+sessionFactory.evictCollection("Cat.kittens"); //evict all kitten collections]]></programlisting>
+
+ <para>
+ <literal>CacheMode</literal>åæ°ç¨äºæ§å¶å
·ä½çSessionå¦ä½ä¸äºçº§ç¼åè¿è¡äº¤äºã
+ </para>
+
+ <itemizedlist>
+ <listitem>
+ <para>
+ <literal>CacheMode.NORMAL</literal> - ä»äºçº§ç¼åä¸è¯»ãåæ°æ®ã
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ <literal>CacheMode.GET</literal> - ä»äºçº§ç¼åä¸è¯»åæ°æ®ï¼ä»
å¨æ°æ®æ´æ°æ¶å¯¹äºçº§ç¼ååæ°æ®ã
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ <literal>CacheMode.PUT</literal> - ä»
åäºçº§ç¼ååæ°æ®ï¼ä½ä¸ä»äºçº§ç¼åä¸è¯»æ°æ®ã
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ <literal>CacheMode.REFRESH</literal> - ä»
åäºçº§ç¼ååæ°æ®ï¼ä½ä¸ä»äºçº§ç¼åä¸è¯»æ°æ®ãéè¿
+ <literal>hibernate.cache.use_minimal_puts</literal>ç设置ï¼å¼ºå¶äºçº§ç¼åä»æ°æ®åºä¸è¯»åæ°æ®ï¼å·æ°ç¼åå
容ã
+ </para>
+ </listitem>
+ </itemizedlist>
+
+ <para>
+ å¦è¥éè¦æ¥çäºçº§ç¼åææ¥è¯¢ç¼ååºåçå
容ï¼ä½ å¯ä»¥ä½¿ç¨<literal>ç»è®¡ï¼Statisticsï¼</literal> APIã
+ </para>
+
+ <programlisting><![CDATA[Map cacheEntries = sessionFactory.getStatistics()
+ .getSecondLevelCacheStatistics(regionName)
+ .getEntries();]]></programlisting>
+
+ <para>
+ æ¤æ¶ï¼ä½ å¿
é¡»æå·¥æå¼ç»è®¡é项ãå¯éçï¼ä½ å¯ä»¥è®©Hibernateæ´äººå·¥å¯è¯»çæ¹å¼ç»´æ¤ç¼åå
容ã
+ </para>
+
+ <programlisting><![CDATA[hibernate.generate_statistics true
+hibernate.cache.use_structured_entries true]]></programlisting>
+
+ </sect1>
+
+ <sect1 id="performance-querycache" revision="1">
+ <title>æ¥è¯¢ç¼åï¼The Query Cacheï¼
+ </title>
+
+ <para>
+ æ¥è¯¢çç»æéä¹å¯ä»¥è¢«ç¼åãåªæå½ç»å¸¸ä½¿ç¨åæ ·çåæ°è¿è¡æ¥è¯¢æ¶ï¼è¿æä¼æäºç¨å¤ã
+ è¦ä½¿ç¨æ¥è¯¢ç¼åï¼é¦å
ä½ å¿
é¡»æå¼å®ï¼
+ </para>
+
+ <programlisting><![CDATA[hibernate.cache.use_query_cache true]]></programlisting>
+
+ <para>
+
+ 该设置å°ä¼å建两个ç¼ååºå - ä¸ä¸ªç¨äºä¿åæ¥è¯¢ç»æé(<literal>org.hibernate.cache.StandardQueryCache</literal>)ï¼
+ å¦ä¸ä¸ªåç¨äºä¿åæè¿æ¥è¯¢çä¸ç³»å表çæ¶é´æ³(<literal>org.hibernate.cache.UpdateTimestampsCache</literal>)ã
+ 请注æï¼å¨æ¥è¯¢ç¼åä¸ï¼å®å¹¶ä¸ç¼åç»æéä¸æå
å«çå®ä½çç¡®åç¶æï¼å®åªç¼åè¿äºå®ä½çæ è¯ç¬¦å±æ§çå¼ã以ååå¼ç±»åçç»æã
+ æ以æ¥è¯¢ç¼åé常ä¼åäºçº§ç¼åä¸èµ·ä½¿ç¨ã
+ </para>
+
+ <para>
+
+ ç»å¤§å¤æ°çæ¥è¯¢å¹¶ä¸è½ä»æ¥è¯¢ç¼åä¸åçï¼æ以Hibernateé»è®¤æ¯ä¸è¿è¡æ¥è¯¢ç¼åçãå¦è¥éè¦è¿è¡ç¼åï¼è¯·è°ç¨
+ <literal>Query.setCacheable(true)</literal>æ¹æ³ãè¿ä¸ªè°ç¨ä¼è®©æ¥è¯¢å¨æ§è¡è¿ç¨ä¸æ¶å
ä»ç¼åä¸æ¥æ¾ç»æï¼
+ 并å°èªå·±çç»æéæ¾å°ç¼åä¸å»ã
+ </para>
+
+ <para>
+
+ å¦æä½ è¦å¯¹æ¥è¯¢ç¼åç失ææ¿çè¿è¡ç²¾ç¡®çæ§å¶ï¼ä½ å¿
é¡»è°ç¨<literal>Query.setCacheRegion()</literal>æ¹æ³ï¼
+ 为æ¯ä¸ªæ¥è¯¢æå®å
¶å½åçç¼ååºåã
+ </para>
+
+ <programlisting><![CDATA[List blogs = sess.createQuery("from Blog blog where blog.blogger = :blogger")
+ .setEntity("blogger", blogger)
+ .setMaxResults(15)
+ .setCacheable(true)
+ .setCacheRegion("frontpages")
+ .list();]]></programlisting>
+
+ <para>
+ å¦ææ¥è¯¢éè¦å¼ºè¡å·æ°å
¶æ¥è¯¢ç¼ååºåï¼é£ä¹ä½ åºè¯¥è°ç¨<literal>Query.setCacheMode(CacheMode.REFRESH)</literal>æ¹æ³ã
+ è¿å¯¹å¨å
¶ä»è¿ç¨ä¸ä¿®æ¹åºå±æ°æ®ï¼ä¾å¦ï¼ä¸éè¿Hibernateä¿®æ¹æ°æ®ï¼ï¼æ对é£äºéè¦éæ©æ§æ´æ°ç¹å®æ¥è¯¢ç»æéçæ
åµç¹å«æç¨ã
+ è¿æ¯å¯¹<literal>SessionFactory.evictQueries()</literal>çæ´ä¸ºææçæ¿ä»£æ¹æ¡ï¼åæ ·å¯ä»¥æ¸
é¤æ¥è¯¢ç¼ååºåã
+ </para>
+
+ </sect1>
+
+ <sect1 id="performance-collections">
+ <title>
+ ç解éåæ§è½ï¼Understanding Collection performanceï¼
+ </title>
+
+ <para>
+ åé¢æ们已ç»å¯¹éåè¿è¡äºè¶³å¤ç讨论ãæ¬æ®µä¸ï¼æ们å°çé讲述éåå¨è¿è¡æ¶çäºå®ã
+ </para>
+
+ <sect2 id="performance-collections-taxonomy">
+ <title>
+
+ åç±»ï¼Taxonomyï¼
+ </title>
+
+ <para>
+
+ Hibernateå®ä¹äºä¸ç§åºæ¬ç±»åçéåï¼
+ </para>
+
+ <itemizedlist>
+ <listitem>
+ <para>
+
+ å¼æ°æ®éå
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+
+ ä¸å¯¹å¤å
³è
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+
+ å¤å¯¹å¤å
³è
+ </para>
+ </listitem>
+ </itemizedlist>
+
+ <para>
+ è¿ä¸ªåç±»æ¯åºåäºä¸åç表åå¤é®å
³ç³»ç±»åï¼ä½æ¯å®æ²¡æåè¯æ们å
³ç³»æ¨¡åçææå
容ã
+ è¦å®å
¨ç解ä»ä»¬çå
³ç³»ç»æåæ§è½ç¹ç¹ï¼æ们å¿
é¡»åæ¶èèâç¨äºHibernateæ´æ°æå é¤éåè¡æ°æ®ç主é®çç»æâã
+ å æ¤å¾å°äºå¦ä¸çåç±»ï¼
+ </para>
+
+ <itemizedlist>
+ <listitem>
+ <para>
+
+ æåºéåç±»
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+
+ éåï¼setsï¼
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+
+ å
ï¼bags)
+ </para>
+ </listitem>
+ </itemizedlist>
+
+ <para>
+
+ ææçæåºéåç±»ï¼maps, lists, arrays)é½æ¥æä¸ä¸ªç±<literal><key></literal>å
+ <literal><index></literal>ç»æç主é®ã
+ è¿ç§æ
åµä¸éåç±»çæ´æ°æ¯é常é«æçââ主é®å·²ç»è¢«ææçç´¢å¼ï¼å æ¤å½Hibernateè¯å¾æ´æ°æå é¤ä¸è¡æ¶ï¼å¯ä»¥è¿
éæ¾å°è¯¥è¡æ°æ®ã
+ </para>
+
+ <para>
+
+ éå(sets)ç主é®ç±<literal><key></literal>åå
¶ä»å
ç´ å段ææã
+ 对äºæäºå
ç´ ç±»åæ¥è¯´ï¼è¿å¾ä½æï¼ç¹å«æ¯ç»åå
ç´ æè
大ææ¬ã大äºè¿å¶å段ï¼
+ æ°æ®åºå¯è½æ æ³ææç对å¤æç主é®è¿è¡ç´¢å¼ã
+ å¦ä¸æ¹é¢ï¼å¯¹äºä¸å¯¹å¤ãå¤å¯¹å¤å
³èï¼ç¹å«æ¯åæçæ è¯ç¬¦æ¥è¯´ï¼éåä¹å¯ä»¥è¾¾å°åæ ·çé«ææ§è½ãï¼
+ é注ï¼å¦æä½ å¸æ<literal>SchemaExport</literal>ä¸ºä½ ç<literal><set></literal>å建主é®ï¼
+ ä½ å¿
é¡»æææçå段é½å£°æ为<literal>not-null="true"</literal>ãï¼
+ </para>
+
+ <para>
+
+ <literal><idbag></literal>æ å°å®ä¹äºä»£çé®ï¼å æ¤å®æ»æ¯å¯ä»¥å¾é«æç被æ´æ°ãäºå®ä¸ï¼
+ <literal><idbag></literal>æ¥æçæ好çæ§è½è¡¨ç°ã
+ </para>
+
+ <para>
+ Bagæ¯æå·®çãå 为bagå
许éå¤çå
ç´ å¼ï¼ä¹æ²¡æç´¢å¼å段ï¼å æ¤ä¸å¯è½å®ä¹ä¸»é®ã
+ Hibernateæ æ³å¤æåºéå¤çè¡ãå½è¿ç§éå被æ´æ¹æ¶ï¼Hibernateå°ä¼å
å®æ´å°ç§»é¤
+ ï¼éè¿ä¸ä¸ª(in a single <literal>DELETE</literal>)ï¼æ´ä¸ªéåï¼ç¶ååéæ°å建æ´ä¸ªéåã
+ å æ¤Bagæ¯é常ä½æçã
+ </para>
+
+ <para>
+ 请注æï¼å¯¹äºä¸å¯¹å¤å
³èæ¥è¯´ï¼â主é®âå¾å¯è½å¹¶ä¸æ¯æ°æ®åºè¡¨çç©ç主é®ã
+ ä½å°±ç®å¨æ¤æ
åµä¸ï¼ä¸é¢çåç±»ä»ç¶æ¯æç¨çãï¼å®ä»ç¶åæ äºHibernateå¨éåçåæ°æ®è¡ä¸æ¯å¦ä½è¿è¡âå®ä½âçãï¼
+ </para>
+
+ </sect2>
+
+ <sect2 id="performance-collections-mostefficientupdate">
+ <title>
+ Lists, maps åsetsç¨äºæ´æ°æçæé«
+ </title>
+
+ <para>
+
+ æ ¹æ®æ们ä¸é¢ç讨论ï¼æ¾ç¶æåºéåç±»åå大å¤æ°seté½å¯ä»¥å¨å¢å ãå é¤ãä¿®æ¹å
ç´ ä¸æ¥ææ好çæ§è½ã
+ </para>
+
+ <para>
+ å¯è®ºè¯çæ¯å¯¹äºå¤å¯¹å¤å
³èãå¼æ°æ®éåèè¨ï¼æåºéåç±»æ¯éå(set)æä¸ä¸ªå¥½å¤ãå 为<literal>Set</literal>çå
å¨ç»æï¼
+ å¦æâæ¹åâäºä¸ä¸ªå
ç´ ï¼Hibernate并ä¸ä¼<literal>æ´æ°ï¼UPDATEï¼</literal>è¿ä¸è¡ã
+ 对äº<literal>Set</literal>æ¥è¯´ï¼åªæå¨<literal>æå
¥ï¼INSERTï¼</literal>å<literal>å é¤ï¼DELETEï¼</literal>
+ æä½æ¶âæ¹åâæææãå次强è°ï¼è¿æ®µè®¨è®ºå¯¹âä¸å¯¹å¤å
³èâ并ä¸éç¨ã
+ </para>
+
+ <para>
+ 注æå°æ°ç»æ æ³å»¶è¿è½½å
¥ï¼æ们å¯ä»¥å¾åºç»è®ºï¼list, mapåidbagsæ¯æé«æçï¼éååï¼éåç±»åï¼setåç´§éå
¶åã
+ å¨Hibernateä¸ï¼setåºè¯¥æ¶æéç¨çéåç±»åï¼è¿æ¶å 为âsetâçè¯ä¹å¨å
³ç³»æ¨¡åä¸æ¯æèªç¶çã
+ </para>
+
+ <para>
+ ä½æ¯ï¼å¨è®¾è®¡è¯å¥½çHibernateé¢å模åä¸ï¼æ们é常å¯ä»¥çå°æ´å¤çéåäºå®ä¸æ¯å¸¦æ<literal>inverse="true"</literal>
+ çä¸å¯¹å¤çå
³èã对äºè¿äºå
³èï¼æ´æ°æä½å°ä¼å¨å¤å¯¹ä¸çè¿ä¸ç«¯è¿è¡å¤çãå æ¤å¯¹äºæ¤ç±»æ
åµï¼æ éèèå
¶éåçæ´æ°æ§è½ã
+ </para>
+
+ </sect2>
+
+ <sect2 id="performance-collections-mostefficentinverse">
+ <title>
+ Bagålistæ¯ååéåç±»ä¸æçæé«ç
+ </title>
+
+ <para>
+ å¨æbagæè¿æ°´æ²ä¹åï¼ä½ å¿
é¡»äºè§£ï¼å¨ä¸ç§æ
åµä¸ï¼bagçæ§è½(å
æ¬list)è¦æ¯seté«å¾å¤ï¼
+ 对äºææäº<literal>inverse="true"</literal>çéåç±»ï¼æ¯å¦è¯´ï¼æ åçååçä¸å¯¹å¤å
³èï¼ï¼
+ æ们å¯ä»¥å¨æªåå§å(fetch)å
å
ç´ çæ
åµä¸ç´æ¥åbagælistæ·»å æ°å
ç´ ï¼
+ è¿æ¯å 为<literal>Collection.add()</literal>)æè
<literal>Collection.addAll()</literal> æ¹æ³
+ 对bagæè
Listæ»æ¯è¿åtrueï¼è¿ç¹ä¸ä¸Setä¸åï¼ãå æ¤å¯¹äºä¸é¢çç¸å代ç æ¥è¯´ï¼é度ä¼å¿«å¾å¤ã
+ </para>
+
+ <programlisting><![CDATA[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();]]></programlisting>
+
+ </sect2>
+
+ <sect2 id="performance-collections-oneshotdelete">
+ <title>
+ ä¸æ¬¡æ§å é¤ï¼One shot deleteï¼
+ </title>
+
+ <para>
+ å¶å°çï¼é个å é¤éåç±»ä¸çå
ç´ æ¯ç¸å½ä½æçãHibernate并没é£ä¹ç¬¨ï¼
+ å¦æä½ æ³è¦ææ´ä¸ªéåé½å é¤ï¼æ¯å¦è¯´è°ç¨list.clear()ï¼ï¼Hibernateåªéè¦ä¸ä¸ªDELETEå°±æå®äºã
+ </para>
+
+ <para>
+ å设æ们å¨ä¸ä¸ªé¿åº¦ä¸º20çéåç±»ä¸æ°å¢å äºä¸ä¸ªå
ç´ ï¼ç¶ååå é¤ä¸¤ä¸ªã
+ Hibernateä¼å®æä¸æ¡<literal>INSERT</literal>è¯å¥å两æ¡<literal>DELETE</literal>è¯å¥ï¼é¤ééåç±»æ¯ä¸ä¸ªbag)ã
+ è¿å½ç¶æ¯æ¾èæè§çã
+ </para>
+
+ <para>
+ ä½æ¯ï¼å设æ们å é¤äº18个æ°æ®ï¼åªå©ä¸2个ï¼ç¶åæ°å¢3个ãåæ两ç§å¤çæ¹å¼ï¼
+ </para>
+
+ <itemizedlist>
+ <listitem>
+ <para>
+ éä¸çå é¤è¿18个æ°æ®ï¼åæ°å¢ä¸ä¸ªï¼
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ å é¤æ´ä¸ªéåç±»ï¼åªç¨ä¸å¥DELETEè¯å¥ï¼ï¼ç¶åå¢å 5个æ°æ®ã
+ </para>
+ </listitem>
+ </itemizedlist>
+
+ <para>
+ Hibernateè¿æ²¡é£ä¹èªæï¼ç¥é第äºç§éæ©å¯è½ä¼æ¯è¾å¿«ã
+ ï¼ä¹è®¸è®©Hibernateä¸è¿ä¹èªæä¹æ¯å¥½äºï¼å¦åå¯è½ä¼å¼åæå¤çâæ°æ®åºè§¦åå¨âä¹ç±»çé®é¢ãï¼
+ </para>
+
+ <para>
+ 幸è¿çæ¯ï¼ä½ å¯ä»¥å¼ºå¶ä½¿ç¨ç¬¬äºç§çç¥ãä½ éè¦åæ¶åæ¥çæ´ä¸ªéåç±»ï¼è§£é¤å
¶å¼ç¨ï¼ï¼
+ ç¶ååè¿åä¸ä¸ªæ°çå®ä¾åçéåç±»ï¼åªå
å«éè¦çå
ç´ ãæäºæ¶åè¿æ¯é常æç¨çã
+ </para>
+
+ <para>
+ æ¾ç¶ï¼ä¸æ¬¡æ§å é¤å¹¶ä¸éç¨äºè¢«æ å°ä¸º<literal>inverse="true"</literal>çéåã
+ </para>
+
+ </sect2>
+
+ </sect1>
+
+ <sect1 id="performance-monitoring" revision="1">
+ <title>
+ çæµæ§è½ï¼Monitoring performanceï¼
+ </title>
+
+ <para>
+ 没æçæµåæ§è½åæ°èè¿è¡ä¼åæ¯æ¯«æ æä¹çãHibernate为å
¶å
é¨æä½æä¾äºä¸ç³»åç示æå¾ï¼å æ¤å¯ä»¥ä»
+ æ¯ä¸ª<literal>SessionFactory</literal>æåå
¶ç»è®¡æ°æ®ã
+ </para>
+
+ <sect2 id="performance-monitoring-sf" revision="2">
+ <title>
+ çæµSessionFactory
+ </title>
+
+ <para>
+ ä½ å¯ä»¥æ两ç§æ¹å¼è®¿é®<literal>SessionFactory</literal>çæ°æ®è®°å½ï¼ç¬¬ä¸ç§å°±æ¯èªå·±ç´æ¥è°ç¨
+ <literal>sessionFactory.getStatistics()</literal>æ¹æ³è¯»åãæ¾ç¤º<literal>ç»è®¡</literal>æ°æ®ã
+ </para>
+
+ <para>
+ æ¤å¤ï¼å¦æä½ æå¼<literal>StatisticsService</literal> MBeané项ï¼é£ä¹Hibernateåå¯ä»¥ä½¿ç¨JMXææ¯
+ åå¸å
¶æ°æ®è®°å½ãä½ å¯ä»¥è®©åºç¨ä¸ææç<literal>SessionFactory</literal>åæ¶å
±äº«ä¸ä¸ªMBeanï¼ä¹å¯ä»¥æ¯ä¸ª
+ SessionFactoryåé
ä¸ä¸ªMBeanãä¸é¢ç代ç å³æ¯å
¶æ¼ç¤ºä»£ç ï¼
+ </para>
+
+ <programlisting><![CDATA[// MBean service registration for a specific SessionFactory
+Hashtable tb = new Hashtable();
+tb.put("type", "statistics");
+tb.put("sessionFactory", "myFinancialApp");
+ObjectName on = new ObjectName("hibernate", tb); // MBean object name
+
+StatisticsService stats = new StatisticsService(); // MBean implementation
+stats.setSessionFactory(sessionFactory); // Bind the stats to a SessionFactory
+server.registerMBean(stats, on); // Register the Mbean on the server]]></programlisting>
+
+
+<programlisting><![CDATA[// MBean service registration for all SessionFactory's
+Hashtable tb = new Hashtable();
+tb.put("type", "statistics");
+tb.put("sessionFactory", "all");
+ObjectName on = new ObjectName("hibernate", tb); // MBean object name
+
+StatisticsService stats = new StatisticsService(); // MBean implementation
+server.registerMBean(stats, on); // Register the MBean on the server]]></programlisting>
+
+ <para>
+
+ TODOï¼ä»éè¦è¯´æçæ¯ï¼å¨ç¬¬ä¸ä¸ªä¾åä¸ï¼æ们ç´æ¥å¾å°å使ç¨MBeanï¼èå¨ç¬¬äºä¸ªä¾åä¸ï¼å¨ä½¿ç¨MBeanä¹å
+ æ们åéè¦ç»åºSessionFactoryçJNDIåï¼ä½¿ç¨<literal>hibernateStatsBean.setSessionFactoryJNDIName("my/JNDI/Name")</literal>
+ å¾å°SessionFactoryï¼ç¶åå°MBeanä¿åäºå
¶ä¸ã
+ </para>
+ <para>
+ ä½ å¯ä»¥éè¿ä»¥ä¸æ¹æ³æå¼æå
³é<literal>SessionFactory</literal>ççæµåè½ï¼
+ </para>
+ <itemizedlist>
+ <listitem>
+ <para>
+
+ å¨é
ç½®æé´ï¼å°<literal>hibernate.generate_statistics</literal>设置为<literal>true</literal>æ<literal>false</literal>ï¼
+ </para>
+ </listitem>
+ </itemizedlist>
+ <itemizedlist>
+ <listitem>
+ <para>
+
+ å¨è¿è¡æé´ï¼åå¯ä»¥å¯ä»¥éè¿<literal>sf.getStatistics().setStatisticsEnabled(true)</literal>
+ æ<literal>hibernateStatsBean.setStatisticsEnabled(true)</literal>
+ </para>
+ </listitem>
+ </itemizedlist>
+
+ <para>
+ ä½ ä¹å¯ä»¥å¨ç¨åºä¸è°ç¨<literal>clear()</literal>æ¹æ³éç½®ç»è®¡æ°æ®ï¼è°ç¨<literal>logSummary()</literal>
+ å¨æ¥å¿ä¸è®°å½ï¼info级å«ï¼å
¶æ»ç»ã
+ </para>
+
+ </sect2>
+
+ <sect2 id="performance-monitoring-metrics" revision="1">
+ <title>
+ æ°æ®è®°å½ï¼Metricsï¼
+ </title>
+
+ <para>
+ Hibernateæä¾äºä¸ç³»åæ°æ®è®°å½ï¼å
¶è®°å½çå
容å
æ¬ä»æåºæ¬çä¿¡æ¯å°ä¸å
·ä½åºæ¯çç¹æ®ä¿¡æ¯ãææçæµéå¼é½å¯ä»¥ç±
+ <literal>Statistics</literal>æ¥å£è¿è¡è®¿é®ï¼ä¸»è¦å为ä¸ç±»ï¼
+ </para>
+ <itemizedlist>
+ <listitem>
+ <para>
+ 使ç¨<literal>Session</literal>çæ®éæ°æ®è®°å½ï¼ä¾å¦æå¼çSessionç个æ°ãåå¾çJDBCçè¿æ¥æ°çï¼
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ å®ä½ãéåãæ¥è¯¢ãç¼åçå
容çç»ä¸æ°æ®è®°å½
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ åå
·ä½å®ä½ãéåãæ¥è¯¢ãç¼åç¸å
³ç详ç»æ°æ®è®°å½
+ </para>
+ </listitem>
+ </itemizedlist>
+
+ <para>
+ ä¾å¦ï¼ä½ å¯ä»¥æ£æ¥ç¼åçå½ä¸æå次æ°ï¼ç¼åçå½ä¸å¤±è´¥æ¬¡æ°ï¼å®ä½ãéååæ¥è¯¢ç使ç¨æ¦çï¼æ¥è¯¢çå¹³åæ¶é´çã请注æ
+ Javaä¸æ¶é´çè¿ä¼¼ç²¾åº¦æ¯æ¯«ç§ãHibernateçæ°æ®ç²¾åº¦åå
·ä½çJVMæå
³ï¼å¨æäºå¹³å°ä¸å
¶ç²¾åº¦çè³åªè½ç²¾ç¡®å°10ç§ã
+ </para>
+
+ <para>
+ ä½ å¯ä»¥ç´æ¥ä½¿ç¨getteræ¹æ³å¾å°å
¨å±æ°æ®è®°å½ï¼ä¾å¦ï¼åå
·ä½çå®ä½ãéåãç¼ååºæ å
³çæ°æ®ï¼ï¼ä½ ä¹å¯ä»¥å¨å
·ä½æ¥è¯¢ä¸éè¿æ è®°å®ä½åã
+ æHQLãSQLè¯å¥å¾å°æå®ä½çæ°æ®è®°å½ã请åè<literal>Statistics</literal>ã<literal>EntityStatistics</literal>ã
+ <literal>CollectionStatistics</literal>ã<literal>SecondLevelCacheStatistics</literal>ã
+ å<literal>QueryStatistics</literal>çAPIæ档以æåæ´å¤ä¿¡æ¯ãä¸é¢ç代ç åæ¯ä¸ªç®åçä¾åï¼
+ </para>
+
+ <programlisting><![CDATA[Statistics stats = HibernateUtil.sessionFactory.getStatistics();
+
+double queryCacheHitCount = stats.getQueryCacheHitCount();
+double queryCacheMissCount = stats.getQueryCacheMissCount();
+double queryCacheHitRatio =
+ queryCacheHitCount / (queryCacheHitCount + queryCacheMissCount);
+
+log.info("Query Hit ratio:" + queryCacheHitRatio);
+
+EntityStatistics entityStats =
+ stats.getEntityStatistics( Cat.class.getName() );
+long changes =
+ entityStats.getInsertCount()
+ + entityStats.getUpdateCount()
+ + entityStats.getDeleteCount();
+log.info(Cat.class.getName() + " changed " + changes + "times" );]]></programlisting>
+
+ <para>
+ å¦æä½ æ³å¾å°ææå®ä½ãéåãæ¥è¯¢åç¼ååºçæ°æ®ï¼ä½ å¯ä»¥éè¿ä»¥ä¸æ¹æ³è·å¾å®ä½ãéåãæ¥è¯¢åç¼ååºå表ï¼
+ <literal>getQueries()</literal>ã<literal>getEntityNames()</literal>ã
+ <literal>getCollectionRoleNames()</literal>å
+ <literal>getSecondLevelCacheRegionNames()</literal>ã
+ </para>
+
+ </sect2>
+
+ </sect1>
+
+</chapter>
\ No newline at end of file
Copied: core/trunk/documentation/manual/zh-CN/src/main/docbook/content/persistent_classes.xml (from rev 14080, core/trunk/documentation/manual/zh-CN/src/main/docbook/modules/persistent_classes.xml)
===================================================================
--- core/trunk/documentation/manual/zh-CN/src/main/docbook/content/persistent_classes.xml (rev 0)
+++ core/trunk/documentation/manual/zh-CN/src/main/docbook/content/persistent_classes.xml 2007-10-09 20:10:34 UTC (rev 14081)
@@ -0,0 +1,493 @@
+<chapter id="persistent-classes" revision="2">
+ <title>æä¹
åç±»(Persistent Classes)</title>
+
+ <para>
+ å¨åºç¨ç¨åºä¸ï¼ç¨æ¥å®ç°ä¸å¡é®é¢å®ä½çï¼å¦ï¼å¨çµååå¡åºç¨ç¨åºä¸çCustomeråOrderï¼
+ 类就æ¯æä¹
åç±»ãä¸è½è®¤ä¸ºææçæä¹
åç±»çå®ä¾é½æ¯æä¹
çç¶æââä¸ä¸ªå®ä¾çç¶æä¹å¯è½
+ æ¯ç¬æ¶çæè±ç®¡çã
+ </para>
+
+
+
+ <para>
+ å¦æè¿äºæä¹
åç±»éµå¾ªä¸äºç®åçè§åï¼Hibernateè½å¤å·¥ä½å¾æ´å¥½ï¼è¿äºè§åä¹è¢«ç§°ä½
+ ç®åä¼ ç»Java对象(POJO:Plain Old Java Object)ç¼ç¨æ¨¡åãä½æ¯è¿äºè§å并ä¸æ¯å¿
éçã
+ å®é
ä¸ï¼Hibernate3对äºä½ çæä¹
åç±»å ä¹ä¸åä»»ä½è®¾æ³ãä½ å¯ä»¥ç¨å
¶ä»çæ¹æ³æ¥è¡¨è¾¾é¢å模åï¼
+ æ¯å¦ï¼ä½¿ç¨<literal>Map</literal>å®ä¾çæ åç»æã
+ </para>
+
+
+ <sect1 id="persistent-classes-pojo">
+ <title>ä¸ä¸ªç®åçPOJOä¾å</title>
+ <para>
+ 大å¤æ°Javaç¨åºéè¦ç¨ä¸ä¸ªæä¹
åç±»æ¥è¡¨ç¤ºç«ç§å¨ç©ã
+ </para>
+
+
+ <programlisting><![CDATA[package eg;
+import java.util.Set;
+import java.util.Date;
+
+public class Cat {
+ private Long id; // identifier
+
+ private Date birthdate;
+ private Color color;
+ private char sex;
+ private float weight;
+ private int litterId;
+
+ private Cat mother;
+ private Set kittens = new HashSet();
+
+ private void setId(Long id) {
+ this.id=id;
+ }
+ public Long getId() {
+ return id;
+ }
+
+ void setBirthdate(Date date) {
+ birthdate = date;
+ }
+ public Date getBirthdate() {
+ return birthdate;
+ }
+
+ void setWeight(float weight) {
+ this.weight = weight;
+ }
+ public float getWeight() {
+ return weight;
+ }
+
+ public Color getColor() {
+ return color;
+ }
+ void setColor(Color color) {
+ this.color = color;
+ }
+
+ void setSex(char sex) {
+ this.sex=sex;
+ }
+ public char getSex() {
+ return sex;
+ }
+
+ void setLitterId(int id) {
+ this.litterId = id;
+ }
+ public int getLitterId() {
+ return litterId;
+ }
+
+ void setMother(Cat mother) {
+ this.mother = mother;
+ }
+ public Cat getMother() {
+ return mother;
+ }
+ void setKittens(Set kittens) {
+ this.kittens = kittens;
+ }
+ public Set getKittens() {
+ return kittens;
+ }
+
+ // addKitten not needed by Hibernate
+ public void addKitten(Cat kitten) {
+ kitten.setMother(this);
+ kitten.setLitterId( kittens.size() );
+ kittens.add(kitten);
+ }
+}]]></programlisting>
+
+ <para>
+ è¿éè¦éµå¾ªåæ¡ä¸»è¦çè§åï¼
+ </para>
+
+
+ <sect2 id="persistent-classes-pojo-constructor" revision="1">
+ <title>å®ç°ä¸ä¸ªé»è®¤çï¼å³æ åæ°çï¼æé æ¹æ³ï¼constructorï¼</title>
+
+ <para>
+ <literal>Cat</literal>æä¸ä¸ªæ åæ°çæé æ¹æ³ãææçæä¹
åç±»é½å¿
é¡»æä¸ä¸ª
+ é»è®¤çæé æ¹æ³ï¼å¯ä»¥ä¸æ¯publicçï¼ï¼è¿æ ·çè¯Hibernateå°±å¯ä»¥ä½¿ç¨
+ <literal>Constructor.newInstance()</literal>æ¥å®ä¾åå®ä»¬ã
+ æ们强ç建议ï¼å¨Hibernateä¸ï¼ä¸ºäºè¿è¡æ代çççæï¼æé æ¹æ³è³å°æ¯
+ <emphasis>å
(package)</emphasis>å
å¯è§çã
+ </para>
+
+ </sect2>
+
+ <sect2 id="persistent-classes-pojo-identifier" revision="2">
+ <title>æä¾ä¸ä¸ªæ è¯å±æ§ï¼identifier propertyï¼ï¼å¯éï¼ </title>
+
+ <para>
+ <literal>Cat</literal>æä¸ä¸ªå±æ§å«å<literal>id</literal>ãè¿ä¸ªå±æ§æ å°æ°æ®åºè¡¨ç主
+ é®å段ãè¿ä¸ªå±æ§å¯ä»¥å«ä»»ä½ååï¼å
¶ç±»åå¯ä»¥æ¯ä»»ä½çåå§ç±»åãåå§ç±»åçå
è£
ç±»åã
+ <literal>java.lang.String</literal> æè
æ¯ <literal>java.util.Date</literal>ã
+ ï¼å¦æä½ çéçæ°æ®åºè¡¨æèå主é®ï¼ä½ çè³å¯ä»¥ç¨ä¸ä¸ªç¨æ·èªå®ä¹çç±»ï¼è¯¥ç±»æ¥æè¿äºç±»å
+ çå±æ§ãåè§åé¢çå
³äºèåæ è¯ç¬¦çç« èãï¼
+ </para>
+
+
+ <para>
+ æ è¯ç¬¦å±æ§æ¯å¯éçãå¯ä»¥ä¸ç¨ç®¡å®ï¼è®©Hibernateå
é¨æ¥è¿½è¸ªå¯¹è±¡çè¯å«ã
+ ä½æ¯æ们并ä¸æ¨èè¿æ ·åã
+ </para>
+
+ <para>
+ å®é
ä¸ï¼ä¸äºåè½åªå¯¹é£äºå£°æäºæ è¯ç¬¦å±æ§ç类起ä½ç¨ï¼
+ </para>
+
+ <itemizedlist spacing="compact">
+ <listitem>
+
+ <para>
+ æ管对象çä¼ ææ§åè¿æ¥ï¼çº§èæ´æ°æ级èå并ï¼
+ ââåé
<xref linkend="objectstate-transitive"/>
+ </para>
+
+ </listitem>
+ <listitem>
+ <para>
+ <literal>Session.saveOrUpdate()</literal>
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ <literal>Session.merge()</literal>
+ </para>
+ </listitem>
+ </itemizedlist>
+
+
+ <para>
+ æä»¬å»ºè®®ä½ å¯¹æä¹
å类声æå½åä¸è´çæ è¯å±æ§ãæ们è¿å»ºè®®ä½ 使ç¨ä¸
+ 个å¯ä»¥ä¸ºç©ºï¼ä¹å°±æ¯è¯´ï¼ä¸æ¯åå§ç±»åï¼çç±»åã
+ </para>
+
+ </sect2>
+
+ <sect2 id="persistent-classes-pojo-final">
+ <title>使ç¨éfinalçç±» (å¯é)</title>
+ <para>
+ <emphasis>代çï¼proxiesï¼</emphasis>æ¯Hibernateçä¸ä¸ªéè¦çåè½ï¼å®ä¾èµçæ¡ä»¶æ¯ï¼æä¹
+ åç±»æè
æ¯éfinalçï¼æè
æ¯å®ç°äºä¸ä¸ªæææ¹æ³é½å£°æ为publicçæ¥å£ã
+ </para>
+
+
+ <para>
+ ä½ å¯ä»¥ç¨Hibernateæä¹
åä¸ä¸ªæ²¡æå®ç°ä»»ä½æ¥å£ç<literal>final</literal>ç±»ï¼ä½æ¯ä½
+ ä¸è½ä½¿ç¨ä»£çæ¥å»¶è¿å
³èå è½½ï¼è¿ä¼éå¶ä½ è¿è¡æ§è½ä¼åçéæ©ã
+ </para>
+
+
+ <para>
+ ä½ ä¹åºè¯¥é¿å
å¨éfinalç±»ä¸å£°æ <literal>public final</literal>çæ¹æ³ãå¦æä½ æ³ä½¿ç¨ä¸
+ 个æ<literal>public final</literal>æ¹æ³çç±»ï¼ä½ å¿
é¡»éè¿è®¾ç½®<literal>lazy="false"</literal>
+ æ¥æç¡®å°ç¦ç¨ä»£çã
+ </para>
+ </sect2>
+
+ <sect2 id="persistent-classes-pojo-accessors" revision="2">
+ <title>为æä¹
åå段声æ访é®å¨(accessors)åæ¯å¦å¯åçæ å¿(mutators)(å¯é)</title>
+
+ <para>
+ <literal>Cat</literal>为å®çæææä¹
åå段声æäºè®¿é®æ¹æ³ãå¾å¤å
¶ä»ORMå·¥å
·ç´æ¥å¯¹
+ å®ä¾åéè¿è¡æä¹
åãæ们ç¸ä¿¡ï¼å¨å
³ç³»æ°æ®åºschemaåç±»çå
é¨æ°æ®ç»æä¹é´å¼å
¥é´æ¥å±(åæ为"éç´æ¥"ï¼indirection)ä¼å¥½ä¸äºãé»è®¤æ
åµä¸Hibernateæä¹
åJavaBeansé£æ ¼çå±æ§ï¼è®¤å¯
+ <literal>getFoo</literal>ï¼<literal>isFoo</literal> å <literal>setFoo</literal>è¿ç§å½¢å¼çæ¹æ³åã
+ å¦æéè¦ï¼ä½ å¯ä»¥å¯¹æäºç¹å®å±æ§å®è¡ç´æ¥å段访é®ã
+ </para>
+
+
+ <para>
+ å±æ§<emphasis>ä¸éè¦</emphasis>è¦å£°æ为publicçãHibernateå¯ä»¥æä¹
åä¸ä¸ªæ
+ <literal>default</literal>ã<literal>protected</literal>æ<literal>private</literal>çget/setæ¹æ³å¯¹
+ çå±æ§è¿è¡æä¹
åã
+ </para>
+ </sect2>
+ </sect1>
+
+ <sect1 id="persistent-classes-inheritance">
+ <title>å®ç°ç»§æ¿ï¼Inheritanceï¼</title>
+
+ <para>
+ åç±»ä¹å¿
é¡»éµå®ç¬¬ä¸æ¡å第äºæ¡è§åãå®ä»è¶
ç±»<literal>Cat</literal>继æ¿äºæ è¯å±æ§ã
+ </para>
+
+ <programlisting><![CDATA[package eg;
+
+public class DomesticCat extends Cat {
+ private String name;
+
+ public String getName() {
+ return name;
+ }
+ protected void setName(String name) {
+ this.name=name;
+ }
+}]]></programlisting>
+ </sect1>
+
+ <sect1 id="persistent-classes-equalshashcode" revision="1">
+ <title>å®ç°<literal>equals()</literal>å<literal>hashCode()</literal></title>
+
+ <para>
+ å¦æä½ æå¦ä¸éæ±ï¼ä½ å¿
é¡»éè½½
+ <literal>equals()</literal> å <literal>hashCode()</literal>æ¹æ³ï¼
+ </para>
+
+ <itemizedlist spacing="compact">
+ <listitem>
+ <para>
+ æ³ææä¹
ç±»çå®ä¾æ¾å
¥<literal>Set</literal>ä¸ï¼å½è¡¨ç¤ºå¤å¼å
³èæ¶ï¼æ¨èè¿ä¹åï¼
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ æ³éç¨è±ç®¡å®ä¾
+ </para>
+ </listitem>
+ </itemizedlist>
+
+ <para>
+ Hibernateä¿è¯ï¼ä»
å¨ç¹å®ä¼è¯èå´å
ï¼æä¹
åæ è¯ï¼æ°æ®åºçè¡ï¼åJavaæ è¯æ¯çä»·çãå æ¤ï¼ä¸æ¦
+ æ们混åäºä»ä¸åä¼è¯ä¸è·åçå®ä¾ï¼å¦æå¸æ<literal>Set</literal>ææç¡®çè¯ä¹ï¼å°±å¿
+ é¡»å®ç°<literal>equals()</literal> å<literal>hashCode()</literal>ã
+ </para>
+
+ <para>
+ å®ç°<literal>equals()</literal>/<literal>hashCode()</literal>ææ¾èæè§çæ¹æ³æ¯æ¯è¾ä¸¤ä¸ªå¯¹è±¡
+ æ è¯ç¬¦çå¼ãå¦æå¼ç¸åï¼å两个对象对åºäºæ°æ®åºçåä¸è¡ï¼å æ¤å®ä»¬æ¯ç¸ççï¼å¦æé½è¢«æ·»å å°
+ <literal>Set</literal>ï¼åå¨<literal>Set</literal>ä¸åªæä¸ä¸ªå
ç´ ï¼ãä¸å¹¸çæ¯ï¼å¯¹çæçæ è¯ä¸è½
+ 使ç¨è¿ç§æ¹æ³ãHibernateä»
对é£äºæä¹
å对象èµæ è¯å¼ï¼ä¸ä¸ªæ°å建çå®ä¾å°ä¸ä¼æä»»ä½æ è¯å¼ãæ¤å¤ï¼
+ å¦æä¸ä¸ªå®ä¾æ²¡æ被ä¿å(unsaved)ï¼å¹¶ä¸å®å½åæ£å¨ä¸ä¸ª<literal>Set</literal>ä¸ï¼ä¿åå®å°ä¼ç»è¿ä¸ªå¯¹è±¡
+ èµä¸ä¸ªæ è¯å¼ãå¦æ<literal>equals()</literal> å <literal>hashCode()</literal>æ¯åºäºæ è¯å¼
+ å®ç°çï¼åå
¶åå¸ç å°ä¼æ¹åï¼è¿è¿åäº<literal>Set</literal>çå¥çº¦ã建议å»Hibernateçç«ç¹é
读å
³äºè¿ä¸ª
+ é®é¢çå
¨é¨è®¨è®ºã注æï¼è¿ä¸æ¯Hibernateçé®é¢ï¼èæ¯ä¸è¬çJava对象æ è¯åJava对象çä»·çè¯ä¹é®é¢ã
+ </para>
+ <para>
+ æ们建议使ç¨<emphasis>ä¸å¡é®å¼ç¸ç(Business key equality)</emphasis>æ¥å®ç°<literal>equals()</literal>
+ å <literal>hashCode()</literal>ãä¸å¡é®å¼ç¸ççæææ¯ï¼<literal>equals()</literal>æ¹æ³
+ ä»
ä»
æ¯è¾å½¢æä¸å¡é®çå±æ§ï¼å®è½å¨ç°å®ä¸çéæ è¯æ们çå®ä¾ï¼æ¯ä¸ä¸ª<emphasis>èªç¶ç</emphasis>åéç ï¼ã
+ </para>
+ <programlisting><![CDATA[public class Cat {
+
+ ...
+ public boolean equals(Object other) {
+ if (this == other) return true;
+ if ( !(other instanceof Cat) ) return false;
+
+ final Cat cat = (Cat) other;
+
+ if ( !cat.getLitterId().equals( getLitterId() ) ) return false;
+ if ( !cat.getMother().equals( getMother() ) ) return false;
+
+ return true;
+ }
+
+ public int hashCode() {
+ int result;
+ result = getMother().hashCode();
+ result = 29 * result + getLitterId();
+ return result;
+ }
+
+}]]></programlisting>
+
+ <para>
+ 注æï¼ä¸å¡é®ä¸å¿
åæ°æ®åºç主é®é£æ ·åºå®ä¸åï¼åè§<xref linkend="transactions-basics-identity"/>ï¼ã
+ 对ä¸å¡é®èè¨ï¼ä¸å¯åæå¯ä¸çå±æ§æ¯ä¸éçéæ©ã
+ </para>
+
+ </sect1>
+
+ <sect1 id="persistent-classes-dynamicmodels">
+ <title>å¨æ模å(Dynamic models)</title>
+ <para>
+ <emphasis>注æï¼ä»¥ä¸ç¹æ§å¨å½åå¤äºè¯éªé¶æ®µï¼å°æ¥å¯è½ä¼æååã</emphasis>
+ </para>
+
+ <para>
+ è¿è¡æçæä¹
åå®ä½æ²¡æå¿
è¦ä¸å®è¡¨ç¤ºä¸ºåPOJOç±»æJavaBean对象é£æ ·çå½¢å¼ãHibernateä¹æ¯æå¨æ模å
+ ï¼å¨è¿è¡æ使ç¨<literal>Map</literal>ç<literal>Map</literal>ï¼å象DOM4Jçæ 模åé£
+ æ ·çå®ä½è¡¨ç¤ºã使ç¨è¿ç§æ¹æ³ï¼ä½ ä¸ç¨åæä¹
åç±»ï¼åªåæ å°æ件就è¡äºã
+ </para>
+
+
+ <para>
+ Hibernateé»è®¤å·¥ä½å¨æ®éPOJO模å¼ãä½ å¯ä»¥ä½¿ç¨é
ç½®é项<literal>default_entity_mode</literal>ï¼
+ 对ç¹å®ç<literal>SessionFactory</literal>ï¼è®¾ç½®ä¸ä¸ªé»è®¤çå®ä½è¡¨ç¤ºæ¨¡å¼ã
+ ï¼åè§<xref linkend="configuration-optional-properties"/>ãï¼
+ </para>
+
+ <para>
+ ä¸é¢æ¯ç¨<literal>Map</literal>æ¥è¡¨ç¤ºçä¾åãé¦å
ï¼å¨æ å°æ件ä¸ï¼è¦å£°æ
+ <literal>entity-name</literal>æ¥ä»£æ¿ä¸ä¸ªç±»åï¼æä½ä¸ºä¸ç§éå±ï¼ã
+ </para>
+ <programlisting><![CDATA[<hibernate-mapping>
+
+ <class entity-name="Customer">
+
+ <id name="id"
+ type="long"
+ column="ID">
+ <generator class="sequence"/>
+ </id>
+
+ <property name="name"
+ column="NAME"
+ type="string"/>
+
+ <property name="address"
+ column="ADDRESS"
+ type="string"/>
+
+ <many-to-one name="organization"
+ column="ORGANIZATION_ID"
+ class="Organization"/>
+
+ <bag name="orders"
+ inverse="true"
+ lazy="false"
+ cascade="all">
+ <key column="CUSTOMER_ID"/>
+ <one-to-many class="Order"/>
+ </bag>
+
+ </class>
+
+</hibernate-mapping>]]></programlisting>
+
+ <para>
+ 注æï¼è½ç¶æ¯ç¨ç®æ ç±»åæ¥å£°æå
³èçï¼ä½æ¯å
³èçç®æ ç±»åé¤äºæ¯POJOä¹å¤ï¼ä¹å¯ä»¥
+ æ¯ä¸ä¸ªå¨æçå®ä½ã
+ </para>
+
+ <para>
+ å¨ä½¿ç¨<literal>dynamic-map</literal>为<literal>SessionFactory</literal>
+ 设置äºé»è®¤çå®ä½æ¨¡å¼ä¹åï¼å¯ä»¥å¨è¿è¡æ使ç¨<literal>Map</literal>ç
+ <literal>Map</literal>ã
+ </para>
+
+ <programlisting><![CDATA[Session s = openSession();
+Transaction tx = s.beginTransaction();
+Session s = openSession();
+
+// Create a customer
+Map david = new HashMap();
+david.put("name", "David");
+
+// Create an organization
+Map foobar = new HashMap();
+foobar.put("name", "Foobar Inc.");
+
+// Link both
+david.put("organization", foobar);
+
+// Save both
+s.save("Customer", david);
+s.save("Organization", foobar);
+
+tx.commit();
+s.close();]]></programlisting>
+
+ <para>
+ å¨ææ å°ç好å¤æ¯ï¼ååæéè¦çæ¶é´å°äºï¼å 为ååä¸éè¦å®ç°å®ä½ç±»ãç¶èï¼ä½ æ æ³è¿è¡
+ ç¼è¯æçç±»åæ£æ¥ï¼å¹¶å¯è½ç±æ¤ä¼å¤çå¾å¤çè¿è¡æå¼å¸¸ã幸äºæäºHibernateæ å°ï¼å®ä½¿å¾æ°
+ æ®åºçschemaè½å®¹æçè§æ ¼åååçåï¼å¹¶å
许ç¨åå¨æ¤ä¹ä¸æ·»å åéçé¢å模åå®ç°ã
+ </para>
+
+
+ <para>
+ å®ä½è¡¨ç¤ºæ¨¡å¼ä¹è½å¨æ¯ä¸ª<literal>Session</literal>çåºç¡ä¸è®¾ç½®ï¼
+ </para>
+ <programlisting><![CDATA[Session dynamicSession = pojoSession.getSession(EntityMode.MAP);
+
+// Create a customer
+Map david = new HashMap();
+david.put("name", "David");
+dynamicSession.save("Customer", david);
+...
+dynamicSession.flush();
+dynamicSession.close()
+...
+// Continue on pojoSession
+]]></programlisting>
+
+
+
+ <para>
+ 请注æï¼ç¨<literal>EntityMode</literal>è°ç¨<literal>getSession()</literal>æ¯å¨
+ <literal>Session</literal>çAPIä¸ï¼èä¸æ¯<literal>SessionFactory</literal>ã
+ è¿æ ·ï¼æ°ç<literal>Session</literal>å
±äº«åºå±çJDBCè¿æ¥ï¼äºå¡ï¼åå
¶ä»çä¸ä¸æä¿¡
+ æ¯ãè¿æå³çï¼ä½ ä¸éè¦å¨ç¬¬äºä¸ª<literal>Session</literal>ä¸è°ç¨
+ <literal>flush()</literal>å<literal>close()</literal>ï¼åæ ·çï¼æäºå¡åè¿æ¥çå¤ç
+ 交ç»åæ¥çå·¥ä½åå
ã
+ </para>
+
+
+ <para>
+ å
³äºXML表示è½åçæ´å¤ä¿¡æ¯å¯ä»¥å¨<xref linkend="xml"/>ä¸æ¾å°ã
+ </para>
+ </sect1>
+
+ <sect1 id="persistent-classes-tuplizers" revision="1">
+ <title>å
ç»çææ å°(Tuplizers)</title>
+
+ <para>
+ <literal>org.hibernate.tuple.Tuplizer</literal>ï¼ä»¥åå
¶åæ¥å£ï¼è´è´£æ ¹æ®ç»å®ç<literal>org.hibernate.EntityMode</literal>ï¼æ¥å¤ç°çææ°æ®ãå¦æç»å®ççææ°æ®è¢«è®¤ä¸ºå
¶æ¯ä¸ç§æ°æ®ç»æï¼"tuplizer"å°±æ¯ä¸ä¸ªç¥éå¦ä½å建è¿æ ·çæ°æ®ç»æï¼ä»¥åå¦ä½ç»è¿ä¸ªæ°æ®ç»æèµå¼çä¸è¥¿ãæ¯å¦è¯´ï¼å¯¹äºPOJOè¿ç§Entity Modeï¼å¯¹åºçtuplizerç¥ééè¿å
¶æé æ¹æ³æ¥å建ä¸ä¸ªPOJOï¼åéè¿å
¶å±æ§è®¿é®å¨æ¥è®¿é®POJOå±æ§ãæ两大类é«å±Tuplizerï¼åå«æ¯<literal>org.hibernate.tuple.entity.EntityTuplizer</literal> å<literal>org.hibernate.tuple.entity.ComponentTuplizer</literal>æ¥å£ã<literal>EntityTuplizer</literal>è´è´£ç®¡çä¸é¢æå°çå®ä½çå¥çº¦ï¼è<literal>ComponentTuplizer</literal>åæ¯é对ç»ä»¶çã
+ </para>
+
+ <para>
+ ç¨æ·ä¹å¯ä»¥æå
¥å
¶èªå®ä¹çtuplizerãæ许æ¨éè¦ä¸ç§ä¸åäºdynamic-map entity-modeä¸ä½¿ç¨ç<literal>java.util.HashMap</literal>ç<literal>java.util.Map</literal>å®ç°ï¼æ许æ¨éè¦ä¸é»è®¤çç¥ä¸åç代ççæçç¥(proxy generation strategy)ãéè¿èªå®ä¹tuplizerå®ç°ï¼è¿ä¸¤ä¸ªç®æ æ¨é½å¯ä»¥è¾¾å°ãTuplizerå®ä¹è¢«éå å°å®ä»¬ææ管ççentityæè
componentæ å°ä¸ãåå°æ们çcustomer entityä¾åï¼
+ </para>
+
+ <programlisting><![CDATA[<hibernate-mapping>
+ <class entity-name="Customer">
+ <!--
+ Override the dynamic-map entity-mode
+ tuplizer for the customer entity
+ -->
+ <tuplizer entity-mode="dynamic-map"
+ class="CustomMapTuplizerImpl"/>
+
+ <id name="id" type="long" column="ID">
+ <generator class="sequence"/>
+ </id>
+
+ <!-- other properties -->
+ ...
+ </class>
+</hibernate-mapping>
+
+
+public class CustomMapTuplizerImpl
+ extends org.hibernate.tuple.entity.DynamicMapEntityTuplizer {
+ // override the buildInstantiator() method to plug in our custom map...
+ protected final Instantiator buildInstantiator(
+ org.hibernate.mapping.PersistentClass mappingInfo) {
+ return new CustomMapInstantiator( mappingInfo );
+ }
+
+ private static final class CustomMapInstantiator
+ extends org.hibernate.tuple.DynamicMapInstantitor {
+ // override the generateMap() method to return our custom map...
+ protected final Map generateMap() {
+ return new CustomMap();
+ }
+ }
+}]]></programlisting>
+
+
+ </sect1>
+
+ <para>
+ TODOï¼propertyåproxyå
éçç¨æ·æ©å±æ¡æ¶ææ¡£ã
+ </para>
+
+</chapter>
+
Added: core/trunk/documentation/manual/zh-CN/src/main/docbook/content/preface.xml
===================================================================
--- core/trunk/documentation/manual/zh-CN/src/main/docbook/content/preface.xml (rev 0)
+++ core/trunk/documentation/manual/zh-CN/src/main/docbook/content/preface.xml 2007-10-09 20:10:34 UTC (rev 14081)
@@ -0,0 +1,70 @@
+<?xml version='1.0' encoding="UTF-8"?>
+
+<!DOCTYPE preface PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd">
+
+<preface id="preface" revision="2">
+ <title>åè¨</title>
+
+ <para>
+ å¨ä»æ¥çä¼ä¸ç¯å¢ä¸ï¼æé¢å对象ç软件åå
³ç³»æ°æ®åºä¸èµ·ä½¿ç¨å¯è½æ¯ç¸å½éº»ç¦ã浪费æ¶é´çãHibernateæ¯ä¸ä¸ªé¢åJavaç¯å¢ç对象/å
³ç³»æ°æ®åºæ å°å·¥å
·ã对象/å
³ç³»æ°æ®åºæ å°(object/relational mapping (ORM))è¿ä¸ªæ¯è¯è¡¨ç¤ºä¸ç§ææ¯ï¼ç¨æ¥æ对象模å表示ç对象æ å°å°åºäºSQLçå
³ç³»æ¨¡åæ°æ®ç»æä¸å»ã
+ </para>
+
+ <para>
+ Hibernateä¸ä»
ä»
管çJavaç±»å°æ°æ®åºè¡¨çæ å°ï¼å
æ¬Javaæ°æ®ç±»åå°SQLæ°æ®ç±»åçæ å°ï¼ï¼è¿æä¾æ°æ®æ¥è¯¢åè·åæ°æ®çæ¹æ³ï¼å¯ä»¥å¤§å¹
度åå°å¼åæ¶äººå·¥ä½¿ç¨SQLåJDBCå¤çæ°æ®çæ¶é´ã
+ </para>
+
+ <para>
+ Hibernateçç®æ æ¯å¯¹äºå¼åè
é常çæ°æ®æä¹
åç¸å
³çç¼ç¨ä»»å¡ï¼è§£æ¾å
¶ä¸ç95%ã对äºä»¥æ°æ®ä¸ºä¸å¿çç¨åºæ¥è¯´,å®ä»¬å¾å¾åªå¨æ°æ®åºä¸ä½¿ç¨åå¨è¿ç¨æ¥å®ç°åä¸é»è¾,Hibernateå¯è½ä¸æ¯æ好ç解å³æ¹æ¡;对äºé£äºå¨åºäºJavaçä¸é´å±åºç¨ä¸ï¼å®ä»¬å®ç°é¢å对象çä¸å¡æ¨¡åååä¸é»è¾çåºç¨ï¼Hibernateæ¯ææç¨çãä¸ç®¡ææ ·ï¼Hibernateä¸å®å¯ä»¥å¸®å©ä½ æ¶é¤æè
å
è£
é£äºé对ç¹å®ååçSQL代ç ï¼å¹¶ä¸å¸®ä½ æç»æéä»è¡¨æ ¼å¼ç表示形å¼è½¬æ¢å°ä¸ç³»åç对象å»ã
+ </para>
+
+ <para>
+ å¦æä½ å¯¹Hibernateå对象/å
³ç³»æ°æ®åºæ å°è¿æ¯ä¸ªæ°æï¼æè
çè³å¯¹Javaä¹ä¸çæï¼è¯·æç
§ä¸é¢çæ¥éª¤æ¥å¦ä¹ ã
+ </para>
+
+ <orderedlist>
+ <listitem>
+ <para>
+ é
读<xref linkend="tutorial"/>ï¼è¿æ¯ä¸ç¯å
å«è¯¦ç»çéæ¥æ导çæåãæ¬æåçæºä»£ç å
å«å¨åè¡å
ä¸ï¼ä½ å¯ä»¥å¨<literal>doc/reference/tutorial/</literal>ç®å½ä¸æ¾å°ã </para>
+ </listitem>
+ <listitem>
+ <para>
+ é
读<xref linkend="architecture"/>æ¥ç解Hibernateå¯ä»¥ä½¿ç¨çç¯å¢ã
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ æ¥çHibernateåè¡å
ä¸ç<literal>eg/</literal>ç®å½ï¼éé¢æä¸ä¸ªç®åçç¬ç«è¿è¡çç¨åºãæä½ çJDBC驱å¨æ·è´å°<literal>lib/</literal>ç®å½ä¸ï¼ä¿®æ¹ä¸ä¸<literal>src/hibernate.properties</literal>,æå®å
¶ä¸ä½ çæ°æ®åºçä¿¡æ¯ãè¿å
¥å½ä»¤è¡ï¼åæ¢å°ä½ çåè¡å
çç®å½ï¼è¾å
¥<literal>ant eg</literal>(使ç¨äºAntï¼ï¼æè
å¨Windowsæä½ç³»ç»ä¸ä½¿ç¨<literal>build eg</literal>ã
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ æè¿ä»½åèææ¡£ä½ä¸ºä½ å¦ä¹ ç主è¦ä¿¡æ¯æ¥æºã
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ å¨Hibernate çç½ç«ä¸å¯ä»¥æ¾å°ç»å¸¸æé®çé®é¢ä¸è§£ç(FAQ)ã
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ å¨Hibernateç½ç«ä¸è¿æ第ä¸æ¹çæ¼ç¤ºã示ä¾åæç¨çé¾æ¥ã
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ Hibernateç½ç«çâ社åº(Community Area)âæ¯è®¨è®ºå
³äºè®¾è®¡æ¨¡å¼ä»¥åå¾å¤æ´åæ¹æ¡(Tomcat, JBoss AS, Struts, EJB,çç)ç好å°æ¹ã
+ </para>
+ </listitem>
+ </orderedlist>
+
+ <para>
+ å¦æä½ æé®é¢ï¼è¯·ä½¿ç¨Hibernateç½ç«ä¸é¾æ¥çç¨æ·è®ºåãæ们ä¹æä¾ä¸ä¸ªJIRAé®é¢è¿½è¸ªç³»ç»ï¼æ¥æébugæ¥ååæ°åè½è¯·æ±ãå¦æä½ å¯¹å¼åHibernateæå
´è¶£ï¼è¯·å å
¥å¼åè
çé®ä»¶å表ãï¼Hibernateç½ç«ä¸çç¨æ·è®ºåæä¸ä¸ªä¸æçé¢ï¼JavaEyeä¹æHibernateä¸æçé¢,æ¨å¯ä»¥å¨é£é交æµé®é¢ä¸ç»éªãï¼
+ </para>
+
+ <para>
+ åä¸å¼åã产åæ¯æåHibernateå¹è®å¯ä»¥éè¿JBoss Inc.è·å¾ãï¼è¯·æ¥é
ï¼http://www.hibernate.org/SupportTraining/ï¼ã
+ Hibernateæ¯ä¸ä¸ªä¸ä¸çå¼æ¾æºä»£ç 项ç®(Professional Open Source project)ï¼ä¹æ¯JBoss Enterprise Middleware System(JEMS),JBossä¼ä¸çº§ä¸é´ä»¶ç³»ç»çä¸ä¸ªæ ¸å¿ç»ä»¶ã
+ </para>
+
+</preface>
\ No newline at end of file
Copied: core/trunk/documentation/manual/zh-CN/src/main/docbook/content/query_criteria.xml (from rev 14080, core/trunk/documentation/manual/zh-CN/src/main/docbook/modules/query_criteria.xml)
===================================================================
--- core/trunk/documentation/manual/zh-CN/src/main/docbook/content/query_criteria.xml (rev 0)
+++ core/trunk/documentation/manual/zh-CN/src/main/docbook/content/query_criteria.xml 2007-10-09 20:10:34 UTC (rev 14081)
@@ -0,0 +1,424 @@
+<chapter id="querycriteria">
+ <title>
+ æ¡ä»¶æ¥è¯¢(Criteria Queries)
+ </title>
+ <para>
+ å
·æä¸ä¸ªç´è§çãå¯æ©å±çæ¡ä»¶æ¥è¯¢APIæ¯Hibernateçç¹è²ã
+ </para>
+
+ <sect1 id="querycriteria-creating">
+ <title>å建ä¸ä¸ª<literal>Criteria</literal> å®ä¾</title>
+
+ <para>
+ <literal>org.hibernate.Criteria</literal>æ¥å£è¡¨ç¤ºç¹å®æä¹
ç±»çä¸ä¸ªæ¥è¯¢ã<literal>Session</literal>æ¯
+ <literal>Criteria</literal>å®ä¾çå·¥åã
+ </para>
+
+ <programlisting><![CDATA[Criteria crit = sess.createCriteria(Cat.class);
+crit.setMaxResults(50);
+List cats = crit.list();]]></programlisting>
+
+ </sect1>
+
+ <sect1 id="querycriteria-narrowing">
+ <title>éå¶ç»æéå
容</title>
+
+ <para>
+ ä¸ä¸ªåç¬çæ¥è¯¢æ¡ä»¶æ¯<literal>org.hibernate.criterion.Criterion</literal>
+ æ¥å£çä¸ä¸ªå®ä¾ã<literal>org.hibernate.criterion.Restrictions</literal>ç±»
+ å®ä¹äºè·å¾æäºå
ç½®<literal>Criterion</literal>ç±»åçå·¥åæ¹æ³ã
+ </para>
+
+ <programlisting><![CDATA[List cats = sess.createCriteria(Cat.class)
+ .add( Restrictions.like("name", "Fritz%") )
+ .add( Restrictions.between("weight", minWeight, maxWeight) )
+ .list();]]></programlisting>
+
+ <para>
+ 约æå¯ä»¥æé»è¾åç»ã
+ </para>
+
+ <programlisting><![CDATA[List cats = sess.createCriteria(Cat.class)
+ .add( Restrictions.like("name", "Fritz%") )
+ .add( Restrictions.or(
+ Restrictions.eq( "age", new Integer(0) ),
+ Restrictions.isNull("age")
+ ) )
+ .list();]]></programlisting>
+
+ <programlisting><![CDATA[List cats = sess.createCriteria(Cat.class)
+ .add( Restrictions.in( "name", new String[] { "Fritz", "Izi", "Pk" } ) )
+ .add( Restrictions.disjunction()
+ .add( Restrictions.isNull("age") )
+ .add( Restrictions.eq("age", new Integer(0) ) )
+ .add( Restrictions.eq("age", new Integer(1) ) )
+ .add( Restrictions.eq("age", new Integer(2) ) )
+ ) )
+ .list();]]></programlisting>
+
+ <para>
+ Hibernateæä¾äºç¸å½å¤çå
ç½®criterionç±»å(<literal>Restrictions</literal>
+ åç±»), ä½æ¯å°¤å
¶æç¨çæ¯å¯ä»¥å
è®¸ä½ ç´æ¥ä½¿ç¨SQLã
+ </para>
+
+ <programlisting><![CDATA[List cats = sess.createCriteria(Cat.class)
+ .add( Restrictions.sqlRestriction("lower({alias}.name) like lower(?)", "Fritz%", Hibernate.STRING) )
+ .list();]]></programlisting>
+
+ <para>
+ <literal>{alias}</literal>å ä½ç¬¦åºå½è¢«æ¿æ¢ä¸ºè¢«æ¥è¯¢å®ä½çåå«åã
+ </para>
+
+ <para>
+
+ <literal>Property</literal>å®ä¾æ¯è·å¾ä¸ä¸ªæ¡ä»¶çå¦å¤ä¸ç§éå¾ãä½ å¯ä»¥éè¿è°ç¨<literal>Property.forName()</literal>
+ å建ä¸ä¸ª<literal>Property</literal>ã
+
+ </para>
+
+ <programlisting><![CDATA[
+Property age = Property.forName("age");
+List cats = sess.createCriteria(Cat.class)
+ .add( Restrictions.disjunction()
+ .add( age.isNull() )
+ .add( age.eq( new Integer(0) ) )
+ .add( age.eq( new Integer(1) ) )
+ .add( age.eq( new Integer(2) ) )
+ ) )
+ .add( Property.forName("name").in( new String[] { "Fritz", "Izi", "Pk" } ) )
+ .list();]]></programlisting>
+
+ </sect1>
+
+ <sect1 id="querycriteria-ordering">
+ <title>ç»æéæåº</title>
+
+ <para>
+ ä½ å¯ä»¥ä½¿ç¨<literal>org.hibernate.criterion.Order</literal>æ¥ä¸ºæ¥è¯¢ç»ææåºã
+ </para>
+
+ <programlisting><![CDATA[List cats = sess.createCriteria(Cat.class)
+ .add( Restrictions.like("name", "F%")
+ .addOrder( Order.asc("name") )
+ .addOrder( Order.desc("age") )
+ .setMaxResults(50)
+ .list();]]></programlisting>
+
+ <programlisting><![CDATA[List cats = sess.createCriteria(Cat.class)
+ .add( Property.forName("name").like("F%") )
+ .addOrder( Property.forName("name").asc() )
+ .addOrder( Property.forName("age").desc() )
+ .setMaxResults(50)
+ .list();]]></programlisting>
+
+ </sect1>
+
+ <sect1 id="querycriteria-associations" revision="2">
+ <title>å
³è</title>
+
+ <para>
+ ä½ å¯ä»¥ä½¿ç¨<literal>createCriteria()</literal>é常容æçå¨äºç¸å
³èçå®ä½é´å»ºç«
+ 约æã
+ </para>
+
+ <programlisting><![CDATA[List cats = sess.createCriteria(Cat.class)
+ .add( Restrictions.like("name", "F%") )
+ .createCriteria("kittens")
+ .add( Restrictions.like("name", "F%") )
+ .list();]]></programlisting>
+
+ <para>
+ 注æ第äºä¸ª <literal>createCriteria()</literal>è¿åä¸ä¸ªæ°ç
+ <literal>Criteria</literal>å®ä¾ï¼è¯¥å®ä¾å¼ç¨<literal>kittens</literal> éåä¸çå
ç´ ã
+ </para>
+
+ <para>
+ æ¥ä¸æ¥ï¼æ¿æ¢å½¢æå¨æäºæ
åµä¸ä¹æ¯å¾æç¨çã
+ </para>
+
+ <programlisting><![CDATA[List cats = sess.createCriteria(Cat.class)
+ .createAlias("kittens", "kt")
+ .createAlias("mate", "mt")
+ .add( Restrictions.eqProperty("kt.name", "mt.name") )
+ .list();]]></programlisting>
+
+ <para>
+
+ (<literal>createAlias()</literal>并ä¸å建ä¸ä¸ªæ°ç
+ <literal>Criteria</literal>å®ä¾ã)
+ </para>
+
+ <para>
+ <literal>Cat</literal>å®ä¾æä¿åçä¹å两次æ¥è¯¢æè¿åçkittenséåæ¯
+ <emphasis>没æ</emphasis>被æ¡ä»¶é¢è¿æ»¤çãå¦æä½ å¸æåªè·å¾ç¬¦åæ¡ä»¶çkittensï¼
+ ä½ å¿
须使ç¨<literal>ResultTransformer</literal>ã
+
+ </para>
+
+ <programlisting><![CDATA[List cats = sess.createCriteria(Cat.class)
+ .createCriteria("kittens", "kt")
+ .add( Restrictions.eq("name", "F%") )
+ .setResultTransformer(Criteria.ALIAS_TO_ENTITY_MAP)
+ .list();
+Iterator iter = cats.iterator();
+while ( iter.hasNext() ) {
+ Map map = (Map) iter.next();
+ Cat cat = (Cat) map.get(Criteria.ROOT_ALIAS);
+ Cat kitten = (Cat) map.get("kt");
+}]]></programlisting>
+
+ </sect1>
+
+ <sect1 id="querycriteria-dynamicfetching" revision="1">
+ <title>å¨æå
³èæå</title>
+
+ <para>
+ ä½ å¯ä»¥ä½¿ç¨<literal>setFetchMode()</literal>å¨è¿è¡æ¶å®ä¹å¨æå
³èæåçè¯ä¹ã
+ </para>
+
+ <programlisting><![CDATA[List cats = sess.createCriteria(Cat.class)
+ .add( Restrictions.like("name", "Fritz%") )
+ .setFetchMode("mate", FetchMode.EAGER)
+ .setFetchMode("kittens", FetchMode.EAGER)
+ .list();]]></programlisting>
+
+ <para>
+ è¿ä¸ªæ¥è¯¢å¯ä»¥éè¿å¤è¿æ¥æå<literal>mate</literal>å<literal>kittens</literal>ã
+ æ¥ç<xref linkend="performance-fetching"/>å¯ä»¥è·å¾æ´å¤ä¿¡æ¯ã
+ </para>
+
+ </sect1>
+
+ <sect1 id="querycriteria-examples">
+ <title>æ¥è¯¢ç¤ºä¾</title>
+
+ <para>
+ <literal>org.hibernate.criterion.Example</literal>ç±»å
è®¸ä½ éè¿ä¸ä¸ªç»å®å®ä¾
+ æ建ä¸ä¸ªæ¡ä»¶æ¥è¯¢ã
+ </para>
+
+ <programlisting><![CDATA[Cat cat = new Cat();
+cat.setSex('F');
+cat.setColor(Color.BLACK);
+List results = session.createCriteria(Cat.class)
+ .add( Example.create(cat) )
+ .list();]]></programlisting>
+
+ <para>
+ çæ¬å±æ§ãæ è¯ç¬¦åå
³è被忽ç¥ãé»è®¤æ
åµä¸å¼ä¸ºnullçå±æ§å°è¢«æé¤ã
+ </para>
+
+ <para>
+ ä½ å¯ä»¥èªè¡è°æ´<literal>Example</literal>使ä¹æ´å®ç¨ã
+ </para>
+
+ <programlisting><![CDATA[Example example = Example.create(cat)
+ .excludeZeroes() //exclude zero valued properties
+ .excludeProperty("color") //exclude the property named "color"
+ .ignoreCase() //perform case insensitive string comparisons
+ .enableLike(); //use like for string comparisons
+List results = session.createCriteria(Cat.class)
+ .add(example)
+ .list();]]></programlisting>
+
+ <para>
+ ä½ çè³å¯ä»¥ä½¿ç¨exampleså¨å
³è对象ä¸æ¾ç½®æ¡ä»¶ã
+ </para>
+
+ <programlisting><![CDATA[List results = session.createCriteria(Cat.class)
+ .add( Example.create(cat) )
+ .createCriteria("mate")
+ .add( Example.create( cat.getMate() ) )
+ .list();]]></programlisting>
+
+ </sect1>
+
+ <sect1 id="querycriteria-projection">
+ <title>æå½±(Projections)ãèåï¼aggregationï¼ååç»ï¼groupingï¼</title>
+ <para>
+ <literal>org.hibernate.criterion.Projections</literal>æ¯
+ <literal>Projection</literal> çå®ä¾å·¥åãæ们éè¿è°ç¨
+ <literal>setProjection()</literal>åºç¨æå½±å°ä¸ä¸ªæ¥è¯¢ã
+ </para>
+
+ <programlisting><![CDATA[List results = session.createCriteria(Cat.class)
+ .setProjection( Projections.rowCount() )
+ .add( Restrictions.eq("color", Color.BLACK) )
+ .list();]]></programlisting>
+
+ <programlisting><![CDATA[List results = session.createCriteria(Cat.class)
+ .setProjection( Projections.projectionList()
+ .add( Projections.rowCount() )
+ .add( Projections.avg("weight") )
+ .add( Projections.max("weight") )
+ .add( Projections.groupProperty("color") )
+ )
+ .list();]]></programlisting>
+
+ <para>
+ å¨ä¸ä¸ªæ¡ä»¶æ¥è¯¢ä¸æ²¡æå¿
è¦æ¾å¼çä½¿ç¨ "group by" ãæäºæ影类åå°±æ¯è¢«å®ä¹ä¸º<emphasis>
+ åç»æå½±</emphasis>ï¼ä»ä»¬ä¹åºç°å¨SQLç<literal>group by</literal>åå¥ä¸ã
+ </para>
+
+ <para>
+ ä½ å¯ä»¥éæ©æä¸ä¸ªå«åææ´¾ç»ä¸ä¸ªæå½±ï¼è¿æ ·å¯ä»¥ä½¿æå½±å¼è¢«çº¦æææåºæå¼ç¨ãä¸é¢æ¯ä¸¤ç§ä¸åçå®ç°æ¹å¼ï¼
+ </para>
+
+ <programlisting><![CDATA[List results = session.createCriteria(Cat.class)
+ .setProjection( Projections.alias( Projections.groupProperty("color"), "colr" ) )
+ .addOrder( Order.asc("colr") )
+ .list();]]></programlisting>
+
+ <programlisting><![CDATA[List results = session.createCriteria(Cat.class)
+ .setProjection( Projections.groupProperty("color").as("colr") )
+ .addOrder( Order.asc("colr") )
+ .list();]]></programlisting>
+
+ <para>
+ <literal>alias()</literal>å<literal>as()</literal>æ¹æ³ç®ä¾¿çå°ä¸ä¸ªæå½±å®ä¾å
è£
å°å¦å¤ä¸ä¸ª
+ å«åç<literal>Projection</literal>å®ä¾ä¸ãç®èè¨ä¹ï¼å½ä½ æ·»å ä¸ä¸ªæå½±å°ä¸ä¸ªæå½±å表ä¸æ¶
+ ä½ å¯ä»¥ä¸ºå®æå®ä¸ä¸ªå«åï¼
+ </para>
+
+ <programlisting><![CDATA[List results = session.createCriteria(Cat.class)
+ .setProjection( Projections.projectionList()
+ .add( Projections.rowCount(), "catCountByColor" )
+ .add( Projections.avg("weight"), "avgWeight" )
+ .add( Projections.max("weight"), "maxWeight" )
+ .add( Projections.groupProperty("color"), "color" )
+ )
+ .addOrder( Order.desc("catCountByColor") )
+ .addOrder( Order.desc("avgWeight") )
+ .list();]]></programlisting>
+
+ <programlisting><![CDATA[List results = session.createCriteria(Domestic.class, "cat")
+ .createAlias("kittens", "kit")
+ .setProjection( Projections.projectionList()
+ .add( Projections.property("cat.name"), "catName" )
+ .add( Projections.property("kit.name"), "kitName" )
+ )
+ .addOrder( Order.asc("catName") )
+ .addOrder( Order.asc("kitName") )
+ .list();]]></programlisting>
+
+ <para>
+ ä½ ä¹å¯ä»¥ä½¿ç¨<literal>Property.forName()</literal>æ¥è¡¨ç¤ºæå½±ï¼
+ </para>
+
+ <programlisting><![CDATA[List results = session.createCriteria(Cat.class)
+ .setProjection( Property.forName("name") )
+ .add( Property.forName("color").eq(Color.BLACK) )
+ .list();]]></programlisting>
+
+ <programlisting><![CDATA[List results = session.createCriteria(Cat.class)
+ .setProjection( Projections.projectionList()
+ .add( Projections.rowCount().as("catCountByColor") )
+ .add( Property.forName("weight").avg().as("avgWeight") )
+ .add( Property.forName("weight").max().as("maxWeight") )
+ .add( Property.forName("color").group().as("color" )
+ )
+ .addOrder( Order.desc("catCountByColor") )
+ .addOrder( Order.desc("avgWeight") )
+ .list();]]></programlisting>
+
+ </sect1>
+
+ <sect1 id="querycriteria-detachedqueries">
+ <title>离线(detached)æ¥è¯¢ååæ¥è¯¢</title>
+ <para>
+ <literal>DetachedCriteria</literal>ç±»ä½¿ä½ å¨ä¸ä¸ªsessionèå´ä¹å¤å建ä¸ä¸ªæ¥è¯¢ï¼å¹¶ä¸å¯ä»¥ä½¿ç¨ä»»æç
+ <literal>Session</literal>æ¥æ§è¡å®ã
+ </para>
+
+ <programlisting><![CDATA[DetachedCriteria query = DetachedCriteria.forClass(Cat.class)
+ .add( Property.forName("sex").eq('F') );
+
+Session session = ....;
+Transaction txn = session.beginTransaction();
+List results = query.getExecutableCriteria(session).setMaxResults(100).list();
+txn.commit();
+session.close();]]></programlisting>
+
+ <para>
+ <literal>DetachedCriteria</literal>ä¹å¯ä»¥ç¨ä»¥è¡¨ç¤ºåæ¥è¯¢ãæ¡ä»¶å®ä¾å
å«åæ¥è¯¢å¯ä»¥éè¿
+ <literal>Subqueries</literal>æè
<literal>Property</literal>è·å¾ã
+ </para>
+
+ <programlisting><![CDATA[DetachedCriteria avgWeight = DetachedCriteria.forClass(Cat.class)
+ .setProjection( Property.forName("weight").avg() );
+session.createCriteria(Cat.class)
+ .add( Property.forName("weight").gt(avgWeight) )
+ .list();]]></programlisting>
+
+ <programlisting><![CDATA[DetachedCriteria weights = DetachedCriteria.forClass(Cat.class)
+ .setProjection( Property.forName("weight") );
+session.createCriteria(Cat.class)
+ .add( Subqueries.geAll("weight", weights) )
+ .list();]]></programlisting>
+
+ <para>
+ çè³ç¸äºå
³èçåæ¥è¯¢ä¹æ¯æå¯è½çï¼
+ </para>
+
+ <programlisting><![CDATA[DetachedCriteria avgWeightForSex = DetachedCriteria.forClass(Cat.class, "cat2")
+ .setProjection( Property.forName("weight").avg() )
+ .add( Property.forName("cat2.sex").eqProperty("cat.sex") );
+session.createCriteria(Cat.class, "cat")
+ .add( Property.forName("weight").gt(avgWeightForSex) )
+ .list();]]></programlisting>
+
+ </sect1>
+
+
+ <!--TODO: ResultSetTransformer + aliasing. AliasToBeanTransformer allow returning arbitrary
+ user objects - similar to setResultClass in JDO2. General use of ResultTransformer
+ could also be explained. -->
+
+ <sect1 id="query-criteria-naturalid">
+ <title>æ ¹æ®èªç¶æ è¯æ¥è¯¢(Queries by natural identifier)</title>
+
+
+ <para>
+ 对大å¤æ°æ¥è¯¢ï¼å
æ¬æ¡ä»¶æ¥è¯¢èè¨ï¼å 为æ¥è¯¢ç¼åç失æ(invalidation)åçå¾å¤ªé¢ç¹ï¼æ¥è¯¢ç¼åä¸æ¯é常é«æãç¶èï¼æä¸ç§ç¹å«çæ¥è¯¢ï¼å¯ä»¥éè¿ä¸åçèªç¶é®ä¼åç¼åç失æç®æ³ãå¨æäºåºç¨ä¸ï¼è¿ç§ç±»åçæ¥è¯¢æ¯è¾å¸¸è§ãæ¡ä»¶æ¥è¯¢API对è¿ç§ç¨ä¾æä¾äºç¹å«è§çº¦ã
+ </para>
+
+ <para>
+ é¦å
ï¼ä½ åºè¯¥å¯¹ä½ çentity使ç¨<literal><natural-id></literal>æ¥æ å°èªç¶é®ï¼ç¶åæå¼ç¬¬äºçº§ç¼åã
+ </para>
+
+ <programlisting><![CDATA[<class name="User">
+ <cache usage="read-write"/>
+ <id name="id">
+ <generator class="increment"/>
+ </id>
+ <natural-id>
+ <property name="name"/>
+ <property name="org"/>
+ </natural-id>
+ <property name="password"/>
+</class>]]></programlisting>
+
+ <para>
+ 注æ,æ¤åè½å¯¹å
·æ<emphasis>mutable</emphasis>èªç¶é®çentity并ä¸éç¨ã
+ </para>
+
+ <para>
+ ç¶åï¼æå¼Hibernate æ¥è¯¢ç¼åã
+ </para>
+
+ <para>
+ ç°å¨ï¼æ们å¯ä»¥ç¨<literal>Restrictions.naturalId()</literal>æ¥ä½¿ç¨æ´å é«æçç¼åç®æ³ã
+ </para>
+
+ <programlisting><![CDATA[session.createCriteria(User.class)
+ .add( Restrictions.naturalId()
+ .set("name", "gavin")
+ .set("org", "hb")
+ ).setCacheable(true)
+ .uniqueResult();]]></programlisting>
+
+ </sect1>
+
+
+</chapter>
+
Copied: core/trunk/documentation/manual/zh-CN/src/main/docbook/content/query_hql.xml (from rev 14080, core/trunk/documentation/manual/zh-CN/src/main/docbook/modules/query_hql.xml)
===================================================================
--- core/trunk/documentation/manual/zh-CN/src/main/docbook/content/query_hql.xml (rev 0)
+++ core/trunk/documentation/manual/zh-CN/src/main/docbook/content/query_hql.xml 2007-10-09 20:10:34 UTC (rev 14081)
@@ -0,0 +1,1088 @@
+<chapter id="queryhql">
+ <title>HQL: Hibernateæ¥è¯¢è¯è¨</title>
+ <para>
+ Hibernateé
å¤äºä¸ç§é常强大çæ¥è¯¢è¯è¨ï¼è¿ç§è¯è¨çä¸å»å¾åSQLãä½æ¯ä¸è¦è¢«è¯æ³ç»æ
+ ä¸çç¸ä¼¼æè¿·æï¼HQLæ¯é常ææè¯ç被设计为å®å
¨é¢å对象çæ¥è¯¢ï¼å®å¯ä»¥ç解å¦ç»§æ¿ãå¤æ
+ åå
³èä¹ç±»çæ¦å¿µã
+ </para>
+
+ <sect1 id="queryhql-casesensitivity">
+ <title>大å°åæææ§é®é¢</title>
+
+ <para>
+ é¤äºJavaç±»ä¸å±æ§çå称å¤ï¼æ¥è¯¢è¯å¥å¯¹å¤§å°å并ä¸ææã
+ æ以 <literal>SeLeCT</literal> ä¸
+ <literal>sELEct</literal> 以å
+ <literal>SELECT</literal> æ¯ç¸åçï¼ä½æ¯
+ <literal>org.hibernate.eg.FOO</literal> 并ä¸çä»·äº
+ <literal>org.hibernate.eg.Foo</literal> 并ä¸
+ <literal>foo.barSet</literal> ä¹ä¸çä»·äº
+ <literal>foo.BARSET</literal>ã
+ </para>
+
+ <para>
+ æ¬æåä¸çHQLå
³é®åå°ä½¿ç¨å°ååæ¯. å¾å¤ç¨æ·åç°ä½¿ç¨å®å
¨å¤§åçå
³é®åä¼ä½¿æ¥è¯¢è¯å¥
+ çå¯è¯»æ§æ´å¼º, ä½æ们åç°ï¼å½ææ¥è¯¢è¯å¥åµå
¥å°Javaè¯å¥ä¸çæ¶å使ç¨å¤§åå
³é®åæ¯è¾é¾çã
+ </para>
+
+ </sect1>
+
+ <sect1 id="queryhql-from">
+ <title>fromåå¥</title>
+
+ <para>
+ Hibernateä¸æç®åçæ¥è¯¢è¯å¥çå½¢å¼å¦ä¸ï¼
+ </para>
+
+ <programlisting><![CDATA[from eg.Cat]]></programlisting>
+
+ <para>
+ 该åå¥ç®åçè¿å<literal>eg.Cat</literal>ç±»çææå®ä¾ã
+ é常æ们ä¸éè¦ä½¿ç¨ç±»çå
¨éå®å, å 为 <literal>auto-import</literal>ï¼èªå¨å¼å
¥ï¼
+ æ¯ç¼ºççæ
åµã æ以æ们å ä¹åªä½¿ç¨å¦ä¸çç®ååæ³ï¼
+ </para>
+
+ <programlisting><![CDATA[from Cat]]></programlisting>
+
+ <para>
+ 大å¤æ°æ
åµä¸, ä½ éè¦æå®ä¸ä¸ª<emphasis>å«å</emphasis>, åå æ¯ä½ å¯è½éè¦
+ å¨æ¥è¯¢è¯å¥çå
¶å®é¨åå¼ç¨å°<literal>Cat</literal>
+ </para>
+
+ <programlisting><![CDATA[from Cat as cat]]></programlisting>
+
+ <para>
+ è¿ä¸ªè¯å¥æå«å<literal>cat</literal>æå®ç»ç±»<literal>Cat</literal>
+ çå®ä¾, è¿æ ·æ们就å¯ä»¥å¨éåçæ¥è¯¢ä¸ä½¿ç¨æ¤å«åäºã å
³é®å<literal>as</literal>
+ æ¯å¯éçï¼æ们ä¹å¯ä»¥è¿æ ·å:
+ </para>
+
+ <programlisting><![CDATA[from Cat cat]]></programlisting>
+
+ <para>
+ åå¥ä¸å¯ä»¥åæ¶åºç°å¤ä¸ªç±», å
¶æ¥è¯¢ç»ææ¯äº§çä¸ä¸ªç¬å¡å¿ç§¯æ产ç跨表çè¿æ¥ã
+ </para>
+
+ <programlisting><![CDATA[from Formula, Parameter]]></programlisting>
+ <programlisting><![CDATA[from Formula as form, Parameter as param]]></programlisting>
+
+ <para>
+ æ¥è¯¢è¯å¥ä¸å«åçå¼å¤´é¨åå°å被认为æ¯å®è·µä¸çå¥½ä¹ æ¯ï¼
+ è¿æ ·åä¸Javaåéçå½åæ åä¿æäºä¸è´
+ (æ¯å¦ï¼<literal>domesticCat</literal>)ã
+ </para>
+
+ </sect1>
+
+ <sect1 id="queryhql-joins" revision="2">
+ <title>å
³è(Association)ä¸è¿æ¥(Join)</title>
+
+ <para>
+ æ们ä¹å¯ä»¥ä¸ºç¸å
³èçå®ä½çè³æ¯å¯¹ä¸ä¸ªéåä¸çå
¨é¨å
ç´ æå®ä¸ä¸ªå«å, è¿æ¶è¦ä½¿ç¨å
³é®å<literal>join</literal>ã
+ </para>
+
+ <programlisting><![CDATA[from Cat as cat
+ inner join cat.mate as mate
+ left outer join cat.kittens as kitten]]></programlisting>
+
+ <programlisting><![CDATA[from Cat as cat left join cat.mate.kittens as kittens]]></programlisting>
+
+ <programlisting><![CDATA[from Formula form full join form.parameter param]]></programlisting>
+
+ <para>
+ åæ¯æçè¿æ¥ç±»åæ¯ä»ANSI SQLä¸åé´æ¥çã
+ </para>
+
+ <itemizedlist spacing="compact">
+ <listitem>
+ <para>
+ <literal>inner join</literal>ï¼å
è¿æ¥ï¼
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ <literal>left outer join</literal>ï¼å·¦å¤è¿æ¥ï¼
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ <literal>right outer join</literal>ï¼å³å¤è¿æ¥ï¼
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ <literal>full join</literal> (å
¨è¿æ¥ï¼å¹¶ä¸å¸¸ç¨)
+ </para>
+ </listitem>
+ </itemizedlist>
+
+ <para>
+ è¯å¥<literal>inner join</literal>, <literal>left outer join</literal> 以å
+ <literal>right outer join</literal> å¯ä»¥ç®åã
+ </para>
+
+ <programlisting><![CDATA[from Cat as cat
+ join cat.mate as mate
+ left join cat.kittens as kitten]]></programlisting>
+
+ <para>
+ éè¿HQLç<literal>with</literal>å
³é®åï¼ä½ å¯ä»¥æä¾é¢å¤çjoinæ¡ä»¶ã
+ </para>
+
+ <programlisting><![CDATA[from Cat as cat
+ left join cat.kittens as kitten
+ with kitten.bodyWeight > 10.0]]></programlisting>
+
+ <para>
+ è¿æï¼ä¸ä¸ª"fetch"è¿æ¥å
许ä»
ä»
使ç¨ä¸ä¸ªéæ©è¯å¥å°±å°ç¸å
³èç对象æä¸ç»å¼çéåéçä»ä»¬çç¶å¯¹è±¡çåå§åè被åå§åï¼è¿ç§æ¹æ³å¨ä½¿ç¨å°éåçæ
åµä¸å°¤å
¶æç¨ï¼å¯¹äºå
³èåéåæ¥è¯´ï¼å®ææç代æ¿äºæ å°æ件ä¸çå¤èæ¥
+ ä¸å»¶è¿å£°æï¼lazy declarationsï¼. æ¥ç
+ <xref linkend="performance-fetching"/> 以è·å¾çå¤çä¿¡æ¯ã
+ </para>
+
+ <programlisting><![CDATA[from Cat as cat
+ inner join fetch cat.mate
+ left join fetch cat.kittens]]></programlisting>
+
+ <para>
+ ä¸ä¸ªfetchè¿æ¥é常ä¸éè¦è¢«æå®å«å, å 为ç¸å
³èç对象ä¸åºå½è¢«ç¨å¨
+ <literal>where</literal> åå¥ (æå
¶å®ä»»ä½åå¥)ä¸ãåæ¶ï¼ç¸å
³èç对象
+ 并ä¸å¨æ¥è¯¢çç»æä¸ç´æ¥è¿åï¼ä½å¯ä»¥éè¿ä»ä»¬çç¶å¯¹è±¡æ¥è®¿é®å°ä»ä»¬ã
+ </para>
+
+ <programlisting><![CDATA[from Cat as cat
+ inner join fetch cat.mate
+ left join fetch cat.kittens child
+ left join fetch child.kittens]]></programlisting>
+
+
+ <para>
+ åè¥ä½¿ç¨<literal>iterate()</literal>æ¥è°ç¨æ¥è¯¢ï¼è¯·æ³¨æ<literal>fetch</literal>æé æ¯ä¸è½ä½¿ç¨ç(<literal>scroll()</literal> å¯ä»¥ä½¿ç¨)ã<literal>fetch</literal>ä¹ä¸åºè¯¥ä¸<literal>setMaxResults()</literal> æ<literal>setFirstResult()</literal>å
±ç¨ï¼è¿æ¯å 为è¿äºæä½æ¯åºäºç»æéçï¼èå¨é¢å
æåéåç±»æ¶å¯è½å
å«éå¤çæ°æ®ï¼ä¹å°±æ¯è¯´æ æ³é¢å
ç¥é精确çè¡æ°ã<literal>fetch</literal>è¿ä¸è½ä¸ç¬ç«ç <literal>with</literal>æ¡ä»¶ä¸èµ·ä½¿ç¨ãéè¿å¨ä¸æ¬¡æ¥è¯¢ä¸fetchå¤ä¸ªéåï¼å¯ä»¥å¶é åºç¬å¡å°ç§¯ï¼å æ¤è¯·å¤å 注æã对bagæ å°æ¥è¯´ï¼åæ¶join fetchå¤ä¸ªéåè§è²å¯è½å¨æäºæ
åµä¸ç»åºå¹¶éé¢æçç»æï¼ä¹è¯·å°å¿ãæå注æï¼ä½¿ç¨<literal>full join fetch</literal> ä¸ <literal>right join fetch</literal>æ¯æ²¡ææä¹çã
+ </para>
+
+ <para>
+ å¦æä½ ä½¿ç¨å±æ§çº§å«ç延è¿è·åï¼lazy fetchingï¼ï¼è¿æ¯éè¿éæ°ç¼ååèç å®ç°çï¼ï¼å¯ä»¥ä½¿ç¨ <literal>fetch
+all properties</literal>
+ æ¥å¼ºå¶Hibernateç«å³åå¾é£äºåæ¬éè¦å»¶è¿å è½½çå±æ§ï¼å¨ç¬¬ä¸ä¸ªæ¥è¯¢ä¸ï¼ã
+
+ </para>
+
+ <programlisting><![CDATA[from Document fetch all properties order by name]]></programlisting>
+ <programlisting><![CDATA[from Document doc fetch all properties where lower(doc.name) like '%cats%']]></programlisting>
+
+ </sect1>
+
+ <sect1 id="queryhql-joins-forms">
+ <title>join è¯æ³çå½¢å¼</title>
+
+ <para>
+ HQLæ¯æ两ç§å
³èjoinçå½¢å¼ï¼<literal>implicit(éå¼)</literal> ä¸<literal>explicitï¼æ¾å¼ï¼</literal>ã
+ </para>
+
+ <para>
+ ä¸ä¸èä¸ç»åºçæ¥è¯¢é½æ¯ä½¿ç¨<literal>explicit(æ¾å¼)</literal>å½¢å¼çï¼å
¶ä¸formåå¥ä¸æç¡®ç»åºäºjoinå
³é®åãè¿æ¯å»ºè®®ä½¿ç¨çæ¹å¼ã
+ </para>
+
+ <para>
+ <literal>implicitï¼éå¼ï¼</literal>å½¢å¼ä¸ä½¿ç¨joinå
³é®åãå
³è使ç¨"ç¹å·"æ¥è¿è¡âå¼ç¨âã<literal>implicit</literal> joinå¯ä»¥å¨ä»»ä½HQLåå¥ä¸åºç°.<literal>implicit</literal> joinå¨æç»çSQLè¯å¥ä¸ä»¥inner joinçæ¹å¼åºç°ã
+ </para>
+
+ <programlisting><![CDATA[from Cat as cat where cat.mate.name like '%s%']]></programlisting>
+ </sect1>
+
+ <sect1 id="queryhql-select">
+ <title>selectåå¥</title>
+
+ <para>
+ <literal>select</literal> åå¥éæ©å°åªäºå¯¹è±¡ä¸å±æ§è¿
+ åå°æ¥è¯¢ç»æéä¸. èèå¦ä¸æ
åµ:
+ </para>
+
+ <programlisting><![CDATA[select mate
+from Cat as cat
+ inner join cat.mate as mate]]></programlisting>
+
+ <para>
+ 该è¯å¥å°éæ©<literal>mate</literal>s of other <literal>Cat</literal>sãï¼å
¶ä»ç«çé
å¶ï¼
+ å®é
ä¸, ä½ å¯ä»¥æ´ç®æ´çç¨ä»¥ä¸çæ¥è¯¢è¯å¥è¡¨è¾¾ç¸åçå«ä¹:
+ </para>
+
+ <programlisting><![CDATA[select cat.mate from Cat cat]]></programlisting>
+
+ <para>
+ æ¥è¯¢è¯å¥å¯ä»¥è¿åå¼ä¸ºä»»ä½ç±»åçå±æ§ï¼å
æ¬è¿åç±»å为æç§ç»ä»¶(Component)çå±æ§:
+ </para>
+
+ <programlisting><![CDATA[select cat.name from DomesticCat cat
+where cat.name like 'fri%']]></programlisting>
+
+ <programlisting><![CDATA[select cust.name.firstName from Customer as cust]]></programlisting>
+
+ <para>
+ æ¥è¯¢è¯å¥å¯ä»¥è¿åå¤ä¸ªå¯¹è±¡åï¼æï¼å±æ§ï¼åæ¾å¨
+ <literal>Object[]</literal>éåä¸,
+ </para>
+
+ <programlisting><![CDATA[select mother, offspr, mate.name
+from DomesticCat as mother
+ inner join mother.mate as mate
+ left outer join mother.kittens as offspr]]></programlisting>
+
+ <para>
+ æåæ¾å¨ä¸ä¸ª<literal>List</literal>对象ä¸,
+ </para>
+
+ <programlisting><![CDATA[select new list(mother, offspr, mate.name)
+from DomesticCat as mother
+ inner join mother.mate as mate
+ left outer join mother.kittens as offspr]]></programlisting>
+
+ <para>
+ ä¹å¯è½ç´æ¥è¿åä¸ä¸ªå®é
çç±»åå®å
¨çJava对象,
+ </para>
+
+ <programlisting><![CDATA[select new Family(mother, mate, offspr)
+from DomesticCat as mother
+ join mother.mate as mate
+ left join mother.kittens as offspr]]></programlisting>
+
+ <para>
+ å设类<literal>Family</literal>æä¸ä¸ªåéçæé å½æ°.
+ </para>
+
+ <para>
+ ä½ å¯ä»¥ä½¿ç¨å
³é®å<literal>as</literal>ç»â被éæ©äºç表达å¼âææ´¾å«å:
+ </para>
+
+ <programlisting><![CDATA[select max(bodyWeight) as max, min(bodyWeight) as min, count(*) as n
+from Cat cat]]></programlisting>
+
+ <para>
+ è¿ç§åæ³å¨ä¸åå¥<literal>select new map</literal>ä¸èµ·ä½¿ç¨æ¶ææç¨:
+ </para>
+
+ <programlisting><![CDATA[select new map( max(bodyWeight) as max, min(bodyWeight) as min, count(*) as n )
+from Cat cat]]></programlisting>
+
+ <para>
+ 该æ¥è¯¢è¿åäºä¸ä¸ª<literal>Map</literal>ç对象ï¼å
容æ¯å«åä¸è¢«éæ©çå¼ç»æçå-å¼æ å°ã
+ </para>
+
+ </sect1>
+
+ <sect1 id="queryhql-aggregation">
+ <title>èéå½æ°</title>
+
+ <para>
+ HQLæ¥è¯¢çè³å¯ä»¥è¿åä½ç¨äºå±æ§ä¹ä¸çèéå½æ°ç计ç®ç»æ:
+ </para>
+
+ <programlisting><![CDATA[select avg(cat.weight), sum(cat.weight), max(cat.weight), count(cat)
+from Cat cat]]></programlisting>
+
+<!-- å·²ç»ä¸å被继ç»æ¯æ
+ <para>
+ å¨<literal>select</literal>åå¥ä¸ï¼éåï¼Collectionsï¼ä¹å¯ä»¥åºç°å¨èéå½æ°çå
é¨ã
+ </para>
+
+ <programlisting><![CDATA[select cat, count( elements(cat.kittens) )
+from Cat cat group by cat]]></programlisting>
+-->
+
+ <para>
+ åæ¯æçèéå½æ°å¦ä¸ï¼
+ </para>
+
+ <itemizedlist spacing="compact">
+ <listitem>
+ <para>
+ <literal>avg(...), sum(...), min(...), max(...)</literal>
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ <literal>count(*)</literal>
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ <literal>count(...), count(distinct ...), count(all...)</literal>
+ </para>
+ </listitem>
+ </itemizedlist>
+
+ <para>
+ ä½ å¯ä»¥å¨éæ©åå¥ä¸ä½¿ç¨æ°å¦æä½ç¬¦ãè¿æ¥ä»¥åç»è¿éªè¯çSQLå½æ°ï¼
+ </para>
+
+ <programlisting><![CDATA[select cat.weight + sum(kitten.weight)
+from Cat cat
+ join cat.kittens kitten
+group by cat.id, cat.weight]]></programlisting>
+
+ <programlisting><![CDATA[select firstName||' '||initial||' '||upper(lastName) from Person]]></programlisting>
+
+ <para>
+ å
³é®å<literal>distinct</literal>ä¸<literal>all</literal> ä¹å¯ä»¥ä½¿ç¨ï¼å®ä»¬å
·æä¸SQLç¸åçè¯ä¹.
+ </para>
+
+ <programlisting><![CDATA[select distinct cat.name from Cat cat
+
+select count(distinct cat.name), count(cat) from Cat cat]]></programlisting>
+
+ </sect1>
+
+ <sect1 id="queryhql-polymorphism">
+ <title>å¤ææ¥è¯¢</title>
+
+ <para>
+ ä¸ä¸ªå¦ä¸çæ¥è¯¢è¯å¥:
+ </para>
+
+ <programlisting><![CDATA[from Cat as cat]]></programlisting>
+
+ <para>
+ ä¸ä»
è¿å<literal>Cat</literal>ç±»çå®ä¾, ä¹åæ¶è¿ååç±»
+ <literal>DomesticCat</literal>çå®ä¾. Hibernate å¯ä»¥å¨<literal>from</literal>åå¥ä¸æå®<emphasis>ä»»ä½</emphasis>
+ Java ç±»ææ¥å£. æ¥è¯¢ä¼è¿å继æ¿äºè¯¥ç±»çæææä¹
ååç±»
+ çå®ä¾æè¿å声æäºè¯¥æ¥å£çæææä¹
åç±»çå®ä¾ãä¸é¢çæ¥è¯¢è¯å¥è¿åææç被æä¹
åç对象ï¼
+ </para>
+
+ <programlisting><![CDATA[from java.lang.Object o]]></programlisting>
+
+ <para>
+ æ¥å£<literal>Named</literal> å¯è½è¢«åç§åæ ·çæä¹
å类声æï¼
+ </para>
+
+ <programlisting><![CDATA[from Named n, Named m where n.name = m.name]]></programlisting>
+
+ <para>
+ 注æï¼æåç两个æ¥è¯¢å°éè¦è¶
è¿ä¸ä¸ªçSQL <literal>SELECT</literal>.è¿è¡¨æ<literal>order by</literal>åå¥
+ 没æ对æ´ä¸ªç»æéè¿è¡æ£ç¡®çæåº.
+ (è¿ä¹è¯´æä½ ä¸è½å¯¹è¿æ ·çæ¥è¯¢ä½¿ç¨<literal>Query.scroll()</literal>æ¹æ³.)
+ </para>
+
+ </sect1>
+
+ <sect1 id="queryhql-where">
+ <title>whereåå¥</title>
+
+ <para>
+ <literal>where</literal>åå¥å
è®¸ä½ å°è¿åçå®ä¾å表çèå´ç¼©å°.
+ å¦æ没ææå®å«åï¼ä½ å¯ä»¥ä½¿ç¨å±æ§åæ¥ç´æ¥å¼ç¨å±æ§:
+ </para>
+
+ <programlisting><![CDATA[from Cat where name='Fritz']]></programlisting>
+
+ <para>
+ å¦æææ´¾äºå«åï¼éè¦ä½¿ç¨å®æ´çå±æ§å:
+ </para>
+
+ <programlisting><![CDATA[from Cat as cat where cat.name='Fritz']]></programlisting>
+
+ <para>
+ è¿åå为ï¼å±æ§nameçäºï¼'Fritz'ç<literal>Cat</literal>ç±»çå®ä¾ã
+ </para>
+
+ <programlisting><![CDATA[select foo
+from Foo foo, Bar bar
+where foo.startDate = bar.date]]></programlisting>
+
+ <para>
+ å°è¿åææ满足ä¸é¢æ¡ä»¶ç<literal>Foo</literal>ç±»çå®ä¾ï¼
+ åå¨å¦ä¸ç<literal>bar</literal>çä¸ä¸ªå®ä¾ï¼å
¶<literal>date</literal>å±æ§çäº
+ <literal>Foo</literal>ç<literal>startDate</literal>å±æ§ã
+ å¤åè·¯å¾è¡¨è¾¾å¼ä½¿å¾<literal>where</literal>åå¥é常ç强大ï¼èèå¦ä¸æ
åµï¼
+ </para>
+
+ <programlisting><![CDATA[from Cat cat where cat.mate.name is not null]]></programlisting>
+
+ <para>
+ 该æ¥è¯¢å°è¢«ç¿»è¯æ为ä¸ä¸ªå«æ表è¿æ¥ï¼å
è¿æ¥ï¼çSQLæ¥è¯¢ãå¦æä½ æç®ååè¿æ ·çæ¥è¯¢è¯å¥
+ </para>
+
+ <programlisting><![CDATA[from Foo foo
+where foo.bar.baz.customer.address.city is not null]]></programlisting>
+
+ <para>
+ å¨SQLä¸ï¼ä½ 为达æ¤ç®çå°éè¦è¿è¡ä¸ä¸ªå表è¿æ¥çæ¥è¯¢ã
+ </para>
+
+ <para>
+ <literal>=</literal>è¿ç®ç¬¦ä¸ä»
å¯ä»¥è¢«ç¨æ¥æ¯è¾å±æ§çå¼ï¼ä¹å¯ä»¥ç¨æ¥æ¯è¾å®ä¾ï¼
+ </para>
+
+ <programlisting><![CDATA[from Cat cat, Cat rival where cat.mate = rival.mate]]></programlisting>
+
+ <programlisting><![CDATA[select cat, mate
+from Cat cat, Cat mate
+where cat.mate = mate]]></programlisting>
+
+ <para>
+ ç¹æ®å±æ§ï¼å°åï¼<literal>id</literal>å¯ä»¥ç¨æ¥è¡¨ç¤ºä¸ä¸ªå¯¹è±¡çå¯ä¸çæ è¯ç¬¦ãï¼ä½ ä¹å¯ä»¥ä½¿ç¨è¯¥å¯¹è±¡çå±æ§åãï¼
+ </para>
+
+ <programlisting><![CDATA[from Cat as cat where cat.id = 123
+
+from Cat as cat where cat.mate.id = 69]]></programlisting>
+
+ <para>
+ 第äºä¸ªæ¥è¯¢æ¯ææçãæ¤æ¶ä¸éè¦è¿è¡è¡¨è¿æ¥ï¼
+ </para>
+
+ <para>
+ åæ ·ä¹å¯ä»¥ä½¿ç¨å¤åæ è¯ç¬¦ãæ¯å¦<literal>Person</literal>ç±»æä¸ä¸ªå¤åæ è¯ç¬¦ï¼å®ç±<literal>country</literal>å±æ§
+ ä¸<literal>medicareNumber</literal>å±æ§ç»æã
+ </para>
+
+ <programlisting><![CDATA[from bank.Person person
+where person.id.country = 'AU'
+ and person.id.medicareNumber = 123456]]></programlisting>
+
+ <programlisting><![CDATA[from bank.Account account
+where account.owner.id.country = 'AU'
+ and account.owner.id.medicareNumber = 123456]]></programlisting>
+
+ <para>
+ 第äºä¸ªæ¥è¯¢ä¹ä¸éè¦è¿è¡è¡¨è¿æ¥ã
+ </para>
+
+ <para>
+ åæ ·çï¼ç¹æ®å±æ§<literal>class</literal>å¨è¿è¡å¤ææä¹
åçæ
åµä¸è¢«ç¨æ¥ååä¸ä¸ªå®ä¾çé´å«å¼ï¼discriminator valueï¼ã
+ ä¸ä¸ªåµå
¥å°whereåå¥ä¸çJavaç±»çååå°è¢«è½¬æ¢ä¸ºè¯¥ç±»çé´å«å¼ã
+ </para>
+
+ <programlisting><![CDATA[from Cat cat where cat.class = DomesticCat]]></programlisting>
+
+ <para>
+ ä½ ä¹å¯ä»¥å£°æä¸ä¸ªå±æ§çç±»åæ¯ç»ä»¶æè
å¤åç¨æ·ç±»åï¼ä»¥åç±ç»ä»¶ææçç»ä»¶ççï¼ãæ°¸è¿ä¸è¦å°è¯ä½¿ç¨ä»¥ç»ä»¶ç±»åæ¥ç»å°¾çè·¯å¾è¡¨è¾¾å¼ï¼path-expressionï¼
+ ï¼ä¸æ¤ç¸åï¼ä½ åºå½ä½¿ç¨ç»ä»¶çä¸ä¸ªå±æ§æ¥ç»å°¾ï¼ã
+ 举ä¾æ¥è¯´ï¼å¦æ<literal>store.owner</literal>å«æä¸ä¸ªå
å«äºç»ä»¶çå®ä½<literal>address</literal>
+ </para>
+
+ <programlisting><![CDATA[store.owner.address.city // æ£ç¡®
+store.owner.address // é误!]]></programlisting>
+
+ <para>
+ ä¸ä¸ªâä»»æâç±»åæ两个ç¹æ®çå±æ§<literal>id</literal>å<literal>class</literal>,
+ æ¥å
许æ们æç
§ä¸é¢çæ¹å¼è¡¨è¾¾ä¸ä¸ªè¿æ¥ï¼<literal>AuditLog.item</literal>
+ æ¯ä¸ä¸ªå±æ§ï¼è¯¥å±æ§è¢«æ å°ä¸º<literal><any></literal>ï¼ã
+ </para>
+
+ <programlisting><![CDATA[from AuditLog log, Payment payment
+where log.item.class = 'Payment' and log.item.id = payment.id]]></programlisting>
+
+ <para>
+ 注æï¼å¨ä¸é¢çæ¥è¯¢ä¸å¥ä¸ï¼<literal>log.item.class</literal> å <literal>payment.class</literal>
+ å°æ¶åå°å®å
¨ä¸åçæ°æ®åºä¸çåã
+ </para>
+
+ </sect1>
+
+ <sect1 id="queryhql-expressions">
+ <title>表达å¼</title>
+
+ <para>
+ å¨<literal>where</literal>åå¥ä¸å
许使ç¨ç表达å¼å
æ¬
+ 大å¤æ°ä½ å¯ä»¥å¨SQL使ç¨ç表达å¼ç§ç±»:
+ </para>
+
+ <itemizedlist spacing="compact">
+ <listitem>
+ <para>
+ æ°å¦è¿ç®ç¬¦<literal>+, -, *, /</literal>
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ äºè¿å¶æ¯è¾è¿ç®ç¬¦<literal>=, >=, <=, <>, !=, like</literal>
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ é»è¾è¿ç®ç¬¦<literal>and, or, not</literal>
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ <literal>in</literal>,
+ <literal>not in</literal>,
+ <literal>between</literal>,
+ <literal>is null</literal>,
+ <literal>is not null</literal>,
+ <literal>is empty</literal>,
+ <literal>is not empty</literal>,
+ <literal>member of</literal> and
+ <literal>not member of</literal>
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ "ç®åç" case, <literal>case ... when ... then ... else ... end</literal>,å
+ "æç´¢" case, <literal>case when ... then ... else ... end</literal>
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ å符串è¿æ¥ç¬¦<literal>...||...</literal> or <literal>concat(...,...)</literal>
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ <literal>current_date()</literal>, <literal>current_time()</literal>,
+ <literal>current_timestamp()</literal>
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ <literal>second(...)</literal>, <literal>minute(...)</literal>,
+ <literal>hour(...)</literal>, <literal>day(...)</literal>,
+ <literal>month(...)</literal>, <literal>year(...)</literal>,
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ EJB-QL 3.0å®ä¹çä»»ä½å½æ°ææä½ï¼<literal>substring(), trim(),
+ lower(), upper(), length(), locate(), abs(), sqrt(), bit_length()ï¼ mod()</literal>
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ <literal>coalesce()</literal> å <literal>nullif()</literal>
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ <literal>str()</literal> ææ°åæè
æ¶é´å¼è½¬æ¢ä¸ºå¯è¯»çå符串
+ </para>
+ </listitem>
+
+ <listitem>
+ <para>
+ <literal>cast(... as ...)</literal>, å
¶ç¬¬äºä¸ªåæ°æ¯æHibernateç±»åçååï¼ä»¥å<literal>extract(... from ...)</literal>ï¼åªè¦ANSI
+ <literal>cast()</literal> å <literal>extract()</literal> 被åºå±æ°æ®åºæ¯æ
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ HQL <literal>index()</literal> å½æ°ï¼ä½ç¨äºjoinçæåºéåçå«åã
+
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ HQLå½æ°ï¼æéåä½ä¸ºåæ°:<literal>size(), minelement(), maxelement(), minindex(), maxindex()</literal>,è¿æç¹å«ç<literal>elements()</literal> å<literal>indices</literal>å½æ°ï¼å¯ä»¥ä¸æ°éè¯å 以éå®ï¼<literal>some, all, exists, any, in</literal>ã
+
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ ä»»ä½æ°æ®åºæ¯æçSQLæ éå½æ°ï¼æ¯å¦<literal>sign()</literal>,
+ <literal>trunc()</literal>, <literal>rtrim()</literal>, <literal>sin()</literal>
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ JDBCé£æ ¼çåæ°ä¼ å
¥ <literal>?</literal>
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ å½ååæ°<literal>:name</literal>, <literal>:start_date</literal>, <literal>:x1</literal>
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ SQL ç´æ¥å¸¸é <literal>'foo'</literal>, <literal>69</literal>, <literal>6.66E+2</literal>, <literal>'1970-01-01 10:00:01.0'</literal>
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ Java <literal>public static final</literal> ç±»åç常é <literal>eg.Color.TABBY</literal>
+ </para>
+ </listitem>
+ </itemizedlist>
+
+ <para>
+ å
³é®å<literal>in</literal>ä¸<literal>between</literal>å¯æå¦ä¸æ¹æ³ä½¿ç¨:
+ </para>
+
+ <programlisting><![CDATA[from DomesticCat cat where cat.name between 'A' and 'B']]></programlisting>
+
+ <programlisting><![CDATA[from DomesticCat cat where cat.name in ( 'Foo', 'Bar', 'Baz' )]]></programlisting>
+
+ <para>
+ èä¸å¦å®çæ ¼å¼ä¹å¯ä»¥å¦ä¸ä¹¦åï¼
+ </para>
+
+ <programlisting><![CDATA[from DomesticCat cat where cat.name not between 'A' and 'B']]></programlisting>
+
+ <programlisting><![CDATA[from DomesticCat cat where cat.name not in ( 'Foo', 'Bar', 'Baz' )]]></programlisting>
+
+ <para>
+ åæ ·, åå¥<literal>is null</literal>ä¸<literal>is not null</literal>å¯ä»¥è¢«ç¨æ¥æµè¯ç©ºå¼(null).
+ </para>
+
+ <para>
+ å¨Hibernateé
ç½®æ件ä¸å£°æHQLâæ¥è¯¢æ¿ä»£ï¼query substitutionsï¼âä¹åï¼
+ å¸å°è¡¨è¾¾å¼ï¼Booleansï¼å¯ä»¥å¨å
¶ä»è¡¨è¾¾å¼ä¸è½»æ¾ç使ç¨:
+ </para>
+
+ <programlisting><![CDATA[<property name="hibernate.query.substitutions">true 1, false 0</property>]]></programlisting>
+
+ <para>
+ ç³»ç»å°è¯¥HQL转æ¢ä¸ºSQLè¯å¥æ¶ï¼è¯¥è®¾ç½®è¡¨æå°ç¨å符 <literal>1</literal> å
+<literal>0</literal> æ¥
+ å代å
³é®å<literal>true</literal> å <literal>false</literal>:
+
+ </para>
+
+ <programlisting><![CDATA[from Cat cat where cat.alive = true]]></programlisting>
+
+ <para>
+ ä½ å¯ä»¥ç¨ç¹æ®å±æ§<literal>size</literal>, ææ¯ç¹æ®å½æ°<literal>size()</literal>æµè¯ä¸ä¸ªéåç大å°ã
+ </para>
+
+ <programlisting><![CDATA[from Cat cat where cat.kittens.size > 0]]></programlisting>
+
+ <programlisting><![CDATA[from Cat cat where size(cat.kittens) > 0]]></programlisting>
+
+ <para>
+ 对äºç´¢å¼äºï¼æåºï¼çéåï¼ä½ å¯ä»¥ä½¿ç¨<literal>minindex</literal> ä¸ <literal>maxindex</literal>å½æ°æ¥å¼ç¨å°æå°ä¸æ大çç´¢å¼åºæ°ã
+ åçï¼ä½ å¯ä»¥ä½¿ç¨<literal>minelement</literal> ä¸ <literal>maxelement</literal>å½æ°æ¥
+å¼ç¨å°ä¸ä¸ªåºæ¬æ°æ®ç±»åçéåä¸æå°ä¸æ大çå
ç´ ã
+
+ </para>
+
+ <programlisting><![CDATA[from Calendar cal where maxelement(cal.holidays) > current_date]]></programlisting>
+
+ <programlisting><![CDATA[from Order order where maxindex(order.items) > 100]]></programlisting>
+
+ <programlisting><![CDATA[from Order order where minelement(order.items) > 10000]]></programlisting>
+
+ <para>
+å¨ä¼ éä¸ä¸ªéåçç´¢å¼éæè
æ¯å
ç´ é(<literal>elements</literal>ä¸<literal>indices</literal> å½æ°)
+ æè
ä¼ éä¸ä¸ªåæ¥è¯¢çç»æçæ¶åï¼å¯ä»¥ä½¿ç¨SQLå½æ°<literal>any, some, all, exists, in</literal>
+
+ </para>
+
+ <programlisting><![CDATA[select mother from Cat as mother, Cat as kit
+where kit in elements(foo.kittens)]]></programlisting>
+
+ <programlisting><![CDATA[select p from NameList list, Person p
+where p.name = some elements(list.names)]]></programlisting>
+
+ <programlisting><![CDATA[from Cat cat where exists elements(cat.kittens)]]></programlisting>
+
+ <programlisting><![CDATA[from Player p where 3 > all elements(p.scores)]]></programlisting>
+
+ <programlisting><![CDATA[from Show show where 'fizard' in indices(show.acts)]]></programlisting>
+
+ <para>
+ 注æï¼å¨Hibernate3ç§ï¼è¿äºç»æåé- <literal>size</literal>, <literal>elements</literal>,
+ <literal>indices</literal>, <literal>minindex</literal>, <literal>maxindex</literal>,
+ <literal>minelement</literal>, <literal>maxelement</literal> - åªè½å¨whereåå¥ä¸ä½¿ç¨ã
+ </para>
+
+ <para>
+ ä¸ä¸ªè¢«ç´¢å¼è¿çï¼æåºçï¼éåçå
ç´ (arrays, lists, maps)å¯ä»¥å¨å
¶ä»ç´¢å¼ä¸è¢«å¼ç¨ï¼åªè½å¨whereåå¥ä¸ï¼ï¼
+ </para>
+
+ <programlisting><![CDATA[from Order order where order.items[0].id = 1234]]></programlisting>
+
+ <programlisting><![CDATA[select person from Person person, Calendar calendar
+where calendar.holidays['national day'] = person.birthDay
+ and person.nationality.calendar = calendar]]></programlisting>
+
+ <programlisting><![CDATA[select item from Item item, Order order
+where order.items[ order.deliveredItemIndices[0] ] = item and order.id = 11]]></programlisting>
+
+ <programlisting><![CDATA[select item from Item item, Order order
+where order.items[ maxindex(order.items) ] = item and order.id = 11]]></programlisting>
+
+ <para>
+ å¨<literal>[]</literal>ä¸ç表达å¼çè³å¯ä»¥æ¯ä¸ä¸ªç®æ°è¡¨è¾¾å¼ã
+ </para>
+
+ <programlisting><![CDATA[select item from Item item, Order order
+where order.items[ size(order.items) - 1 ] = item]]></programlisting>
+
+ <para>
+ 对äºä¸ä¸ªä¸å¯¹å¤çå
³èï¼one-to-many associationï¼ææ¯å¼çéåä¸çå
ç´ ï¼
+ HQLä¹æä¾å
建ç<literal>index()</literal>å½æ°ï¼
+ </para>
+
+ <programlisting><![CDATA[select item, index(item) from Order order
+ join order.items item
+where index(item) < 5]]></programlisting>
+
+ <para>
+ å¦æåºå±æ°æ®åºæ¯ææ éçSQLå½æ°ï¼å®ä»¬ä¹å¯ä»¥è¢«ä½¿ç¨
+ </para>
+
+ <programlisting><![CDATA[from DomesticCat cat where upper(cat.name) like 'FRI%']]></programlisting>
+
+ <para>
+ å¦æä½ è¿ä¸è½å¯¹ææçè¿äºæ·±ä¿¡ä¸çï¼æ³æ³ä¸é¢çæ¥è¯¢ãå¦æ使ç¨SQLï¼è¯å¥é¿åº¦ä¼å¢é¿å¤å°ï¼å¯è¯»æ§ä¼ä¸éå¤å°ï¼
+ </para>
+
+ <programlisting><![CDATA[select cust
+from Product prod,
+ Store store
+ inner join store.customers cust
+where prod.name = 'widget'
+ and store.location.name in ( 'Melbourne', 'Sydney' )
+ and prod = all elements(cust.currentOrder.lineItems)]]></programlisting>
+
+ <para>
+ <emphasis>æ示:</emphasis> ä¼åå¦ä¸çè¯å¥
+ </para>
+
+ <programlisting><![CDATA[SELECT cust.name, cust.address, cust.phone, cust.id, cust.current_order
+FROM customers cust,
+ stores store,
+ locations loc,
+ store_customers sc,
+ product prod
+WHERE prod.name = 'widget'
+ AND store.loc_id = loc.id
+ AND loc.name IN ( 'Melbourne', 'Sydney' )
+ AND sc.store_id = store.id
+ AND sc.cust_id = cust.id
+ AND prod.id = ALL(
+ SELECT item.prod_id
+ FROM line_items item, orders o
+ WHERE item.order_id = o.id
+ AND cust.current_order = o.id
+ )]]></programlisting>
+
+ </sect1>
+
+ <sect1 id="queryhql-ordering">
+ <title>order byåå¥</title>
+
+ <para>
+ æ¥è¯¢è¿åçå表(list)å¯ä»¥æç
§ä¸ä¸ªè¿åçç±»æç»ä»¶ï¼components)ä¸çä»»ä½å±æ§ï¼propertyï¼è¿è¡æåºï¼
+ </para>
+
+ <programlisting><![CDATA[from DomesticCat cat
+order by cat.name asc, cat.weight desc, cat.birthdate]]></programlisting>
+
+ <para>
+ å¯éç<literal>asc</literal>æ<literal>desc</literal>å
³é®åææäºæç
§ååºæéåºè¿è¡æåº.
+ </para>
+ </sect1>
+
+ <sect1 id="queryhql-grouping" revision="1">
+ <title>group byåå¥</title>
+
+ <para>
+ ä¸ä¸ªè¿åèéå¼(aggregate values)çæ¥è¯¢å¯ä»¥æç
§ä¸ä¸ªè¿åçç±»æç»ä»¶ï¼components)ä¸çä»»ä½å±æ§ï¼propertyï¼è¿è¡åç»ï¼
+ </para>
+
+ <programlisting><![CDATA[select cat.color, sum(cat.weight), count(cat)
+from Cat cat
+group by cat.color]]></programlisting>
+
+ <programlisting><![CDATA[select foo.id, avg(name), max(name)
+from Foo foo join foo.names name
+group by foo.id]]></programlisting>
+
+ <para>
+ <literal>having</literal>åå¥å¨è¿éä¹å
许使ç¨.
+ </para>
+
+ <programlisting><![CDATA[select cat.color, sum(cat.weight), count(cat)
+from Cat cat
+group by cat.color
+having cat.color in (eg.Color.TABBY, eg.Color.BLACK)]]></programlisting>
+
+ <para>
+ å¦æåºå±çæ°æ®åºæ¯æçè¯(ä¾å¦ä¸è½å¨MySQLä¸ä½¿ç¨)ï¼SQLçä¸è¬å½æ°ä¸èéå½æ°ä¹å¯ä»¥åºç°
+ å¨<literal>having</literal>ä¸<literal>order by</literal> åå¥ä¸ã
+ </para>
+
+ <programlisting><![CDATA[select cat
+from Cat cat
+ join cat.kittens kitten
+group by cat.id, cat.name, cat.other, cat.properties
+having avg(kitten.weight) > 100
+order by count(kitten) asc, sum(kitten.weight) desc]]></programlisting>
+
+ <para>
+ 注æ<literal>group by</literal>åå¥ä¸
+ <literal>order by</literal>åå¥ä¸é½ä¸è½å
å«ç®æ¯è¡¨è¾¾å¼ï¼arithmetic expressionsï¼.
+
+ ä¹è¦æ³¨æHibernateç®åä¸ä¼æ©å±groupçå®ä½,å æ¤ä½ ä¸è½å<literal>group by cat</literal>,é¤é<literal>cat</literal>çææå±æ§é½ä¸æ¯èéç(non-aggregated)ãä½ å¿
é¡»æç¡®çååºææçéèéå±æ§ã
+ </para>
+
+ </sect1>
+
+
+ <sect1 id="queryhql-subqueries" revision="2">
+ <title>åæ¥è¯¢</title>
+
+ <para>
+ 对äºæ¯æåæ¥è¯¢çæ°æ®åºï¼Hibernateæ¯æå¨æ¥è¯¢ä¸ä½¿ç¨åæ¥è¯¢ãä¸ä¸ªåæ¥è¯¢å¿
须被åæ¬å·å
å´èµ·æ¥ï¼ç»å¸¸æ¯SQLèéå½æ°çåæ¬å·ï¼ã
+ çè³ç¸äºå
³èçåæ¥è¯¢ï¼å¼ç¨å°å¤é¨æ¥è¯¢ä¸çå«åçåæ¥è¯¢ï¼ä¹æ¯å
许çã
+ </para>
+
+ <programlisting><![CDATA[from Cat as fatcat
+where fatcat.weight > (
+ select avg(cat.weight) from DomesticCat cat
+)]]></programlisting>
+
+ <programlisting><![CDATA[from DomesticCat as cat
+where cat.name = some (
+ select name.nickName from Name as name
+)]]></programlisting>
+
+ <programlisting><![CDATA[from Cat as cat
+where not exists (
+ from Cat as mate where mate.mate = cat
+)]]></programlisting>
+
+ <programlisting><![CDATA[from DomesticCat as cat
+where cat.name not in (
+ select name.nickName from Name as name
+)]]></programlisting>
+
+ <programlisting><![CDATA[select cat.id, (select max(kit.weight) from cat.kitten kit)
+from Cat as cat]]></programlisting>
+
+ <para>
+ 注æï¼HQLèªæ¥è¯¢åªå¯ä»¥å¨selectæè
whereåå¥ä¸åºç°ã
+ </para>
+
+ <para>
+ å¨selectå表ä¸å
å«ä¸ä¸ªè¡¨è¾¾å¼ä»¥ä¸çåæ¥è¯¢ï¼ä½ å¯ä»¥ä½¿ç¨ä¸ä¸ªå
ç»æé 符ï¼tuple constructorsï¼ï¼
+ </para>
+
+ <programlisting><![CDATA[from Cat as cat
+where not ( cat.name, cat.color ) in (
+ select cat.name, cat.color from DomesticCat cat
+)]]></programlisting>
+
+ <para>
+ 注æå¨æäºæ°æ®åºä¸ï¼ä¸å
æ¬Oracleä¸HSQLï¼ï¼ä½ ä¹å¯ä»¥å¨å
¶ä»è¯å¢ä¸ä½¿ç¨å
ç»æé 符ï¼
+ æ¯å¦æ¥è¯¢ç¨æ·ç±»åçç»ä»¶ä¸ç»åï¼
+ </para>
+
+ <programlisting><![CDATA[from Person where name = ('Gavin', 'A', 'King')]]></programlisting>
+
+ <para>
+ 该æ¥è¯¢çä»·äºæ´å¤æçï¼
+ </para>
+
+ <programlisting><![CDATA[from Person where name.first = 'Gavin' and name.initial = 'A' and name.last = 'King')]]></programlisting>
+
+ <para>
+ æ两个å¾å¥½ççç±ä½¿ä½ ä¸åºå½ä½è¿æ ·çäºæ
ï¼é¦å
ï¼å®ä¸å®å
¨éç¨äºå个æ°æ®åºå¹³å°ï¼å
¶æ¬¡ï¼æ¥è¯¢ç°å¨ä¾èµäºæ å°æ件ä¸å±æ§ç顺åºã
+ </para>
+
+ </sect1>
+
+ <sect1 id="queryhql-examples">
+ <title>HQL示ä¾</title>
+
+ <para>
+ Hibernateæ¥è¯¢å¯ä»¥é常ç强大ä¸å¤æãå®é
ä¸ï¼Hibernateçä¸ä¸ªä¸»è¦åç¹å°±æ¯æ¥è¯¢è¯å¥çå¨åãè¿éæä¸äºä¾åï¼å®ä»¬ä¸æå¨æè¿ç
+ ä¸ä¸ªé¡¹ç®ä¸ä½¿ç¨çæ¥è¯¢é常ç¸ä¼¼ã注æä½ è½ç¨å°ç大å¤æ°æ¥è¯¢æ¯è¿äºè¦ç®åçå¤ï¼
+ </para>
+
+ <para>
+ ä¸é¢çæ¥è¯¢å¯¹äºæ个ç¹å®ç客æ·çæææªæ¯ä»çè´¦åï¼å¨ç»å®ç»æå°æ»ä»·å¼çæ
åµä¸ï¼è¿å订åçidï¼æ¡ç®çæ°éåæ»ä»·å¼ï¼
+ è¿åå¼æç
§æ»ä»·å¼çç»æè¿è¡æåºã为äºå³å®ä»·æ ¼ï¼æ¥è¯¢ä½¿ç¨äºå½åç®å½ãä½ä¸ºè½¬æ¢ç»æçSQLæ¥è¯¢ï¼ä½¿ç¨äº<literal>ORDER</literal>,
+ <literal>ORDER_LINE</literal>, <literal>PRODUCT</literal>, <literal>CATALOG</literal> å<literal>PRICE</literal>
+ åºè¡¨ã
+ </para>
+
+ <programlisting><![CDATA[select order.id, sum(price.amount), count(item)
+from Order as order
+ join order.lineItems as item
+ join item.product as product,
+ Catalog as catalog
+ join catalog.prices as price
+where order.paid = false
+ and order.customer = :customer
+ and price.product = product
+ and catalog.effectiveDate < sysdate
+ and catalog.effectiveDate >= all (
+ select cat.effectiveDate
+ from Catalog as cat
+ where cat.effectiveDate < sysdate
+ )
+group by order
+having sum(price.amount) > :minAmount
+order by sum(price.amount) desc]]></programlisting>
+
+ <para>
+ è¿ç®ç´æ¯ä¸ä¸ªæªç©ï¼å®é
ä¸ï¼å¨ç°å®çæ´»ä¸ï¼æ并ä¸çè¡·äºåæ¥è¯¢ï¼æ以æçæ¥è¯¢è¯å¥çèµ·æ¥æ´åè¿ä¸ªï¼
+ </para>
+
+ <programlisting><![CDATA[select order.id, sum(price.amount), count(item)
+from Order as order
+ join order.lineItems as item
+ join item.product as product,
+ Catalog as catalog
+ join catalog.prices as price
+where order.paid = false
+ and order.customer = :customer
+ and price.product = product
+ and catalog = :currentCatalog
+group by order
+having sum(price.amount) > :minAmount
+order by sum(price.amount) desc]]></programlisting>
+
+ <para>
+ ä¸é¢ä¸ä¸ªæ¥è¯¢è®¡ç®æ¯ä¸ç§ç¶æä¸çæ¯ä»çæ°ç®ï¼é¤å»ææå¤äº<literal>AWAITING_APPROVAL</literal>ç¶æçæ¯ä»ï¼å 为å¨è¯¥ç¶æä¸
+ å½åçç¨æ·ä½åºäºç¶æçææ°æ¹åã该æ¥è¯¢è¢«è½¬æ¢æå«æ两个å
è¿æ¥ä»¥åä¸ä¸ªç¸å
³èçåéæ©çSQLæ¥è¯¢ï¼è¯¥æ¥è¯¢ä½¿ç¨äºè¡¨
+ <literal>PAYMENT</literal>, <literal>PAYMENT_STATUS</literal> 以å
+ <literal>PAYMENT_STATUS_CHANGE</literal>ã
+ </para>
+
+ <programlisting><![CDATA[select count(payment), status.name
+from Payment as payment
+ join payment.currentStatus as status
+ join payment.statusChanges as statusChange
+where payment.status.name <> PaymentStatus.AWAITING_APPROVAL
+ or (
+ statusChange.timeStamp = (
+ select max(change.timeStamp)
+ from PaymentStatusChange change
+ where change.payment = payment
+ )
+ and statusChange.user <> :currentUser
+ )
+group by status.name, status.sortOrder
+order by status.sortOrder]]></programlisting>
+
+ <para>
+ å¦æææ<literal>statusChanges</literal>å®ä¾éæ å°ä¸ºä¸ä¸ªå表ï¼listï¼èä¸æ¯ä¸ä¸ªéåï¼setï¼,
+ 书åæ¥è¯¢è¯å¥å°æ´å ç®å.
+ </para>
+
+ <programlisting><![CDATA[select count(payment), status.name
+from Payment as payment
+ join payment.currentStatus as status
+where payment.status.name <> PaymentStatus.AWAITING_APPROVAL
+ or payment.statusChanges[ maxIndex(payment.statusChanges) ].user <> :currentUser
+group by status.name, status.sortOrder
+order by status.sortOrder]]></programlisting>
+
+ <para>
+ ä¸é¢ä¸ä¸ªæ¥è¯¢ä½¿ç¨äºMS SQL Serverç <literal>isNull()</literal>å½æ°ç¨ä»¥è¿åå½åç¨æ·æå±ç»ç»çç»ç»å¸å·åç»ç»æªæ¯ä»çè´¦ã
+ å®è¢«è½¬æ¢æä¸ä¸ªå¯¹è¡¨<literal>ACCOUNT</literal>, <literal>PAYMENT</literal>, <literal>PAYMENT_STATUS</literal>,
+ <literal>ACCOUNT_TYPE</literal>, <literal>ORGANIZATION</literal> 以å <literal>ORG_USER</literal>è¿è¡çä¸ä¸ªå
è¿æ¥ï¼
+ ä¸ä¸ªå¤è¿æ¥åä¸ä¸ªåéæ©çSQLæ¥è¯¢ã
+ </para>
+
+ <programlisting><![CDATA[select account, payment
+from Account as account
+ left outer join account.payments as payment
+where :currentUser in elements(account.holder.users)
+ and PaymentStatus.UNPAID = isNull(payment.currentStatus.name, PaymentStatus.UNPAID)
+order by account.type.sortOrder, account.accountNumber, payment.dueDate]]></programlisting>
+
+ <para>
+ 对äºä¸äºæ°æ®åºï¼æ们éè¦å¼ç¨ï¼ç¸å
³çï¼åéæ©ã
+ </para>
+
+ <programlisting><![CDATA[select account, payment
+from Account as account
+ join account.holder.users as user
+ left outer join account.payments as payment
+where :currentUser = user
+ and PaymentStatus.UNPAID = isNull(payment.currentStatus.name, PaymentStatus.UNPAID)
+order by account.type.sortOrder, account.accountNumber, payment.dueDate]]></programlisting>
+
+ </sect1>
+
+ <sect1 id="queryhql-bulk" revision="2">
+ <title>æ¹éçUPDATEåDELETE</title>
+
+ <para>
+ HQLç°å¨æ¯æ <literal>update</literal>, <literal>delete</literal> å
+ <literal>insert ... select ...</literal>è¯å¥. æ¥é
+ <xref linkend="batch-direct"/> 以è·å¾æ´å¤ä¿¡æ¯ã
+ </para>
+ </sect1>
+
+ <sect1 id="queryhql-tipstricks">
+ <title>å°æå·§ & å°çªé¨</title>
+
+ <para>
+ ä½ å¯ä»¥ç»è®¡æ¥è¯¢ç»æçæ°ç®èä¸å¿
å®é
çè¿åä»ä»¬ï¼
+ </para>
+
+ <programlisting><![CDATA[( (Integer) session.createQuery("select count(*) from ....").iterate().next() ).intValue()]]></programlisting>
+
+ <para>
+ è¥æ³æ ¹æ®ä¸ä¸ªéåç大å°æ¥è¿è¡æåºï¼å¯ä»¥ä½¿ç¨å¦ä¸çè¯å¥ï¼
+ </para>
+
+ <programlisting><![CDATA[select usr.id, usr.name
+from User as usr
+ left join usr.messages as msg
+group by usr.id, usr.name
+order by count(msg)]]></programlisting>
+
+ <para>
+ å¦æä½ çæ°æ®åºæ¯æåéæ©ï¼ä½ å¯ä»¥å¨ä½ çæ¥è¯¢çwhereåå¥ä¸ä¸ºéæ©ç大å°ï¼selection sizeï¼æå®ä¸ä¸ªæ¡ä»¶:
+ </para>
+
+ <programlisting><![CDATA[from User usr where size(usr.messages) >= 1]]></programlisting>
+
+ <para>
+ å¦æä½ çæ°æ®åºä¸æ¯æåéæ©è¯å¥ï¼ä½¿ç¨ä¸é¢çæ¥è¯¢ï¼
+ </para>
+
+ <programlisting><![CDATA[select usr.id, usr.name
+from User usr.name
+ join usr.messages msg
+group by usr.id, usr.name
+having count(msg) >= 1]]></programlisting>
+
+ <para>
+ å 为å
è¿æ¥ï¼inner joinï¼çåå ï¼è¿ä¸ªè§£å³æ¹æ¡ä¸è½è¿åå«æé¶ä¸ªä¿¡æ¯ç<literal>User</literal>
+ ç±»çå®ä¾, æ以è¿ç§æ
åµä¸ä½¿ç¨ä¸é¢çæ ¼å¼å°æ¯æ帮å©ç:
+ </para>
+
+ <programlisting><![CDATA[select usr.id, usr.name
+from User as usr
+ left join usr.messages as msg
+group by usr.id, usr.name
+having count(msg) = 0]]></programlisting>
+
+ <para>
+ JavaBeançå±æ§å¯ä»¥è¢«ç»å®å°ä¸ä¸ªå½åæ¥è¯¢ï¼named queryï¼çåæ°ä¸ï¼
+ </para>
+
+ <programlisting><![CDATA[Query q = s.createQuery("from foo Foo as foo where foo.name=:name and foo.size=:size");
+q.setProperties(fooBean); // fooBeanå
å«æ¹æ³getName()ä¸getSize()
+List foos = q.list();]]></programlisting>
+
+ <para>
+ éè¿å°æ¥å£<literal>Query</literal>ä¸ä¸ä¸ªè¿æ»¤å¨ï¼filterï¼ä¸èµ·ä½¿ç¨ï¼éåï¼Collectionsï¼æ¯å¯ä»¥å页çï¼
+ </para>
+
+ <programlisting><![CDATA[Query q = s.createFilter( collection, "" ); // ä¸ä¸ªç®åçè¿æ»¤å¨
+q.setMaxResults(PAGE_SIZE);
+q.setFirstResult(PAGE_SIZE * pageNumber);
+List page = q.list();]]></programlisting>
+
+ <para>
+ éè¿ä½¿ç¨æ¥è¯¢è¿æ»¤å¨ï¼query filterï¼å¯ä»¥å°éåï¼Collectionï¼çåç´ åç»ææåº:
+ </para>
+
+ <programlisting><![CDATA[Collection orderedCollection = s.filter( collection, "order by this.amount" );
+Collection counts = s.filter( collection, "select this.type, count(this) group by this.type" );]]></programlisting>
+
+ <para>
+ ä¸ç¨éè¿åå§åï¼ä½ å°±å¯ä»¥ç¥éä¸ä¸ªéåï¼Collectionï¼ç大å°ï¼
+ </para>
+
+ <programlisting><![CDATA[( (Integer) session.createQuery("select count(*) from ....").iterate().next() ).intValue();]]></programlisting>
+
+ </sect1>
+
+</chapter>
\ No newline at end of file
Copied: core/trunk/documentation/manual/zh-CN/src/main/docbook/content/query_sql.xml (from rev 14080, core/trunk/documentation/manual/zh-CN/src/main/docbook/modules/query_sql.xml)
===================================================================
--- core/trunk/documentation/manual/zh-CN/src/main/docbook/content/query_sql.xml (rev 0)
+++ core/trunk/documentation/manual/zh-CN/src/main/docbook/content/query_sql.xml 2007-10-09 20:10:34 UTC (rev 14081)
@@ -0,0 +1,715 @@
+<chapter id="querysql" revision="2">
+ <title>Native SQLæ¥è¯¢</title>
+ <para>
+ ä½ ä¹å¯ä»¥ä½¿ç¨ä½ çæ°æ®åºçNative SQLè¯è¨æ¥æ¥è¯¢æ°æ®ãè¿å¯¹ä½ å¨è¦ä½¿ç¨æ°æ®åºçæäºç¹æ§çæ¶å(æ¯å¦è¯´å¨æ¥è¯¢æ示æè
Oracleä¸ç
+ <literal>CONNECT</literal>å
³é®å)ï¼è¿æ¯é常æç¨çãè¿å°±è½å¤æ«æ¸
ä½ æåæ¥ç´æ¥ä½¿ç¨SQL/JDBC çç¨åºè¿ç§»å°åºäº
+ Hibernateåºç¨çéè·¯ä¸çéç¢ã
+ </para>
+
+ <para>
+ Hibernate3å
è®¸ä½ ä½¿ç¨æåçsqlæ¥å®æææçcreate,update,delete,åloadæä½ï¼å
æ¬åå¨è¿ç¨ï¼
+ </para>
+
+ <sect1 id="querysql-creating" revision="4">
+ <title>使ç¨<literal>SQLQuery</literal></title>
+
+ <para>对åçSQLæ¥è¯¢æ§è¡çæ§å¶æ¯éè¿<literal>SQLQuery</literal>æ¥å£è¿è¡çï¼éè¿æ§è¡<literal>Session.createSQLQuery()</literal>è·åè¿ä¸ªæ¥å£ãä¸é¢æ¥æè¿°å¦ä½ä½¿ç¨è¿ä¸ªAPIè¿è¡æ¥è¯¢ã</para>
+
+ <sect2>
+ <title>æ éæ¥è¯¢ï¼Scalar queriesï¼</title>
+
+ <para>
+ æåºæ¬çSQLæ¥è¯¢å°±æ¯è·å¾ä¸ä¸ªæ éï¼æ°å¼ï¼çå表ã </para>
+
+ <programlisting><![CDATA[sess.createSQLQuery("SELECT * FROM CATS").list();
+sess.createSQLQuery("SELECT ID, NAME, BIRTHDATE FROM CATS").list();
+]]></programlisting>
+
+ <para>
+ å®ä»¬é½å°è¿åä¸ä¸ªObjectæ°ç»(Object[])ç»æçListï¼æ°ç»æ¯ä¸ªå
ç´ é½æ¯CATS表çä¸ä¸ªå段å¼ãHibernateä¼ä½¿ç¨ResultSetMetadataæ¥å¤å®è¿åçæ éå¼çå®é
顺åºåç±»åã
+ </para>
+
+ <para>
+ å¦æè¦é¿å
è¿å¤ç使ç¨<literal>ResultSetMetadata</literal>,æè
åªæ¯ä¸ºäºæ´å æç¡®çæåè¿åå¼ï¼å¯ä»¥ä½¿ç¨<literal>addScalar()</literal>ã
+ </para>
+
+ <programlisting><![CDATA[sess.createSQLQuery("SELECT * FROM CATS")
+ .addScalar("ID", Hibernate.LONG)
+ .addScalar("NAME", Hibernate.STRING)
+ .addScalar("BIRTHDATE", Hibernate.DATE)
+]]></programlisting>
+
+
+ <para>è¿ä¸ªæ¥è¯¢æå®äº:</para>
+
+ <itemizedlist>
+ <listitem>
+ <para>SQLæ¥è¯¢å符串</para>
+ </listitem>
+
+ <listitem>
+ <para>è¦è¿åçå段åç±»å</para>
+ </listitem>
+ </itemizedlist>
+
+ <para>
+ å®ä»ç¶ä¼è¿åObjectæ°ç»,ä½æ¯æ¤æ¶ä¸å使ç¨<literal>ResultSetMetdata</literal>,èæ¯æç¡®çå°ID,NAMEåBIRTHDATEæç
§Long,StringåShortç±»åä»resultsetä¸ååºãåæ¶ï¼ä¹ææäºå°±ç®queryæ¯ä½¿ç¨<literal>*</literal>æ¥æ¥è¯¢çï¼å¯è½è·å¾è¶
è¿ååºçè¿ä¸ä¸ªå段ï¼ä¹ä»
ä»
ä¼è¿åè¿ä¸ä¸ªå段ã
+ </para>
+
+ <para>
+ 对å
¨é¨æè
é¨åçæ éå¼ä¸è®¾ç½®ç±»åä¿¡æ¯ä¹æ¯å¯ä»¥çã
+ </para>
+
+ <programlisting><![CDATA[sess.createSQLQuery("SELECT * FROM CATS")
+ .addScalar("ID", Hibernate.LONG)
+ .addScalar("NAME")
+ .addScalar("BIRTHDATE")
+]]></programlisting>
+
+ <para>
+ åºæ¬ä¸è¿ååé¢ä¸ä¸ªæ¥è¯¢ç¸å,åªæ¯æ¤æ¶ä½¿ç¨<literal>ResultSetMetaData</literal>æ¥å³å®NAMEåBIRTHDATEçç±»åï¼èIDçç±»åæ¯æç¡®æåºçã
+ </para>
+
+ <para>
+ å
³äºä»ResultSetMetaDataè¿åçjava.sql.Typesæ¯å¦ä½æ å°å°Hibernateç±»åï¼æ¯ç±æ¹è¨(Dialect)æ§å¶çãåè¥æ个æå®çç±»å没æ被æ å°ï¼æè
ä¸æ¯ä½ æé¢æçç±»åï¼ä½ å¯ä»¥éè¿Dialetç<literal>registerHibernateType</literal>è°ç¨èªè¡å®ä¹ã
+ </para>
+
+ </sect2>
+
+ <sect2>
+ <title>å®ä½æ¥è¯¢(Entity queries)</title>
+
+ <para>
+ ä¸é¢çæ¥è¯¢é½æ¯è¿åæ éå¼çï¼ä¹å°±æ¯ä»resultsetä¸è¿åçâ裸âæ°æ®ãä¸é¢å±ç¤ºå¦ä½éè¿<literal>addEntity()</literal>让åçæ¥è¯¢è¿åå®ä½å¯¹è±¡ã
+ </para>
+
+ <programlisting><![CDATA[sess.createSQLQuery("SELECT * FROM CATS").addEntity(Cat.class);
+sess.createSQLQuery("SELECT ID, NAME, BIRTHDATE FROM CATS").addEntity(Cat.class);
+]]></programlisting>
+
+ <para>è¿ä¸ªæ¥è¯¢æå®ï¼</para>
+
+ <itemizedlist>
+ <listitem>
+ <para>SQLæ¥è¯¢å符串</para>
+ </listitem>
+
+ <listitem>
+ <para>è¦è¿åçå®ä½</para>
+ </listitem>
+ </itemizedlist>
+
+ <para>
+ å设Cat被æ å°ä¸ºæ¥æID,NAMEåBIRTHDATEä¸ä¸ªå段çç±»ï¼ä»¥ä¸ç两个æ¥è¯¢é½è¿åä¸ä¸ªListï¼æ¯ä¸ªå
ç´ é½æ¯ä¸ä¸ªCatå®ä½ã
+ </para>
+
+ <para>
+ åè¥å®ä½å¨æ å°æ¶æä¸ä¸ª<literal>many-to-one</literal>çå
³èæåå¦å¤ä¸ä¸ªå®ä½ï¼å¨æ¥è¯¢æ¶å¿
é¡»ä¹è¿åé£ä¸ªå®ä½ï¼å¦åä¼å¯¼è´åçä¸ä¸ª"column not found"çæ°æ®åºé误ãè¿äºéå çå段å¯ä»¥ä½¿ç¨*æ 注æ¥èªå¨è¿åï¼ä½æ们å¸æè¿æ¯æç¡®ææï¼çä¸é¢è¿ä¸ªå
·ææå<literal>Dog</literal>ç<literal>many-to-one</literal>çä¾åï¼
+ </para>
+
+ <programlisting><![CDATA[sess.createSQLQuery("SELECT ID, NAME, BIRTHDATE, DOG_ID FROM CATS").addEntity(Cat.class);
+]]></programlisting>
+
+ <para>
+ è¿æ ·cat.getDog()å°±è½æ£å¸¸è¿ä½ã
+ </para>
+ </sect2>
+
+ <sect2>
+ <title>å¤çå
³èåéåç±»(Handling associations and collections)</title>
+
+ <para>
+ éè¿æåæåå°<literal>Dog</literal>è¿æ¥è·å¾ï¼èé¿å
åå§åproxy带æ¥çé¢å¤å¼éä¹æ¯å¯è½çãè¿æ¯éè¿<literal>addJoin()</literal>æ¹æ³è¿è¡çï¼è¿ä¸ªæ¹æ³å¯ä»¥è®©ä½ å°å
³èæéåè¿æ¥è¿æ¥ã
+ </para>
+
+ <programlisting><![CDATA[sess.createSQLQuery("SELECT c.ID, NAME, BIRTHDATE, DOG_ID, D_ID, D_NAME FROM CATS c, DOGS d WHERE c.DOG_ID = d.D_ID")
+ .addEntity("cat", Cat.class)
+ .addJoin("cat.dog");
+]]></programlisting>
+
+ <para>
+ ä¸é¢è¿ä¸ªä¾åä¸ï¼è¿åç<literal>Cat</literal>对象ï¼å
¶<literal>dog</literal>å±æ§è¢«å®å
¨åå§åäºï¼ä¸åéè¦æ°æ®åºçé¢å¤æä½ã注æï¼æ们å äºä¸ä¸ªå«å("cat")ï¼ä»¥ä¾¿ææjoinçç®æ å±æ§è·¯å¾ãéè¿åæ ·çæåè¿æ¥ä¹å¯ä»¥ä½ç¨äºéåç±»ï¼ä¾å¦ï¼åè¥<literal>Cat</literal>æä¸ä¸ªæå<literal>Dog</literal>çä¸å¯¹å¤å
³èã
+ </para>
+
+ <programlisting><![CDATA[sess.createSQLQuery("SELECT ID, NAME, BIRTHDATE, D_ID, D_NAME, CAT_ID FROM CATS c, DOGS d WHERE c.ID = d.CAT_ID")
+ .addEntity("cat", Cat.class)
+ .addJoin("cat.dogs");
+]]></programlisting>
+
+ <p>
+ å°æ¤ä¸ºæ¢ï¼æ们碰å°äºå¤©è±æ¿ï¼è¥ä¸å¯¹SQLæ¥è¯¢è¿è¡å¢å¼ºï¼è¿äºå·²ç»æ¯å¨Hibernateä¸ä½¿ç¨åçSQLæ¥è¯¢æè½åå°çæ大å¯è½äºãä¸é¢çé®é¢å³å°åºç°ï¼è¿åå¤ä¸ªåæ ·ç±»åçå®ä½æä¹åï¼æè
é»è®¤çå«å/å段ä¸å¤åæä¹åï¼
+
+ </p>
+ </sect2>
+
+ <sect2>
+ <title>è¿åå¤ä¸ªå®ä½(Returning multiple entities)</title>
+
+ <para>
+ å°ç®å为æ¢,ç»æéå段å被åå®ä¸ºåæ å°æ件ä¸æå®ççå段åæ¯ä¸è´çãåè¥SQLæ¥è¯¢è¿æ¥äºå¤ä¸ªè¡¨ï¼åä¸ä¸ªå段åå¯è½å¨å¤ä¸ªè¡¨ä¸åºç°å¤æ¬¡ï¼è¿å°±ä¼é æé®é¢ã
+ </para>
+
+ <para>
+ ä¸é¢çæ¥è¯¢ä¸éè¦ä½¿ç¨å段å«å注å°ï¼è¿ä¸ªä¾åæ¬èº«ä¼å¤±è´¥ï¼ï¼
+ </para>
+
+ <programlisting><![CDATA[sess.createSQLQuery("SELECT c.*, m.* FROM CATS c, CATS m WHERE c.MOTHER_ID = c.ID")
+ .addEntity("cat", Cat.class)
+ .addEntity("mother", Cat.class)
+]]></programlisting>
+
+ <para>
+ è¿ä¸ªæ¥è¯¢çæ¬ææ¯å¸ææ¯è¡è¿å两个Catå®ä¾ï¼ä¸ä¸ªæ¯cat,å¦ä¸ä¸ªæ¯å®çå¦å¦ãä½æ¯å 为å®ä»¬çå段å被æ å°ä¸ºç¸åçï¼èä¸å¨æäºæ°æ®åºä¸ï¼è¿åçå段å«åæ¯âc.IDâ,"c.NAME"è¿æ ·çå½¢å¼ï¼èå®ä»¬åå¨æ å°æ件ä¸çååï¼"ID"å"NAME"ï¼ä¸å¹é
ï¼è¿å°±ä¼é æ失败ã
+
+ </para>
+
+ <para>
+ ä¸é¢çå½¢å¼å¯ä»¥è§£å³å段åéå¤ï¼
+ </para>
+
+ <programlisting><![CDATA[sess.createSQLQuery("SELECT {cat.*}, {mother.*} FROM CATS c, CATS m WHERE c.MOTHER_ID = c.ID")
+ .addEntity("cat", Cat.class)
+ .addEntity("mother", Cat.class)
+]]></programlisting>
+
+ <para>è¿ä¸ªæ¥è¯¢ææï¼</para>
+
+ <itemizedlist>
+ <listitem>
+ <para>
+ SQLæ¥è¯¢è¯å¥ï¼å
¶ä¸å
å«å ä½éæ¥è®©Hibernate注å°å段å«å</para>
+ </listitem>
+
+ <listitem>
+ <para>
+ æ¥è¯¢è¿åçå®ä½
+ </para>
+ </listitem>
+ </itemizedlist>
+
+ <para>
+ ä¸é¢ä½¿ç¨ç{cat.*}å{mother.*}æ è®°æ¯ä½ä¸ºâææå±æ§âçç®åå½¢å¼åºç°çãå½ç¶ä½ ä¹å¯ä»¥æç¡®å°ç½ååºå段åï¼ä½å¨è¿ä¸ªä¾åéé¢æ们让Hibernateæ¥ä¸ºæ¯ä¸ªå±æ§æ³¨å°SQLå段å«åãå段å«åçå ä½ç¬¦æ¯å±æ§åå ä¸è¡¨å«åçåç¼ãå¨ä¸é¢çä¾åä¸ï¼æ们ä»å¦å¤ä¸ä¸ªè¡¨ï¼cat_logï¼ä¸éè¿æ å°å
æ°æ®ä¸çæå®è·åCatåå®çå¦å¦ã注æï¼è¦æ¯æ们æ¿æï¼æ们çè³å¯ä»¥å¨whereåå¥ä¸ä½¿ç¨å±æ§å«åã
+
+ </para>
+
+ <programlisting><![CDATA[String sql = "SELECT ID as {c.id}, NAME as {c.name}, " +
+ "BIRTHDATE as {c.birthDate}, MOTHER_ID as {c.mother}, {mother.*} " +
+ "FROM CAT_LOG c, CAT_LOG m WHERE {c.mother} = c.ID";
+
+List loggedCats = sess.createSQLQuery(sql)
+ .addEntity("cat", Cat.class)
+ .addEntity("mother", Cat.class).list()
+]]></programlisting>
+
+ <sect3 id="querysql-aliasreferences" revision="2">
+ <title>å«ååå±æ§å¼ç¨(Alias and property references)</title>
+
+ <para>
+ 大å¤æ°æ
åµä¸ï¼é½éè¦ä¸é¢çå±æ§æ³¨å°ï¼ä½å¨ä½¿ç¨æ´å å¤æçæ å°ï¼æ¯å¦å¤åå±æ§ãéè¿æ è¯ç¬¦æé 继æ¿æ ï¼ä»¥åéåç±»ççæ
åµä¸ï¼ä¹æä¸äºç¹å«çå«åï¼æ¥å
许Hibernate注å°åéçå«åã
+ </para>
+
+ <para>
+ ä¸è¡¨ååºäºä½¿ç¨å«å注å°åæ°çä¸åå¯è½æ§ã注æï¼ä¸é¢ç»æä¸çå«ååªæ¯ç¤ºä¾ï¼å®ç¨æ¶æ¯ä¸ªå«åéè¦å¯ä¸å¹¶ä¸ä¸åçååã
+ </para>
+
+ <table frame="topbot" id="aliasinjection-summary">
+ <title>å«å注å°(alias injection names)</title>
+
+ <tgroup cols="3">
+ <colspec colwidth="1*" />
+
+ <colspec colwidth="1*" />
+
+ <colspec colwidth="2.5*" />
+
+ <thead>
+ <row>
+ <entry>æè¿°</entry>
+
+ <entry>è¯æ³</entry>
+
+ <entry>示ä¾</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry>ç®åå±æ§</entry>
+ <entry><literal>{[aliasname].[propertyname]</literal></entry>
+ <entry><literal>A_NAME as {item.name}</literal></entry>
+ </row>
+ <row>
+ <entry>å¤åå±æ§</entry>
+ <entry><literal>{[aliasname].[componentname].[propertyname]}</literal></entry>
+ <entry><literal>CURRENCY as {item.amount.currency}, VALUE as {item.amount.value}</literal></entry>
+ </row>
+ <row>
+ <entry>å®ä½è¾¨å«å¨(Discriminator of an entity)</entry>
+ <entry><literal>{[aliasname].class}</literal></entry>
+ <entry><literal>DISC as {item.class}</literal></entry>
+ </row>
+ <row>
+ <entry>å®ä½çææå±æ§</entry>
+ <entry><literal>{[aliasname].*}</literal></entry>
+ <entry><literal>{item.*}</literal></entry>
+ </row>
+ <row>
+ <entry>éåé®(collection key)</entry>
+ <entry><literal>{[aliasname].key}</literal></entry>
+ <entry><literal>ORGID as {coll.key}</literal></entry>
+ </row>
+ <row>
+ <entry>éåid</entry>
+ <entry><literal>{[aliasname].id}</literal></entry>
+ <entry><literal>EMPID as {coll.id}</literal></entry>
+ </row>
+ <row>
+ <entry>éåå
ç´ </entry>
+ <entry><literal>{[aliasname].element}</literal></entry>
+ <entry><literal>XID as {coll.element}</literal></entry>
+ <entry></entry>
+ </row>
+ <row>
+ <entry>éåå
ç´ çå±æ§</entry>
+ <entry><literal>{[aliasname].element.[propertyname]}</literal></entry>
+ <entry><literal>NAME as {coll.element.name}</literal></entry>
+ </row>
+ <row>
+ <entry>éåå
ç´ çææå±æ§</entry>
+ <entry><literal>{[aliasname].element.*}</literal></entry>
+ <entry><literal>{coll.element.*}</literal></entry>
+ </row>
+ <row>
+ <entry>éåçææå±æ§</entry>
+ <entry><literal>{[aliasname].*}</literal></entry>
+ <entry><literal>{coll.*}</literal></entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </table>
+
+
+ </sect3>
+ </sect2>
+
+ <sect2>
+ <title>è¿åéå管å®ä½(Returning non-managed entities)</title>
+
+ <para>
+ å¯ä»¥å¯¹åçsql æ¥è¯¢ä½¿ç¨ResultTransformerãè¿ä¼è¿åä¸åHibernate管ççå®ä½ã
+
+ </para>
+
+ <programlisting><![CDATA[sess.createSQLQuery("SELECT NAME, BIRTHDATE FROM CATS")
+ .setResultTransformer(Transformers.aliasToBean(CatDTO.class))]]></programlisting>
+
+ <para>è¿ä¸ªæ¥è¯¢æå®ï¼</para>
+
+ <itemizedlist>
+ <listitem>
+ <para>SQLæ¥è¯¢å符串</para>
+ </listitem>
+
+ <listitem>
+ <para>ç»æ转æ¢å¨(result transformer)</para>
+ </listitem>
+ </itemizedlist>
+
+ <para>
+ ä¸é¢çæ¥è¯¢å°ä¼è¿å<literal>CatDTO</literal>çå表,å®å°è¢«å®ä¾å并ä¸å°NAMEåBIRTHDAYçå¼æ³¨å°å
¥å¯¹åºçå±æ§æè
å段ã
+ </para>
+ </sect2>
+
+ <sect2>
+ <title>å¤ç继æ¿ï¼Handling inheritanceï¼</title>
+
+ <para>
+ åçSQLæ¥è¯¢åè¥å
¶æ¥è¯¢ç»æå®ä½æ¯ç»§æ¿æ ä¸çä¸é¨åï¼å®å¿
é¡»å
å«åºç±»åææåç±»çææå±æ§ã
+ </para>
+ </sect2>
+
+ <sect2>
+ <title>åæ°ï¼Parametersï¼</title>
+
+ <para>
+ åçæ¥è¯¢æ¯æä½ç½®åæ°åå½ååæ°ï¼
+ </para>
+
+ <programlisting><![CDATA[Query query = sess.createSQLQuery("SELECT * FROM CATS WHERE NAME like ?").addEntity(Cat.class);
+List pusList = query.setString(0, "Pus%").list();
+
+query = sess.createSQLQuery("SELECT * FROM CATS WHERE NAME like :name").addEntity(Cat.class);
+List pusList = query.setString("name", "Pus%").list(); ]]></programlisting>
+ </sect2>
+
+
+
+ </sect1>
+
+
+ <sect1 id="querysql-namedqueries" revision="3">
+ <title>å½åSQLæ¥è¯¢</title>
+
+ <para>
+ å¯ä»¥å¨æ å°ææ¡£ä¸å®ä¹æ¥è¯¢çåå,ç¶åå°±å¯ä»¥è±¡è°ç¨ä¸ä¸ªå½åçHQLæ¥è¯¢ä¸æ ·ç´æ¥è°ç¨å½åSQLæ¥è¯¢.å¨è¿ç§æ
åµä¸,æ们<emphasis>ä¸</emphasis>
+ éè¦è°ç¨<literal>addEntity()</literal>æ¹æ³.
+ </para>
+
+ <programlisting><![CDATA[<sql-query name="persons">
+ <return alias="person" class="eg.Person"/>
+ SELECT person.NAME AS {person.name},
+ person.AGE AS {person.age},
+ person.SEX AS {person.sex}
+ FROM PERSON person
+ WHERE person.NAME LIKE :namePattern
+</sql-query>]]></programlisting>
+
+ <programlisting><![CDATA[List people = sess.getNamedQuery("persons")
+ .setString("namePattern", namePattern)
+ .setMaxResults(50)
+ .list();]]></programlisting>
+
+ <para><literal><return-join></literal>å
+ <literal><load-collection></literal> å
ç´ æ¯ç¨æ¥è¿æ¥å
³è以åå°æ¥è¯¢å®ä¹ä¸ºé¢å
åå§åå个éåçã</para>
+
+ <programlisting><![CDATA[<sql-query name="personsWith">
+ <return alias="person" class="eg.Person"/>
+ <return-join alias="address" property="person.mailingAddress"/>
+ SELECT person.NAME AS {person.name},
+ person.AGE AS {person.age},
+ person.SEX AS {person.sex},
+ address.STREET AS {address.street},
+ address.CITY AS {address.city},
+ address.STATE AS {address.state},
+ address.ZIP AS {address.zip}
+ FROM PERSON person
+ JOIN ADDRESS address
+ ON person.ID = address.PERSON_ID AND address.TYPE='MAILING'
+ WHERE person.NAME LIKE :namePattern
+</sql-query>]]></programlisting>
+
+
+ <para>
+ ä¸ä¸ªå½åæ¥è¯¢å¯è½ä¼è¿åä¸ä¸ªæ éå¼.ä½ å¿
须使ç¨<literal><return-scalar></literal>å
ç´ æ¥æå®å段çå«åå
+ Hibernateç±»å
+ </para>
+
+ <programlisting><![CDATA[<sql-query name="mySqlQuery">
+ <return-scalar column="name" type="string"/>
+ <return-scalar column="age" type="long"/>
+ SELECT p.NAME AS name,
+ p.AGE AS age,
+ FROM PERSON p WHERE p.NAME LIKE 'Hiber%'
+</sql-query>]]></programlisting>
+
+ <para>
+ ä½ å¯ä»¥æç»æéæ å°çä¿¡æ¯æ¾å¨å¤é¨ç<literal><resultset></literal>å
ç´ ä¸ï¼è¿æ ·å°±å¯ä»¥å¨å¤ä¸ªå½åæ¥è¯¢é´ï¼æè
éè¿<literal>setResultSetMapping()</literal>APIæ¥è®¿é®ã(æ¤å¤åæå³åçãåæ为ï¼You can externalize the resultset mapping informations in a
+ <literal><resultset></literal> element to either reuse them accross
+ several named queries or through the
+ <literal>setResultSetMapping()</literal> API.)
+ </para>
+
+ <programlisting><![CDATA[<resultset name="personAddress">
+ <return alias="person" class="eg.Person"/>
+ <return-join alias="address" property="person.mailingAddress"/>
+</resultset>
+
+<sql-query name="personsWith" resultset-ref="personAddress">
+ SELECT person.NAME AS {person.name},
+ person.AGE AS {person.age},
+ person.SEX AS {person.sex},
+ address.STREET AS {address.street},
+ address.CITY AS {address.city},
+ address.STATE AS {address.state},
+ address.ZIP AS {address.zip}
+ FROM PERSON person
+ JOIN ADDRESS address
+ ON person.ID = address.PERSON_ID AND address.TYPE='MAILING'
+ WHERE person.NAME LIKE :namePattern
+</sql-query>]]></programlisting>
+
+ <para>
+ å¦å¤,ä½ å¯ä»¥å¨java代ç ä¸ç´æ¥ä½¿ç¨hbmæ件ä¸çç»æéå®ä¹ä¿¡æ¯ã
+ </para>
+
+ <programlisting><![CDATA[List cats = sess.createSQLQuery(
+ "select {cat.*}, {kitten.*} from cats cat, cats kitten where kitten.mother = cat.id"
+ )
+ .setResultSetMapping("catAndKitten")
+ .list();]]></programlisting>
+
+ <sect2 id="propertyresults">
+ <title>使ç¨return-propertyæ¥æç¡®å°æå®å段/å«å</title>
+
+ <para>
+ 使ç¨<literal><return-property></literal>ä½ å¯ä»¥æç¡®çåè¯Hibernate使ç¨åªäºå段å«å,è¿å代äºä½¿ç¨<literal>{}</literal>-è¯æ³
+ æ¥è®©Hibernate注å
¥å®èªå·±çå«å.
+ </para>
+
+ <programlisting><![CDATA[<sql-query name="mySqlQuery">
+ <return alias="person" class="eg.Person">
+ <return-property name="name" column="myName"/>
+ <return-property name="age" column="myAge"/>
+ <return-property name="sex" column="mySex"/>
+ </return>
+ SELECT person.NAME AS myName,
+ person.AGE AS myAge,
+ person.SEX AS mySex,
+ FROM PERSON person WHERE person.NAME LIKE :name
+</sql-query>
+]]></programlisting>
+ <literal><return-property></literal>ä¹å¯ç¨äºå¤ä¸ªå段,å®è§£å³äºä½¿ç¨<literal>{}</literal>-è¯æ³ä¸è½ç»ç²åº¦æ§å¶å¤ä¸ªå段çéå¶
+ <programlisting><![CDATA[<sql-query name="organizationCurrentEmployments">
+ <return alias="emp" class="Employment">
+ <return-property name="salary">
+ <return-column name="VALUE"/>
+ <return-column name="CURRENCY"/>
+ </return-property>
+ <return-property name="endDate" column="myEndDate"/>
+ </return>
+ SELECT EMPLOYEE AS {emp.employee}, EMPLOYER AS {emp.employer},
+ STARTDATE AS {emp.startDate}, ENDDATE AS {emp.endDate},
+ REGIONCODE as {emp.regionCode}, EID AS {emp.id}, VALUE, CURRENCY
+ FROM EMPLOYMENT
+ WHERE EMPLOYER = :id AND ENDDATE IS NULL
+ ORDER BY STARTDATE ASC
+</sql-query>]]></programlisting>
+
+ <para>
+ 注æå¨è¿ä¸ªä¾åä¸,æ们使ç¨äº<literal><return-property></literal>ç»å<literal>{}</literal>ç注å
¥è¯æ³.
+ å
许ç¨æ·æ¥éæ©å¦ä½å¼ç¨å段以åå±æ§.
+ </para>
+
+ <para>
+ å¦æä½ æ å°ä¸ä¸ªè¯å«å¨(discriminator),ä½ å¿
须使ç¨<literal><return-discriminator></literal> æ¥æå®è¯å«å¨å段
+ </para>
+ </sect2>
+
+ <sect2 id="sp_query" revision="1">
+ <title>使ç¨åå¨è¿ç¨æ¥æ¥è¯¢</title>
+
+ <para>
+ Hibernate 3å¼å
¥äºå¯¹åå¨è¿ç¨æ¥è¯¢(stored procedure)åå½æ°(function)çæ¯æ.以ä¸ç说æä¸ï¼è¿äºè
ä¸è¬é½éç¨ã
+
+ åå¨è¿ç¨/å½æ°å¿
é¡»è¿åä¸ä¸ªç»æé,ä½ä¸ºHibernateè½å¤ä½¿ç¨ç第ä¸ä¸ªå¤é¨åæ°.
+
+ ä¸é¢æ¯ä¸ä¸ªOracle9åæ´é«çæ¬çåå¨è¿ç¨ä¾å.</para>
+
+ <programlisting><![CDATA[CREATE OR REPLACE FUNCTION selectAllEmployments
+ RETURN SYS_REFCURSOR
+AS
+ st_cursor SYS_REFCURSOR;
+BEGIN
+ OPEN st_cursor FOR
+ SELECT EMPLOYEE, EMPLOYER,
+ STARTDATE, ENDDATE,
+ REGIONCODE, EID, VALUE, CURRENCY
+ FROM EMPLOYMENT;
+ RETURN st_cursor;
+ END;]]></programlisting>
+ <para>
+ å¨Hibernateéè¦è¦ä½¿ç¨è¿ä¸ªæ¥è¯¢,ä½ éè¦éè¿å½åæ¥è¯¢æ¥æ å°å®.
+ </para>
+
+ <programlisting><![CDATA[<sql-query name="selectAllEmployees_SP" callable="true">
+ <return alias="emp" class="Employment">
+ <return-property name="employee" column="EMPLOYEE"/>
+ <return-property name="employer" column="EMPLOYER"/>
+ <return-property name="startDate" column="STARTDATE"/>
+ <return-property name="endDate" column="ENDDATE"/>
+ <return-property name="regionCode" column="REGIONCODE"/>
+ <return-property name="id" column="EID"/>
+ <return-property name="salary">
+ <return-column name="VALUE"/>
+ <return-column name="CURRENCY"/>
+ </return-property>
+ </return>
+ { ? = call selectAllEmployments() }
+</sql-query>]]></programlisting>
+
+ <para>
+ 注æåå¨è¿ç¨å½åä»
ä»
è¿åæ éåå®ä½.ç°å¨ä¸æ¯æ<literal><return-join></literal>å<literal><load-collection></literal>
+
+ </para>
+
+ <sect3 id="querysql-limits-storedprocedures" revision="1">
+ <title>使ç¨åå¨è¿ç¨çè§ååéå¶</title>
+
+ <para>
+ 为äºå¨Hibernateä¸ä½¿ç¨åå¨è¿ç¨,ä½ å¿
é¡»éµå¾ªä¸äºè§å.ä¸éµå¾ªè¿äºè§åçåå¨è¿ç¨å°ä¸å¯ç¨.å¦æä½ ä»ç¶æ³è¦ä½¿ç¨ä»ä»¬,
+ ä½ å¿
é¡»éè¿<literal>session.connection()</literal>æ¥æ§è¡ä»ä»¬.è¿äºè§åé对äºä¸åçæ°æ®åº.å 为æ°æ®åº
+ æä¾åæåç§ä¸åçåå¨è¿ç¨è¯æ³åè¯ä¹.
+ </para>
+
+ <para>
+ 对åå¨è¿ç¨è¿è¡çæ¥è¯¢æ æ³ä½¿ç¨<literal>setFirstResult()/setMaxResults()</literal>è¿è¡å页ã
+ </para>
+
+
+ <para>建议éç¨çè°ç¨æ¹å¼æ¯æ åSQL92: <literal>{ ? = call
+ functionName(<parameters>) }</literal> æè
<literal>{ ? = call
+ procedureName(<parameters>}</literal>.åçè°ç¨è¯æ³ä¸è¢«æ¯æã</para>
+
+ <para>
+ 对äºOracleæå¦ä¸è§å:
+ </para>
+
+ <itemizedlist spacing="compact">
+ <listitem>
+ <para>å½æ°å¿
é¡»è¿åä¸ä¸ªç»æéãåå¨è¿ç¨ç第ä¸ä¸ªåæ°å¿
é¡»æ¯<literal>OUT</literal>ï¼å®è¿åä¸ä¸ªç»æéãè¿æ¯éè¿Oracle 9æ10ç<literal>SYS_REFCURSOR</literal>ç±»åæ¥å®æçãå¨Oracleä¸ä½ éè¦å®ä¹ä¸ä¸ª<literal>REF CURSOR</literal>ç±»åï¼åè§Oracleçæåã</para>
+ </listitem>
+ </itemizedlist>
+
+ <para>
+ 对äºSybaseæè
MS SQL serveræå¦ä¸è§å:
+ </para>
+
+ <itemizedlist spacing="compact">
+ <listitem>
+ <para>
+ åå¨è¿ç¨å¿
é¡»è¿åä¸ä¸ªç»æéã.注æè¿äºserverså¯è½è¿åå¤ä¸ªç»æé以åæ´æ°çæ°ç®.Hibernateå°ååºç¬¬ä¸æ¡ç»æéä½ä¸ºå®çè¿åå¼ï¼
+ å
¶ä»å°è¢«ä¸¢å¼ã
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ å¦æä½ è½å¤å¨åå¨è¿ç¨é设å®<literal>SET NOCOUNT ON</literal>ï¼è¿å¯è½ä¼æçæ´é«ï¼ä½è¿ä¸æ¯å¿
éçã
+ </para>
+ </listitem>
+ </itemizedlist>
+ </sect3>
+ </sect2>
+
+ </sect1>
+
+ <sect1 id="querysql-cud">
+ <title>å®å¶SQLç¨æ¥createï¼updateådelete</title>
+
+ <para>
+ Hibernate3è½å¤ä½¿ç¨å®å¶çSQLè¯å¥æ¥æ§è¡create,updateådeleteæä½ãå¨Hibernateä¸ï¼æä¹
åçç±»åéåå·²ç»
+ å
å«äºä¸å¥é
ç½®æ产ççè¯å¥(insertsql, deletesql, updatesqlçç)ï¼è¿äºæ å°æ è®° <literal><sql-insert></literal>,
+ <literal><sql-delete></literal>, and <literal><sql-update></literal>éè½½äº
+ è¿äºè¯å¥ã
+ </para>
+
+ <programlisting><![CDATA[<class name="Person">
+ <id name="id">
+ <generator class="increment"/>
+ </id>
+ <property name="name" not-null="true"/>
+ <sql-insert>INSERT INTO PERSON (NAME, ID) VALUES ( UPPER(?), ? )</sql-insert>
+ <sql-update>UPDATE PERSON SET NAME=UPPER(?) WHERE ID=?</sql-update>
+ <sql-delete>DELETE FROM PERSON WHERE ID=?</sql-delete>
+</class>]]></programlisting>
+
+ <para>
+ è¿äºSQLç´æ¥å¨ä½ çæ°æ®åºéæ§è¡ï¼æä»¥ä½ å¯ä»¥èªç±ç使ç¨ä½ å欢çä»»æè¯æ³ãä½å¦æä½ ä½¿ç¨æ°æ®åºç¹å®çè¯æ³ï¼
+ è¿å½ç¶ä¼éä½ä½ æ å°çå¯ç§»æ¤æ§ã
+ </para>
+
+ <para>
+ å¦æ设å®<literal>callable</literal>ï¼åè½å¤æ¯æåå¨è¿ç¨äºã
+ </para>
+
+ <programlisting><![CDATA[<class name="Person">
+ <id name="id">
+ <generator class="increment"/>
+ </id>
+ <property name="name" not-null="true"/>
+ <sql-insert callable="true">{call createPerson (?, ?)}</sql-insert>
+ <sql-delete callable="true">{? = call deletePerson (?)}</sql-delete>
+ <sql-update callable="true">{? = call updatePerson (?, ?)}</sql-update>
+</class>]]></programlisting>
+
+ <para>
+ åæ°çä½ç½®é¡ºåºæ¯é常éè¦çï¼ä»ä»¬å¿
é¡»åHibernateææå¾
ç顺åºç¸åã
+ </para>
+
+ <para>
+ ä½ è½å¤éè¿è®¾å®æ¥å¿è°è¯çº§å«ä¸º<literal>org.hiberante.persister.entity</literal>,æ¥æ¥çHibernateææå¾
ç顺åºãå¨è¿ä¸ªçº§å«ä¸ï¼
+ Hibernateå°ä¼æå°åºcreate,updateådeleteå®ä½çéæSQLã(å¦ææ³çå°é¢è®¡ç顺åºãè®°å¾ä¸è¦å°å®å¶SQLå
å«å¨æ å°æ件éï¼
+ å 为ä»ä»¬ä¼éè½½HibernateçæçéæSQLã)
+ </para>
+
+ <para>
+ å¨å¤§å¤æ°æ
åµä¸(æ好è¿ä¹å)ï¼åå¨è¿ç¨éè¦è¿åæå
¥/æ´æ°/å é¤çè¡æ°ï¼å 为Hibernate对è¯å¥çæåæ§è¡æäºè¿è¡æ¶çæ£æ¥ã
+ Hibernate常ä¼æè¿è¡CUDæä½çè¯å¥ç第ä¸ä¸ªåæ°æ³¨å为ä¸ä¸ªæ°å¼åè¾åºåæ°ã
+ </para>
+
+ <programlisting><![CDATA[CREATE OR REPLACE FUNCTION updatePerson (uid IN NUMBER, uname IN VARCHAR2)
+ RETURN NUMBER IS
+BEGIN
+
+ update PERSON
+ set
+ NAME = uname,
+ where
+ ID = uid;
+
+ return SQL%ROWCOUNT;
+
+END updatePerson;]]></programlisting>
+
+
+ </sect1>
+
+ <sect1 id="querysql-load">
+ <title>å®å¶è£
è½½SQL</title>
+
+ <para>
+ ä½ å¯è½éè¦å£°æä½ èªå·±çSQL(æHQL)æ¥è£
è½½å®ä½
+ </para>
+
+ <programlisting><![CDATA[<sql-query name="person">
+ <return alias="pers" class="Person" lock-mode="upgrade"/>
+ SELECT NAME AS {pers.name}, ID AS {pers.id}
+ FROM PERSON
+ WHERE ID=?
+ FOR UPDATE
+</sql-query>]]></programlisting>
+
+ <para>
+ è¿åªæ¯ä¸ä¸ªåé¢è®¨è®ºè¿çå½åæ¥è¯¢å£°æï¼ä½ å¯ä»¥å¨ç±»æ å°éå¼ç¨è¿ä¸ªå½åæ¥è¯¢ã
+ </para>
+
+ <programlisting><![CDATA[<class name="Person">
+ <id name="id">
+ <generator class="increment"/>
+ </id>
+ <property name="name" not-null="true"/>
+ <loader query-ref="person"/>
+</class>]]></programlisting>
+
+ <para>
+ è¿ä¹å¯ä»¥ç¨äºåå¨è¿ç¨
+ </para>
+
+ <para>ä½ çè³å¯ä»¥å®ä¸ä¸ªç¨äºéåè£
è½½çæ¥è¯¢:</para>
+
+ <programlisting><![CDATA[<set name="employments" inverse="true">
+ <key/>
+ <one-to-many class="Employment"/>
+ <loader query-ref="employments"/>
+</set>]]></programlisting>
+
+ <programlisting><![CDATA[<sql-query name="employments">
+ <load-collection alias="emp" role="Person.employments"/>
+ SELECT {emp.*}
+ FROM EMPLOYMENT emp
+ WHERE EMPLOYER = :id
+ ORDER BY STARTDATE ASC, EMPLOYEE ASC
+</sql-query>]]></programlisting>
+
+ <para>ä½ çè³è¿å¯ä»¥å®ä¹ä¸ä¸ªå®ä½è£
è½½å¨ï¼å®éè¿è¿æ¥æåè£
è½½ä¸ä¸ªéå:</para>
+
+ <programlisting><![CDATA[<sql-query name="person">
+ <return alias="pers" class="Person"/>
+ <return-join alias="emp" property="pers.employments"/>
+ SELECT NAME AS {pers.*}, {emp.*}
+ FROM PERSON pers
+ LEFT OUTER JOIN EMPLOYMENT emp
+ ON pers.ID = emp.PERSON_ID
+ WHERE ID=?
+</sql-query>]]></programlisting>
+ </sect1>
+
+</chapter>
\ No newline at end of file
Copied: core/trunk/documentation/manual/zh-CN/src/main/docbook/content/quickstart.xml (from rev 14080, core/trunk/documentation/manual/zh-CN/src/main/docbook/modules/quickstart.xml)
===================================================================
--- core/trunk/documentation/manual/zh-CN/src/main/docbook/content/quickstart.xml (rev 0)
+++ core/trunk/documentation/manual/zh-CN/src/main/docbook/content/quickstart.xml 2007-10-09 20:10:34 UTC (rev 14081)
@@ -0,0 +1,461 @@
+<chapter id="quickstart">
+ <title>å¨Tomcatä¸å¿«éä¸æ</title>
+
+ <sect1 id="quickstart-intro" revision="2">
+ <title>å¼å§Hibernateä¹æ
</title>
+
+ <para>
+ è¿ä»½æç¨æè¿°å¦ä½å¨Apache Tomcat servlet容å¨ä¸ä¸ºwebåºç¨ç¨åºé
ç½®Hibernate 3.0(æ们使ç¨Tomcat 4.1çæ¬ï¼ä¸5.0çæ¬å·®å«å¾å°)ãHibernateå¨å¤§å¤æ°ä¸»æµJ2EEåºç¨æå¡å¨
+ çè¿è¡ç¯å¢ä¸é½å¯ä»¥å·¥ä½è¯å¥½ï¼çè³ä¹å¯ä»¥å¨ç¬ç«Javaåºç¨ç¨åºä¸ä½¿ç¨ãå¨æ¬æç¨ä¸ä½¿ç¨ç示ä¾æ°æ®åºç³»ç»æ¯PostgreSQL 7.4,åªéè¦ä¿®æ¹Hibernate SQLè¯è¨é
ç½®ä¸è¿æ¥å±æ§ï¼å°±å¯ä»¥
+ å¾å®¹æçæ¯æå
¶ä»æ°æ®åºäºã
+ </para>
+
+ <para>
+ 第ä¸æ¥ï¼æ们å¿
é¡»æ·è´ææéè¦çåºæ件å°Tomcatå®è£
ç®å½ä¸ãå¨è¿ç¯æç¨ä¸ï¼æ们使ç¨ä¸ä¸ªç¬ç«çweb Contexté
ç½®ï¼<literal>webapps/quickstart</literal>ï¼ãæ们确认å
¨å±åºæ件ï¼<literal>TOMCAT/common/lib</literal>ï¼åæ¬webåºç¨ç¨åºä¸ä¸æçè·¯å¾ï¼å¯¹äºjaræ¥è¯´æ¯<literal>webapps/quickstart/WEB-INF/lib</literal>ï¼å¯¹äºclassæ件æ¥è¯´æ¯<literal>webapps/quickstart/WEB-INF/classes</literal>ï¼è½å¤è¢«ç±»è£
è½½å¨æ£ç´¢å°ãæ们æè¿ä¸¤ä¸ªç±»è£
è½½å¨çº§å«åå«ç§°åå
¨å±ç±»è·¯å¾(global classpath)åä¸ä¸æ类路å¾(context classpath)ã
+ </para>
+
+ <para>
+ ç°å¨ï¼æè¿äºåºæ件copyå°ä¸¤ä¸ªç±»è·¯å¾å»:
+ </para>
+
+ <orderedlist>
+ <listitem>
+ <para>
+ ææ°æ®åºéè¦çJDBC驱å¨æ件æ·è´å°å
¨å±ç±»è·¯å¾ï¼è¿æ¯tomcatæç»çDBCPè¿æ¥æ± æéè¦çãHibernate使ç¨JDBCè¿æ¥æ°æ®åºæ¹å¼æ§è¡SQLè¯å¥ï¼æä»¥ä½ è¦ä¹æä¾å¤é¨è¿æ¥æ± ä¸çè¿æ¥ç»Hibernateï¼æè
é
ç½®Hibernateèªå¸¦çè¿æ¥æ± ï¼C3PO,Proxoolï¼ã对äºæ¬æç¨æ¥è¯´ï¼æ<literal>pg74jdbc3.jar</literal>åºæ件ï¼æ¯æPostgreSQL 7.4åJDK 1.4)å°å
¨å±ç±»è£
载路å¾ä¸å³å¯ãå¦æä½ å¸æ使ç¨å
¶ä»çæ°æ®åºï¼æ·è´å
¶ç¸åºçJDBC 驱å¨æ件ï¼ã
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ æ°¸è¿ä¸è¦æ·è´ä»»ä½å
¶ä»ä¸è¥¿å°Tomcatçå
¨å±ç±»è·¯å¾ä¸ï¼å¦åä½ å¯è½å¨ä½¿ç¨å
¶ä»ä¸äºå·¥å
·ä¸éå°éº»ç¦ï¼æ¯å¦log4j, commons-loggingççã
+ ä¸å®è¦è®©æ¯ä¸ªwebåºç¨ç¨åºä½¿ç¨èªå·±çä¸ä¸æ类路å¾ï¼å°±æ¯è¯´æä½ èªå·±éè¦çç±»åºæ·è´å°<literal>WEB-INF/lib</literal>ä¸å»ï¼æé
ç½®æ件configuration/propertyçé
ç½®æ件æ·è´å°<literal>WEB-INF/classes</literal>ä¸é¢å»ãè¿ä¸¤ä¸ªç®å½é½æ¯å½åç¨åºç¼ºççä¸ä¸æ类路å¾ã
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ Hibernateæ¬èº«æå
æä¸ä¸ªJARç±»åºãå°<literal>hibernate3.jar</literal>æ件æ·è´å°ç¨åºçä¸ä¸æ类路å¾ä¸ï¼åä½ åºç¨ç¨åºçå
¶ä»åºæ件æ¾ä¸èµ·ãå¨è¿è¡æ¶ï¼Hibernateè¿éè¦ä¸äºç¬¬ä¸æ¹ç±»åºï¼å®ä»¬å¨Hibernateåè¡å
ç<literal>lib/</literal>ç®å½ä¸ãåè§<xref linkend="3rdpartylibs"/>ãææéè¦ç第ä¸æ¹åºæ件ä¹æ·è´å°ä¸ä¸æ类路å¾ä¸ã
+ </para>
+ </listitem>
+ </orderedlist>
+
+ <table frame="topbot" id="3rdpartylibs">
+ <title>
+ Hibernate 第ä¸æ¹ç±»åº
+ </title>
+ <tgroup cols="2" rowsep="1" colsep="1">
+ <colspec colname="c1" colwidth="1*"/>
+ <colspec colname="c2" colwidth="2*"/>
+ <thead>
+ <row>
+ <entry align="center">
+ ç±»åº
+ </entry>
+ <entry align="center">
+ æè¿°
+ </entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry>
+ antlr (å¿
é)
+ </entry>
+ <entry>
+ Hibernate使ç¨ANTLRæ¥äº§çæ¥è¯¢åæå¨ï¼è¿ä¸ªç±»åºå¨è¿è¡ç¯å¢ä¸æ¶ä¹æ¯å¿
éçã
+ </entry>
+ </row>
+ <row>
+ <entry>
+ dom4j (å¿
é)
+ </entry>
+ <entry>
+ Hibernate使ç¨dom4j解æXMLé
ç½®æ件åXMLæ å°å
æ件ã
+ </entry>
+ </row>
+ <row>
+ <entry>
+ CGLIB ,asm(å¿
é)
+ </entry>
+ <entry>
+ Hibernateå¨è¿è¡æ¶ä½¿ç¨è¿ä¸ªä»£ç çæåºå¢å¼ºç±»ï¼ä¸Javaåå°æºå¶èå使ç¨ï¼ã
+ </entry>
+ </row>
+ <row>
+ <entry>
+ Commons Collections, Commons Logging (å¿
é)
+ </entry>
+ <entry>
+ Hibernat使ç¨Apache Jakarta Commons项ç®æä¾çå¤ä¸ªå·¥å
·ç±»åºã
+ </entry>
+ </row>
+ <row>
+ <entry>
+ EHCache (å¿
é)
+ </entry>
+ <entry>
+ Hibernateå¯ä»¥ä½¿ç¨ä¸åcacheç¼åå·¥å
·ä½ä¸ºäºçº§ç¼åãEHCacheæ¯ç¼ºççcacheç¼åå·¥å
·ã
+ </entry>
+ </row>
+ <row>
+ <entry>
+ Log4j (å¯é)
+ </entry>
+ <entry>
+ Hibernate使ç¨Commons Logging API,å®ä¹å¯ä»¥ä¾æ¬¡ä½¿ç¨Log4jä½ä¸ºåºå±å®æ½logçæºå¶ãå¦æä¸ä¸æç±»ç®å½ä¸åå¨Log4jåºï¼åCommons Logging使ç¨Log4jå并å®å¨ä¸ä¸æ类路å¾ä¸å¯»æ¾ç<literal>log4j.properties</literal>æ件ãä½ å¯ä»¥ä½¿ç¨å¨Hibernateåè¡å
ä¸å
å«ä¸çé£ä¸ªç¤ºä¾Log4jçé
ç½®æ件ãè¿æ ·ï¼ælog4j.jaråå®çé
ç½®æ件ï¼ä½äº<literal>src/</literal>ç®å½ä¸ï¼æ·è´å°ä½ çä¸ä¸æ类路å¾ä¸ï¼å°±å¯ä»¥å¨åå°çå°åºç¨åºå¦ä½è¿è¡çã
+ </entry>
+ </row>
+ <row>
+ <entry>
+ å
¶ä»æ件æ¯ä¸æ¯å¿
éçï¼
+ </entry>
+ <entry>
+ 请å¯çHibernateåè¡å
ä¸ç lib/README.txtæ件ï¼è¿æ¯ä¸ä¸ªHibernateåè¡å
ä¸é带ç第ä¸æ¹ç±»åºçå表ï¼ä»ä»¬æ»æ¯ä¿æææ°çãä½ å¯ä»¥å¨é£éæ¾å°ææå¿
éæè
å¯éçç±»åº(注æï¼å
¶ä¸ç"buildtime required"æçæ¯ç¼è¯Hibernateæ¶æéè¦èéç¼è¯ä½ èªå·±çç¨åºæå¿
éçç±»åºï¼ã
+ </entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </table>
+
+ <para>
+ æ¥ä¸æ¥æ们æ¥é
ç½®å¨TomcatåHibernateä¸å
±ç¨çæ°æ®åºè¿æ¥æ± ãä¹å°±æ¯è¯´Tomcatä¼æä¾ç»è¿æ± å¤ççJDBCè¿æ¥ï¼ç¨å®å
ç½®çDBCPè¿æ¥æ± ï¼ï¼Hibernateéè¿JNDIæ¹å¼æ¥è¯·æ±è·å¾JDBCè¿æ¥ãä½ä¸ºæ¿ä»£æ¹æ¡ï¼ä½ ä¹å¯ä»¥è®©Hibernateèªè¡ç®¡çè¿æ¥æ± ãTomcatæè¿æ¥æ± ç»å®å°JNDI,æ们è¦å¨Tomcatç主é
ç½®æ件ï¼<literal>TOMCAT/conf/server.xml</literal>ï¼ä¸å ä¸ä¸ªèµæºå£°æ:
+ </para>
+
+ <programlisting><![CDATA[<Context path="/quickstart" docBase="quickstart">
+ <Resource name="jdbc/quickstart" scope="Shareable" type="javax.sql.DataSource"/>
+ <ResourceParams name="jdbc/quickstart">
+ <parameter>
+ <name>factory</name>
+ <value>org.apache.commons.dbcp.BasicDataSourceFactory</value>
+ </parameter>
+
+ <!-- DBCP database connection settings -->
+ <parameter>
+ <name>url</name>
+ <value>jdbc:postgresql://localhost/quickstart</value>
+ </parameter>
+ <parameter>
+ <name>driverClassName</name><value>org.postgresql.Driver</value>
+ </parameter>
+ <parameter>
+ <name>username</name>
+ <value>quickstart</value>
+ </parameter>
+ <parameter>
+ <name>password</name>
+ <value>secret</value>
+ </parameter>
+
+ <!-- DBCP connection pooling options -->
+ <parameter>
+ <name>maxWait</name>
+ <value>3000</value>
+ </parameter>
+ <parameter>
+ <name>maxIdle</name>
+ <value>100</value>
+ </parameter>
+ <parameter>
+ <name>maxActive</name>
+ <value>10</value>
+ </parameter>
+ </ResourceParams>
+</Context>]]></programlisting>
+
+ <para>
+ æ们å¨è¿ä¸ªä¾åä¸è¦é
ç½®çä¸ä¸æå«å<literal>quickstart</literal>ï¼å®ä½äº<literal>TOMCAT/webapp/quickstart</literal>ç®å½ä¸ãå¦æè¦è®¿é®è¿ä¸ªåºç¨ç¨åº,å¨ä½ çæµè§å¨ä¸è¾å
¥<literal>http://localhost:8080/quickstart</literal>å°±å¯ä»¥äº(å½ç¶ï¼å¨åé¢å ä¸å¨ä½ ç<literal>web.xml</literal>æ件ä¸é
ç½®å¥½ä½ çservlet)ãä½ ç°å¨å¯ä»¥å建ä¸ä¸ªåªå«æ空<literal>process()</literal>çç®åservletäºã
+ </para>
+
+ <para>
+ Tomcatç°å¨éè¿JNDIçæ¹å¼ï¼<literal>java:comp/env/jdbc/quickstart</literal>æ¥æä¾è¿æ¥ãå¦æä½ å¨é
ç½®è¿æ¥æ± éå°é®é¢ï¼è¯·æ¥é
Tomcatææ¡£ãå¦æä½ éå°äºJDBC驱å¨ææ¥çexceptionåºéä¿¡æ¯ï¼è¯·å¨æ²¡æHibernateçç¯å¢ä¸ï¼å
æµè¯JDBCè¿æ¥æ± æ¬èº«æ¯å¦é
ç½®æ£ç¡®ãTomcatåJDBCçé
ç½®æç¨å¯ä»¥å¨Webä¸æ¥å°ã
+ </para>
+
+ <para>
+ ä¸ä¸æ¥å°±æ¯é
ç½®Hibernateãé¦å
Hibernateå¿
é¡»ç¥éå®å¦ä½è·å¾JDBCè¿æ¥ï¼å¨è¿éæ们使ç¨åºäºXMLæ ¼å¼çHibernateé
ç½®æ件ãå½ç¶ä½¿ç¨propertiesæ件çè¿è¡é
ç½®ï¼ä½ç¼ºå°ä¸äºXMLè¯æ³çç¹æ§ãè¿ä¸ªXMLé
ç½®æ件å¿
é¡»æ¾å¨ä¸ä¸æ类路å¾(<literal>WEB-INF/classes</literal>)ä¸é¢ï¼å½å为<literal>hibernate.cfg.xml</literal>:
+ </para>
+
+ <programlisting><![CDATA[<?xml version='1.0' encoding='utf-8'?>
+<!DOCTYPE hibernate-configuration
+ PUBLIC "-//Hibernate/Hibernate Configuration DTD//EN"
+ "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
+
+<hibernate-configuration>
+
+ <session-factory>
+
+ <property name="connection.datasource">java:comp/env/jdbc/quickstart</property>
+ <property name="show_sql">false</property>
+ <property name="dialect">org.hibernate.dialect.PostgreSQLDialect</property>
+
+ <!-- Mapping files -->
+ <mapping resource="Cat.hbm.xml"/>
+
+ </session-factory>
+
+</hibernate-configuration>]]></programlisting>
+
+ <para>
+ å¨è¿éæ们å
³éäºSQLå½ä»¤çlogï¼åæ¶åè¯Hibernate使ç¨åªç§SQLæ°æ®åºç¨è¯(Dialet)ï¼ä»¥åå¦ä½å¾å°JDBCè¿æ¥ï¼éè¿Tomcat声æç»å®çJNDIå°åï¼ãDialetæ¯å¿
éé
ç½®çï¼å 为ä¸åçæ°æ®åºé½å"SQLæ å"æä¸äºåºå
¥ãä¸ç¨æ
å¿ï¼Hibernateä¼æ¿ä½ å¤çè¿äºå·®å¼ï¼Hibernateæ¯æææ主æµçåä¸åå¼æ¾æºä»£ç æ°æ®åºã
+ </para>
+
+ <para>
+ <literal>SessionFactory</literal>æ¯Hibernateçä¸ä¸ªæ¦å¿µï¼è¡¨ç¤ºå¯¹åºä¸ä¸ªæ°æ®åå¨æºãéè¿å建å¤ä¸ªXMLé
ç½®æ件并å¨ä½ çç¨åºä¸å建å¤ä¸ª<literal>Configuration</literal>å<literal>SessionFactory</literal>对象ï¼å°±å¯ä»¥æ¯æå¤ä¸ªæ°æ®åºäºã
+ </para>
+
+ <para>
+ å¨<literal>hibernate.cfg.xml</literal>ä¸çæåä¸ä¸ªå
ç´ å£°æäº<literal>Cat.hbm.xml</literal>ï¼è¿æ¯ä¸ä¸ªHibernate XMLæ å°æ件ï¼å¯¹åºäºæä¹
åç±»<literal>Cat</literal>ãè¿ä¸ªæ件å
å«äºæ<literal>Cat</literal> POJOç±»æ å°å°æ°æ®åºè¡¨ï¼æå¤ä¸ªæ°æ®åºè¡¨ï¼çå
æ°æ®ãæ们ç¨åå°±åæ¥çè¿ä¸ªæ件ãä¸ä¸æ¥è®©æ们å
ç¼åè¿ä¸ªPOJOç±»ï¼ç¶åå¨å£°æå®çæ å°å
æ°æ®ã
+ </para>
+
+ </sect1>
+
+ <sect1 id="quickstart-persistentclass" revision="1">
+ <title>第ä¸ä¸ªæä¹
åç±»</title>
+
+ <para>
+ Hibernate使ç¨ç®åçJava对象(Plain Old Java Objects ,å°±æ¯POJOs,ææ¶åä¹ç§°ä½Plain Ordinary Java Objectsï¼è¿ç§ç¼ç¨æ¨¡åæ¥è¿è¡æä¹
åãä¸ä¸ªPOJOå¾åJavaBean,éè¿getteråsetteræ¹æ³è®¿é®å
¶å±æ§ï¼å¯¹å¤åéèäºå
é¨å®ç°çç»è(åè¥éè¦çè¯,Hibernateä¹å¯ä»¥ç´æ¥è®¿é®å
¶å±æ§å段)ã
+ </para>
+
+ <programlisting><![CDATA[package org.hibernate.examples.quickstart;
+
+public class Cat {
+
+ private String id;
+ private String name;
+ private char sex;
+ private float weight;
+
+ public Cat() {
+ }
+
+ public String getId() {
+ return id;
+ }
+
+ private void setId(String id) {
+ this.id = id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public char getSex() {
+ return sex;
+ }
+
+ public void setSex(char sex) {
+ this.sex = sex;
+ }
+
+ public float getWeight() {
+ return weight;
+ }
+
+ public void setWeight(float weight) {
+ this.weight = weight;
+ }
+
+}]]></programlisting>
+
+ <para>
+ Hibernate对å±æ§ä½¿ç¨çç±»åä¸å ä»»ä½éå¶ãææçJava JDKç±»åååå§ç±»åï¼æ¯å¦<literal>String</literal>,<literal>char</literal>å<literal>Date</literal>)é½å¯ä»¥è¢«æ å°ï¼ä¹å
æ¬Java éåï¼Java collections framework)ä¸çç±»ãä½ å¯ä»¥æå®ä»¬æ å°æ为å¼ï¼å¼éåï¼æè
ä¸å
¶ä»å®ä½ç±»ç¸å
³èã<literal>id</literal>æ¯ä¸ä¸ªç¹æ®çå±æ§ï¼ä»£è¡¨äºè¿ä¸ªç±»çæ°æ®åºæ è¯ç¬¦(主é®)ï¼å¯¹äºç±»ä¼¼äº<literal>Cat</literal>è¿æ ·çå®ä½ç±»æ们强ç建议使ç¨ãHibernateä¹å¯ä»¥ä½¿ç¨å
é¨æ è¯ç¬¦ï¼ä½è¿æ ·æ们ä¼å¤±å»ä¸äºç¨åºæ¶ææ¹é¢ççµæ´»æ§ã
+ </para>
+
+ <para>
+ æä¹
åç±»ä¸éè¦å®ç°ä»ä¹ç¹å«çæ¥å£ï¼ä¹ä¸éè¦ä»ä¸ä¸ªç¹å«çæä¹
åæ ¹ç±»ç»§æ¿ä¸æ¥ãHibernateä¹ä¸éè¦ä½¿ç¨ä»»ä½ç¼è¯æå¤çï¼æ¯å¦åèç å¢å¼ºæä½ï¼å®ç¬ç«ç使ç¨Javaåå°æºå¶åè¿è¡æ¶ç±»å¢å¼ºï¼éè¿CGLIBï¼ãæ以ä¸ä¾èµäºHibernateï¼æ们就å¯ä»¥æPOJOçç±»æ å°æ为æ°æ®åºè¡¨ã
+ </para>
+
+ </sect1>
+
+ <sect1 id="quickstart-mapping" revision="1">
+ <title>æ å°cat</title>
+
+ <para>
+ <literal>Cat.hbm.xml</literal>æ å°æ件å
å«äºå¯¹è±¡/å
³ç³»æ å°ï¼O/R Mappingï¼æéçå
æ°æ®ãå
æ°æ®å
å«æä¹
åç±»ç声æåå±æ§å°æ°æ®åºçæ å°ï¼æåå段åå
¶ä»å®ä½çå¤é®å
³èï¼ã
+ </para>
+
+ <programlisting><![CDATA[<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping
+ PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+ "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<hibernate-mapping>
+
+ <class name="org.hibernate.examples.quickstart.Cat" table="CAT">
+
+ <!-- A 32 hex character is our surrogate key. It's automatically
+ generated by Hibernate with the UUID pattern. -->
+ <id name="id" type="string" unsaved-value="null" >
+ <column name="CAT_ID" sql-type="char(32)" not-null="true"/>
+ <generator class="uuid.hex"/>
+ </id>
+
+ <!-- A cat has to have a name, but it shouldn' be too long. -->
+ <property name="name">
+ <column name="NAME" length="16" not-null="true"/>
+ </property>
+
+ <property name="sex"/>
+
+ <property name="weight"/>
+
+ </class>
+
+</hibernate-mapping>]]></programlisting>
+
+ <para>
+ æ¯ä¸ªæä¹
åç±»é½åºè¯¥æä¸ä¸ªæ è¯å±æ§ï¼å®é
ä¸ï¼è¿ä¸ªç±»åªä»£è¡¨å®ä½ï¼èä¸æ¯ç¬ç«çå¼ç±»åç±»ï¼åè
ä¼è¢«æ å°ç§°ä¸ºå®ä½å¯¹è±¡ä¸çä¸ä¸ªç»ä»¶ï¼ãè¿ä¸ªå±æ§ç¨æ¥åºåæä¹
å对象ï¼å¦æ<literal>catA.getId().equals(catB.getId())</literal>ç»ææ¯trueçè¯ï¼è¿ä¸¤ä¸ªCatå°±æ¯ç¸åçãè¿ä¸ªæ¦å¿µç§°ä¸º<emphasis>æ°æ®åºæ è¯</emphasis>ãHiernateé带äºå ç§ä¸åçæ è¯ç¬¦çæå¨ï¼ç¨äºä¸åçåºåï¼å
æ¬æ°æ®åºæ¬å°ç顺åº(sequence)çæå¨ãhi/loé«ä½ä½æ è¯æ¨¡å¼ãåç¨åºèªå·±å®ä¹çæ è¯ç¬¦ï¼ãæ们å¨è¿é使ç¨UUIDçæå¨ï¼åªå¨æµè¯æ¶å»ºè®®ä½¿ç¨ï¼å¦æ使ç¨æ°æ®åºèªå·±çæçæ´æ°ç±»åçé®å¼æ´å¥½ï¼ï¼å¹¶æå®<literal>CAT</literal>表ä¸ç<literal>CAT_ID</literal>å段ï¼ä½ä¸ºè¡¨ç主é®ï¼åæ¾çæçæ è¯å¼ã
+ </para>
+
+ <para>
+ <literal>Cat</literal>çå
¶ä»å±æ§é½æ å°å°åä¸ä¸ªè¡¨çå段ã对<literal>name</literal>å±æ§æ¥è¯´ï¼æ们æå®æ¾å¼å°å£°ææ å°å°ä¸ä¸ªæ°æ®åºå段ãå¦ææ°æ®åºschemaæ¯éè¿ç±æ å°å£°æ使ç¨Hibernateç<emphasis>SchemaExport</emphasis>å·¥å
·èªå¨çæçï¼ä½ä¸ºSQL DDLæ令ï¼çè¯ï¼è¿å°±ç¹å«æç¨ãææå
¶å®çå±æ§é½ç¨Hibernateçé»è®¤å¼æ å°ï¼å¤§å¤æ°æ
åµä½ é½ä¼è¿æ ·åãæ°æ®åºä¸ç<literal>CAT</literal>表çèµ·æ¥æ¯è¿æ ·çï¼
+ </para>
+
+ <programlisting><![CDATA[ Column | Type | Modifiers
+--------+-----------------------+-----------
+ cat_id | character(32) | not null
+ name | character varying(16) | not null
+ sex | character(1) |
+ weight | real |
+Indexes: cat_pkey primary key btree (cat_id)]]></programlisting>
+
+ <para>
+ ä½ ç°å¨å¯ä»¥å¨ä½ çæ°æ®åºä¸æå·¥å建è¿ä¸ªè¡¨äºï¼å¦æä½ éè¦ä½¿ç¨<literal>hbm2ddl</literal>å·¥å
·æè¿ä¸ªæ¥éª¤èªå¨åï¼è¯·åé
<xref linkend="toolsetguide"/>ãè¿ä¸ªå·¥å
·è½å¤å建å®æ´çSQL DDLï¼å
æ¬è¡¨å®ä¹ï¼èªå®ä¹çå段类å约æï¼æä¸çº¦æåç´¢å¼ã
+ </para>
+
+ </sect1>
+
+ <sect1 id="quickstart-playingwithcats" revision="2">
+ <title>ä¸Catåä¹</title>
+
+ <para>
+ æ们ç°å¨å¯ä»¥å¼å§Hibernateç<literal>Session</literal>äºãå®æ¯ä¸ä¸ª<emphasis>æä¹
å管çå¨</emphasis>ï¼æ们éè¿å®æ¥ä»æ°æ®åºä¸åå<literal>Cat</literal>ãé¦å
ï¼æ们è¦ä»<literal>SessionFactory</literal>ä¸è·åä¸ä¸ª<literal>Session</literal>ï¼Hibernateçå·¥ä½åå
ï¼ã
+ </para>
+
+ <programlisting><![CDATA[SessionFactory sessionFactory =
+ new Configuration().configure().buildSessionFactory();]]></programlisting>
+
+ <para>
+ éè¿å¯¹<literal>configure()</literal>çè°ç¨æ¥è£
è½½<literal>hibernate.cfg.xml</literal>é
ç½®æ件,并åå§åè¿ä¸ª<literal>Configuration</literal>å®ä¾ã
+ å¨å建 <literal>SessionFactory</literal><emphasis>ä¹å</emphasis>ï¼å®æ¯ä¸å¯åçï¼ï¼ä½ å¯ä»¥è®¿é®<literal>Configuration</literal>æ¥è®¾ç½®å
¶ä»å±æ§ï¼çè³ä¿®æ¹æ å°çå
æ°æ®ï¼ãæ们åºè¯¥å¨åªå¿å建<literal>SessionFactory</literal>ï¼å¨æ们çç¨åºä¸åå¦ä½è®¿é®å®å¢ï¼
+ <literal>SessionFactory</literal>é常åªæ¯è¢«åå§åä¸æ¬¡ï¼æ¯å¦è¯´éè¿ä¸ä¸ª<emphasis>load-on-startup</emphasis> servletçæ¥åå§åãè¿æå³çä½ ä¸åºè¯¥å¨serlvetä¸æå®ä½ä¸ºä¸ä¸ªå®ä¾åéæ¥ææï¼èåºè¯¥æ¾å¨å
¶ä»å°æ¹ãè¿ä¸æ¥ç说ï¼æ们éè¦ä½¿ç¨<emphasis>åä¾ï¼Singletonï¼</emphasis>模å¼ï¼æ们æè½æ´å®¹æçå¨ç¨åºä¸è®¿é®<literal>SessionFactory</literal>ãä¸é¢çæ¹æ³å°±åæ¶è§£å³äºä¸¤ä¸ªé®é¢ï¼å¯¹<literal>SessionFactory</literal>çåå§é
ç½®ä¸ä¾¿æ·ä½¿ç¨ã
+ </para>
+
+ <para>
+ æ们å®ç°ä¸ä¸ª<literal>HibernateUtil</literal>è¾
å©ç±»ï¼
+ </para>
+
+
+ <programlisting><![CDATA[import org.hibernate.*;
+import org.hibernate.cfg.*;
+
+public class HibernateUtil {
+
+ private static Logger log = LoggerFactory.getLogger(HibernateUtil.class);
+
+ private static final SessionFactory sessionFactory;
+
+ static {
+ try {
+ // Create the SessionFactory
+ sessionFactory = new Configuration().configure().buildSessionFactory();
+ } catch (Throwable ex) {
+ // Make sure you log the exception, as it might be swallowed
+ log.error("Initial SessionFactory creation failed.", ex);
+ throw new ExceptionInInitializerError(ex);
+ }
+ }
+
+ public static final ThreadLocal session = new ThreadLocal();
+
+ public static Session currentSession() {
+ Session s = (Session) session.get();
+ // Open a new Session, if this Thread has none yet
+ if (s == null) {
+ s = sessionFactory.openSession();
+ session.set(s);
+ }
+ return s;
+ }
+
+ public static void closeSession() {
+ Session s = (Session) session.get();
+ if (s != null)
+ s.close();
+ session.set(null);
+ }
+}]]></programlisting>
+
+ <para>
+ è¿ä¸ªç±»ä¸ä½å¨å®çéæåå§å¨ä¸ä½¿ç¨äº<literal>SessionFactory</literal>ï¼è¿ä½¿ç¨äºä¸ä¸ª<literal>ThreadLocal</literal>åéæ¥ä¿å<literal>Session</literal>å为å½åå·¥ä½çº¿ç¨ãå¨ä½ 使ç¨è¿ä¸ªè¾
å©ç±»ä¹åï¼è¯·ç¡®ä¿ä½ ç解äºthread-localåéè¿ä¸ªJavaæ¦å¿µãä½ å¯ä»¥å¨<literal>CaveatEmptor</literal>(http://caveatemptor.hibernate.org/)ä¸æ¾å°ä¸ä¸ªæ´å å¤æå强大ç <literal>HibernateUtil</literal>ã
+ </para>
+
+ <para>
+ <literal>SessionFactory</literal>æ¯å®å
¨çº¿ç¨ï¼å¯ä»¥ç±å¾å¤çº¿ç¨å¹¶å访é®å¹¶è·åå°<literal>Sessions</literal>ãå个<literal>Session</literal>ä¸æ¯å®å
¨çº¿ç¨å¯¹è±¡ï¼å®åªä»£è¡¨ä¸æ°æ®åºä¹é´çä¸æ¬¡æä½ã<literal>Session</literal>éè¿<literal>SessionFactory</literal>è·å¾å¹¶å¨ææçå·¥ä½å®æåå
³éãå¨ä½ servletç<literal>process()</literal>ä¸å¯ä»¥è±¡æ¯è¿ä¹åç(çç¥äºå¼å¸¸æ
åµå¤ç):
+ </para>
+
+ <programlisting><![CDATA[Session session = HibernateUtil.currentSession();
+
+Transaction tx= session.beginTransaction();
+
+Cat princess = new Cat();
+princess.setName("Princess");
+princess.setSex('F');
+princess.setWeight(7.4f);
+
+session.save(princess);
+tx.commit();
+
+HibernateUtil.closeSession();]]></programlisting>
+
+ <para>
+ å¨ä¸ä¸ª<literal>Session</literal>ä¸ï¼æ¯ä¸ªæ°æ®åºæä½é½æ¯å¨ä¸ä¸ªäºå¡(transaction)ä¸è¿è¡çï¼è¿æ ·å°±å¯ä»¥é离å¼ä¸åçæä½ï¼çè³å
æ¬åªè¯»æä½ï¼ãæ们使ç¨Hibernateç<literal>Transaction</literal> APIæ¥ä»åºå±çäºå¡çç¥ä¸ï¼æ¬ä¾ä¸æ¯JDBCäºå¡ï¼è±èº«åºæ¥ãè¿æ ·ï¼æ们就ä¸éè¦æ´æ¹ä»»ä½æºä»£ç ï¼å°±å¯ä»¥ææ们çç¨åºé¨ç½²å°ä¸ä¸ªç±å®¹å¨ç®¡çäºå¡çç¯å¢ä¸å»ï¼ä½¿ç¨JTAï¼ã
+
+ </para>
+
+ <para>
+ è¿æ ·ä½ å°±å¯ä»¥éå¿æ欲çå¤æ¬¡è°ç¨<literal>HibernateUtil.currentSession();</literal>ï¼ä½ æ¯æ¬¡é½ä¼å¾å°åä¸ä¸ªå½å线ç¨ç<literal>Session</literal>ãä¸ç®¡æ¯å¨ä½ çservlet代ç ä¸ï¼æè
å¨servlet filterä¸è¿æ¯å¨HTTPç»æè¿åä¹åï¼ä½ é½å¿
须确ä¿è¿ä¸ª<literal>Session</literal>å¨ä½ çæ°æ®åºè®¿é®å·¥ä½å®æåå
³éãè¿æ ·åè¿æä¸ä¸ªå¥½å¤å°±æ¯å¯ä»¥å®¹æç使ç¨å»¶è¿è£
è½½ï¼lazy initializationï¼ï¼<literal>Session</literal>å¨æ¸²æviewå±çæ¶åä»ç¶æå¼ççï¼æä»¥ä½ å¨éåå½å对象å¾çæ¶åå¯ä»¥è£
è½½æéç对象ã
+ </para>
+
+ <para>
+ Hibernateæä¸åçæ¹æ³ç¨æ¥ä»æ°æ®åºä¸åå对象ãæçµæ´»çæ¹å¼å°±æ¯ä½¿ç¨Hibernateæ¥è¯¢è¯è¨(HQL),è¿æ¯ä¸ç§å®¹æå¦ä¹ çè¯è¨ï¼æ¯å¯¹SQLçé¢å对象ç强大æ©å±ã
+ </para>
+
+ <programlisting><![CDATA[Transaction tx= session.beginTransaction();
+
+Query query = session.createQuery("select c from Cat as c where c.sex = :sex");
+query.setCharacter("sex", 'F');
+for (Iterator it = query.iterate(); it.hasNext();) {
+ Cat cat = (Cat) it.next();
+ out.println("Female Cat: " + cat.getName() );
+}
+
+tx.commit();]]></programlisting>
+
+ <para>
+ Hibernateä¹æä¾ä¸ç§é¢å对象ç<emphasis>ææ¡ä»¶æ¥è¯¢</emphasis>APIï¼å¯ä»¥æ§è¡ç®æ´å®å
¨ç±»åçæ¥è¯¢ãå½ç¶ï¼Hibernateå¨ææä¸æ°æ®åºç交äºä¸é½ä½¿ç¨<literal>PrepatedStatement</literal>ååæ°ç»å®ãä½ ä¹å¯ä»¥ä½¿ç¨Hibernateçç´æ¥SQLæ¥è¯¢ç¹æ§ï¼æè
å¨ç¹æ®æ
åµä¸ä»<literal>Session</literal>è·åä¸ä¸ªåå§çJDBCè¿æ¥ã
+ </para>
+
+ </sect1>
+
+ <sect1 id="quickstart-summary" revision="1">
+ <title>ç»è¯</title>
+
+ <para>
+ å¨è¿ä¸ªçå°çæç¨ä¸ï¼æ们对Hibernateæµ
å°å³æ¢ã请注ææ们没æå¨ä¾åä¸å
å«ä»»ä½servletç¸å
³ä»£ç ãä½ å¿
é¡»èªè¡ç¼åservletï¼å¹¶æå
¥éåä½ çHibernate代ç ã
+ </para>
+
+ <para>
+ 请记ä½Hibernateä½ä¸ºä¸ä¸ªæ°æ®åºè®¿é®å±ï¼æ¯ä¸ä½ çç¨åºç´§å¯ç¸å
³çãé常æ
åµä¸ï¼ææå
¶ä»å±æ¬¡é½ä¾èµæä¹
æºå¶ãè¯·ç¡®ä¿¡ä½ ç解äºè¿ç§è®¾è®¡çå
涵ã
+ </para>
+
+ <para>
+ è¥å¸æå¦ä¹ æ´å¤æçä¾å,请åé
http://caveatemptor.hibernate.org/ ãå¨ http://www.hibernate.org/Documentation ä¹å¯ä»¥å¾å°å
¶ä»æç¨çé¾æ¥ã
+
+ </para>
+
+ </sect1>
+
+</chapter>
\ No newline at end of file
Copied: core/trunk/documentation/manual/zh-CN/src/main/docbook/content/session_api.xml (from rev 14080, core/trunk/documentation/manual/zh-CN/src/main/docbook/modules/session_api.xml)
===================================================================
--- core/trunk/documentation/manual/zh-CN/src/main/docbook/content/session_api.xml (rev 0)
+++ core/trunk/documentation/manual/zh-CN/src/main/docbook/content/session_api.xml 2007-10-09 20:10:34 UTC (rev 14081)
@@ -0,0 +1,1117 @@
+<chapter id="objectstate">
+
+ <title>ä¸å¯¹è±¡å
±äº</title>
+
+ <para>
+ Hibernateæ¯å®æ´ç对象/å
³ç³»æ å°è§£å³æ¹æ¡ï¼å®æä¾äºå¯¹è±¡<emphasis>ç¶æ管ç(state management)</emphasis>çåè½ï¼ä½¿å¼åè
ä¸åéè¦çä¼åºå±æ°æ®åºç³»ç»çç»èã
+ ä¹å°±æ¯è¯´ï¼ç¸å¯¹äºå¸¸è§çJDBC/SQLæä¹
å±æ¹æ¡ä¸éè¦<literal>管çSQLè¯å¥</literal>ï¼Hibernateéç¨äºæ´èªç¶çé¢å对象çè§è§æ¥æä¹
åJavaåºç¨ä¸çæ°æ®ã
+ </para>
+
+
+ <para>
+ æ¢å¥è¯è¯´ï¼ä½¿ç¨Hibernateçå¼åè
åºè¯¥æ»æ¯å
³æ³¨å¯¹è±¡ç<emphasis>ç¶æ(state)</emphasis>ï¼ä¸å¿
èèSQLè¯å¥çæ§è¡ã
+ è¿é¨åç»èå·²ç»ç±Hibernateæ管妥å½ï¼åªæå¼åè
å¨è¿è¡ç³»ç»æ§è½è°ä¼çæ¶åæéè¦è¿è¡äºè§£ã
+ </para>
+
+ <sect1 id="objectstate-overview">
+
+ <title>Hibernate对象ç¶æ(object states)</title>
+
+
+ <para>
+ Hibernateå®ä¹å¹¶æ¯æä¸å对象ç¶æ(state):
+ </para>
+
+ <itemizedlist>
+ <listitem>
+
+ <para>
+ <emphasis>ç¬æ¶(Transient)</emphasis> - ç±<literal>new</literal>æä½ç¬¦å建ï¼ä¸å°æªä¸Hibernate <literal>Session</literal>
+ å
³èç对象被认å®ä¸ºç¬æ¶(Transient)çãç¬æ¶(Transient)对象ä¸ä¼è¢«æä¹
åå°æ°æ®åºä¸ï¼ä¹ä¸ä¼è¢«èµäºæä¹
åæ è¯(identifier)ã
+ å¦æç¬æ¶(Transient)对象å¨ç¨åºä¸æ²¡æ被å¼ç¨ï¼å®ä¼è¢«åå¾åæ¶å¨(garbage collector)éæ¯ã
+ 使ç¨Hibernate <literal>Session</literal>å¯ä»¥å°å
¶å为æä¹
(Persistent)ç¶æã(Hibernateä¼èªå¨æ§è¡å¿
è¦çSQLè¯å¥)
+ </para>
+
+ </listitem>
+ <listitem>
+
+ <para>
+ <emphasis>æä¹
(Persistent)</emphasis> - æä¹
(Persistent)çå®ä¾å¨æ°æ®åºä¸æ对åºçè®°å½ï¼å¹¶æ¥æä¸ä¸ªæä¹
åæ è¯(identifier)ã
+ æä¹
(Persistent)çå®ä¾å¯è½æ¯å被ä¿åçï¼æå被å è½½çï¼æ 论åªä¸ç§ï¼æå®ä¹ï¼å®åå¨äºç¸å
³èç<literal>Session</literal>ä½ç¨èå´å
ã
+ Hibernateä¼æ£æµå°å¤äºæä¹
(Persistent)ç¶æç对象çä»»ä½æ¹å¨ï¼å¨å½åæä½åå
(unit of work)æ§è¡å®æ¯æ¶å°å¯¹è±¡æ°æ®(state)ä¸æ°æ®åºåæ¥(synchronize)ã
+ å¼åè
ä¸éè¦æå¨æ§è¡<literal>UPDATE</literal>ãå°å¯¹è±¡ä»æä¹
(Persistent)ç¶æåæç¬æ¶(Transient)ç¶æåæ ·ä¹ä¸éè¦æå¨æ§è¡<literal>DELETE</literal>è¯å¥ã
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ <emphasis>è±ç®¡(Detached)</emphasis> - ä¸æä¹
(Persistent)对象å
³èç<literal>Session</literal>被å
³éåï¼å¯¹è±¡å°±å为è±ç®¡(Detached)çã
+ 对è±ç®¡(Detached)对象çå¼ç¨ä¾ç¶ææï¼å¯¹è±¡å¯ç»§ç»è¢«ä¿®æ¹ãè±ç®¡(Detached)对象å¦æéæ°å
³èå°æ个æ°ç<literal>Session</literal>ä¸ï¼
+ ä¼å次转å为æä¹
(Persistent)ç(å¨Detachedå
¶é´çæ¹å¨å°è¢«æä¹
åå°æ°æ®åº)ã
+ è¿ä¸ªåè½ä½¿å¾ä¸ç§ç¼ç¨æ¨¡åï¼å³ä¸é´ä¼ç»ç¨æ·æèæ¶é´(user think-time)çé¿æ¶é´è¿è¡çæä½åå
(unit of work)çç¼ç¨æ¨¡åæ为å¯è½ã
+ æ们称ä¹ä¸º<emphasis>åºç¨ç¨åºäºå¡</emphasis>ï¼å³ä»ç¨æ·è§ç¹çæ¯ä¸ä¸ªæä½åå
(unit of work)ã
+ </para>
+
+ </listitem>
+ </itemizedlist>
+
+ <para>
+ æ¥ä¸æ¥æ们æ¥ç»è´ç讨论ä¸ç¶æ(states)åç¶æé´ç转æ¢(state transitions)ï¼ä»¥å触åç¶æ转æ¢çHibernateæ¹æ³ï¼ã
+ </para>
+
+ </sect1>
+
+ <sect1 id="objectstate-makingpersistent" revision="1">
+ <title>使对象æä¹
å</title>
+
+ <para>
+ Hibernate认为æä¹
åç±»(persistent class)æ°å®ä¾åç对象æ¯<emphasis>ç¬æ¶(Transient)</emphasis>çã
+ æ们å¯éè¿å°ç¬æ¶(Transient)对象ä¸sessionå
³èèæå®å为<emphasis>æä¹
(Persistent)</emphasis>çã
+ </para>
+
+ <programlisting><![CDATA[DomesticCat fritz = new DomesticCat();
+fritz.setColor(Color.GINGER);
+fritz.setSex('M');
+fritz.setName("Fritz");
+Long generatedId = (Long) sess.save(fritz);]]></programlisting>
+
+ <para>
+ å¦æ<literal>Cat</literal>çæä¹
åæ è¯(identifier)æ¯<literal>generated</literal>ç±»åçï¼
+ é£ä¹è¯¥æ è¯(identifier)ä¼èªå¨å¨<literal>save()</literal>被è°ç¨æ¶äº§ç并åé
ç»<literal>cat</literal>ã
+ å¦æ<literal>Cat</literal>çæä¹
åæ è¯(identifier)æ¯<literal>assigned</literal>ç±»åçï¼ææ¯ä¸ä¸ªå¤å主é®(composite key)ï¼
+ é£ä¹è¯¥æ è¯(identifier)åºå½å¨è°ç¨<literal>save()</literal>ä¹åæå¨èµäºç»<literal>cat</literal>ã
+ ä½ ä¹å¯ä»¥æç
§EJB3 early draftä¸å®ä¹çè¯ä¹ï¼ä½¿ç¨<literal>persist()</literal>æ¿ä»£<literal>save()</literal>ã
+ </para>
+
+
+ <para>
+ æ¤å¤ï¼ä½ å¯ä»¥ç¨ä¸ä¸ªéè½½çæ¬ç<literal>save()</literal>æ¹æ³ã
+ </para>
+
+<programlisting><![CDATA[DomesticCat pk = new DomesticCat();
+pk.setColor(Color.TABBY);
+pk.setSex('F');
+pk.setName("PK");
+pk.setKittens( new HashSet() );
+pk.addKitten(fritz);
+sess.save( pk, new Long(1234) );]]></programlisting>
+
+
+ <para>
+ å¦æä½ æä¹
åç对象æå
³èç对象(associated objects)ï¼ä¾å¦ä¸ä¾ä¸ç<literal>kittens</literal>éåï¼
+ é£ä¹å¯¹è¿äºå¯¹è±¡ï¼è¯æ³¨ï¼pkåkittensï¼è¿è¡æä¹
åç顺åºæ¯ä»»æçï¼ä¹å°±æ¯è¯´å¯ä»¥å
对kittensè¿è¡æä¹
åä¹å¯ä»¥å
对pkè¿è¡æä¹
åï¼ï¼
+ é¤éä½ å¨å¤é®åä¸æ<literal>NOT NULL</literal>约æã
+ Hibernateä¸ä¼è¿åå¤é®çº¦æï¼ä½æ¯å¦æä½ ç¨é误ç顺åºæä¹
å对象ï¼è¯æ³¨ï¼å¨pkæä¹
åä¹åæä¹
åkittenï¼ï¼é£ä¹å¯è½ä¼è¿å<literal>NOT NULL</literal>约æã
+ </para>
+
+ <para>
+ éå¸¸ä½ ä¸ä¼ä¸ºè¿äºç»èç¦å¿ï¼å ä¸ºä½ å¾å¯è½ä¼ä½¿ç¨Hibernateç
+ <emphasis>ä¼ ææ§æä¹
å(transitive persistence)</emphasis>åè½èªå¨ä¿åç¸å
³èé£äºå¯¹è±¡ã
+ è¿æ ·è¿è¿å<literal>NOT NULL</literal>约æçæ
åµé½ä¸ä¼åºç°äº - Hibernateä¼ç®¡å¥½ææçäºæ
ã
+ ä¼ ææ§æä¹
å(transitive persistence)å°å¨æ¬ç« ç¨å讨论ã
+ </para>
+
+ </sect1>
+
+ <sect1 id="objectstate-loading">
+ <title>è£
载对象</title>
+ <para>
+ å¦æä½ ç¥éæ个å®ä¾çæä¹
åæ è¯(identifier)ï¼ä½ å°±å¯ä»¥ä½¿ç¨<literal>Session</literal>ç<literal>load()</literal>æ¹æ³
+ æ¥è·åå®ã <literal>load()</literal>çå¦ä¸ä¸ªåæ°æ¯æå®ç±»ç.class对象ã
+ æ¬æ¹æ³ä¼å建æå®ç±»çæä¹
åå®ä¾ï¼å¹¶ä»æ°æ®åºå è½½å
¶æ°æ®(state)ã
+ </para>
+
+ <programlisting><![CDATA[Cat fritz = (Cat) sess.load(Cat.class, generatedId);]]></programlisting>
+
+<programlisting><![CDATA[// you need to wrap primitive identifiers
+long id = 1234;
+DomesticCat pk = (DomesticCat) sess.load( DomesticCat.class, new Long(id) );]]></programlisting>
+
+ <para>
+ æ¤å¤, ä½ å¯ä»¥ææ°æ®(state)å è½½å°æå®ç对象å®ä¾ä¸ï¼è¦çæ该å®ä¾åæ¥çæ°æ®ï¼ã
+ </para>
+
+<programlisting><![CDATA[Cat cat = new DomesticCat();
+// load pk's state into cat
+sess.load( cat, new Long(pkId) );
+Set kittens = cat.getKittens();]]></programlisting>
+
+
+ <para>
+ 请注æå¦æ没æå¹é
çæ°æ®åºè®°å½ï¼<literal>load()</literal>æ¹æ³å¯è½æåºæ æ³æ¢å¤çå¼å¸¸(unrecoverable exception)ã
+ å¦æç±»çæ å°ä½¿ç¨äºä»£ç(proxy)ï¼<literal>load()</literal>æ¹æ³ä¼è¿åä¸ä¸ªæªåå§åç代çï¼ç´å°ä½ è°ç¨è¯¥ä»£ççææ¹æ³æ¶æä¼å»è®¿é®æ°æ®åºã
+ è¥ä½ å¸æå¨æ对象ä¸å建ä¸ä¸ªæåå¦ä¸ä¸ªå¯¹è±¡çå
³èï¼åä¸æ³å¨ä»æ°æ®åºä¸è£
载该对象æ¶åæ¶è£
è½½ç¸å
³èçé£ä¸ªå¯¹è±¡ï¼é£ä¹è¿ç§æä½æ¹å¼å°±ç¨å¾ä¸çäºã
+ å¦æ为ç¸åºç±»æ å°å
³ç³»è®¾ç½®äº<literal>batch-size</literal>ï¼
+ é£ä¹ä½¿ç¨è¿ç§æä½æ¹å¼å
许å¤ä¸ªå¯¹è±¡è¢«ä¸æ¹è£
è½½ï¼å 为è¿åçæ¯ä»£çï¼æ éä»æ°æ®åºä¸æåææ对象çæ°æ®ï¼ã
+ </para>
+
+
+ <para>
+ å¦æä½ ä¸ç¡®å®æ¯å¦æå¹é
çè¡åå¨ï¼åºè¯¥ä½¿ç¨<literal>get()</literal>æ¹æ³ï¼å®ä¼ç«å»è®¿é®æ°æ®åºï¼å¦æ没æ对åºçè®°å½ï¼ä¼è¿ånullã
+ </para>
+
+ <programlisting><![CDATA[Cat cat = (Cat) sess.get(Cat.class, id);
+if (cat==null) {
+ cat = new Cat();
+ sess.save(cat, id);
+}
+return cat;]]></programlisting>
+
+ <para>
+ ä½ çè³å¯ä»¥éç¨æ个<literal>LockMode</literal>ï¼ç¨SQLç<literal>SELECT ... FOR UPDATE</literal>è£
载对象ã
+ 请æ¥é
APIæ档以è·åæ´å¤ä¿¡æ¯ã
+ </para>
+
+ <programlisting><![CDATA[Cat cat = (Cat) sess.get(Cat.class, id, LockMode.UPGRADE);]]></programlisting>
+
+
+ <para>
+ 注æï¼ä»»ä½å
³èç对象æè
å
å«çéåé½<emphasis>ä¸ä¼</emphasis>被以<literal>FOR UPDATE</literal>æ¹å¼è¿åï¼
+ é¤éä½ æå®äº<literal>lock</literal>æè
<literal>all</literal>ä½ä¸ºå
³è(association)ç级èé£æ ¼(cascade style)ã
+ </para>
+
+
+ <para>
+ ä»»ä½æ¶åé½å¯ä»¥ä½¿ç¨<literal>refresh()</literal>æ¹æ³å¼ºè¿«è£
载对象åå®çéåãå¦æä½ ä½¿ç¨æ°æ®åºè§¦åå¨åè½æ¥å¤ç对象çæäºå±æ§ï¼è¿ä¸ªæ¹æ³å°±å¾æç¨äºã
+ </para>
+
+ <programlisting><![CDATA[sess.save(cat);
+sess.flush(); //force the SQL INSERT
+sess.refresh(cat); //re-read the state (after the trigger executes)]]></programlisting>
+
+
+ <para>
+ æ¤å¤é常ä¼åºç°ä¸ä¸ªéè¦é®é¢: Hibernateä¼ä»æ°æ®åºä¸è£
è½½å¤å°ä¸è¥¿ï¼ä¼æ§è¡å¤å°æ¡ç¸åºçSQL<literal>SELECT</literal>è¯å¥ï¼
+ è¿åå³äº<emphasis>æåçç¥(fetching strategy)</emphasis>ï¼ä¼å¨<xref linkend="performance-fetching"/>ä¸è§£éã
+ </para>
+
+ </sect1>
+
+ <sect1 id="objectstate-querying" revision="1">
+ <title>æ¥è¯¢</title>
+ <para>
+ å¦æä¸ç¥éæè¦å¯»æ¾ç对象çæä¹
åæ è¯ï¼é£ä¹ä½ éè¦ä½¿ç¨æ¥è¯¢ãHibernateæ¯æ强大ä¸æäºä½¿ç¨çé¢å对象æ¥è¯¢è¯è¨(HQL)ã
+ å¦æå¸æéè¿ç¼ç¨çæ¹å¼å建æ¥è¯¢ï¼Hibernateæä¾äºå®åçææ¡ä»¶(Query By Criteria, QBC)以åææ ·ä¾(Query By Example, QBE)è¿è¡æ¥è¯¢çåè½ã
+ ä½ ä¹å¯ä»¥ç¨åçSQL(native SQL)æè¿°æ¥è¯¢ï¼Hibernateé¢å¤æä¾äºå°ç»æé(result set)转å为对象çæ¯æã
+ </para>
+
+ <sect2 id="objectstate-querying-executing" revision="1">
+ <title>æ§è¡æ¥è¯¢</title>
+
+ <para>
+ HQLååçSQL(native SQL)æ¥è¯¢è¦éè¿ä¸º<literal>org.hibernate.Query</literal>çå®ä¾æ¥è¡¨è¾¾ã
+ è¿ä¸ªæ¥å£æä¾äºåæ°ç»å®ãç»æéå¤ç以åè¿è¡å®é
æ¥è¯¢çæ¹æ³ã
+ ä½ æ»æ¯å¯ä»¥éè¿å½å<literal>Session</literal>è·åä¸ä¸ª<literal>Query</literal>对象ï¼
+ </para>
+
+ <programlisting><![CDATA[List cats = session.createQuery(
+ "from Cat as cat where cat.birthdate < ?")
+ .setDate(0, date)
+ .list();
+
+List mothers = session.createQuery(
+ "select mother from Cat as cat join cat.mother as mother where cat.name = ?")
+ .setString(0, name)
+ .list();
+
+List kittens = session.createQuery(
+ "from Cat as cat where cat.mother = ?")
+ .setEntity(0, pk)
+ .list();
+
+Cat mother = (Cat) session.createQuery(
+ "select cat.mother from Cat as cat where cat = ?")
+ .setEntity(0, izi)
+ .uniqueResult();]]
+
+Query mothersWithKittens = (Cat) session.createQuery(
+ "select mother from Cat as mother left join fetch mother.kittens");
+Set uniqueMothers = new HashSet(mothersWithKittens.list());]]></programlisting>
+
+
+ <para>
+ ä¸ä¸ªæ¥è¯¢é常å¨è°ç¨<literal>list()</literal>æ¶è¢«æ§è¡ï¼æ§è¡ç»æä¼å®å
¨è£
è½½è¿å
åä¸çä¸ä¸ªéå(collection)ã
+ æ¥è¯¢è¿åç对象å¤äºæä¹
(persistent)ç¶æãå¦æä½ ç¥éçæ¥è¯¢åªä¼è¿åä¸ä¸ªå¯¹è±¡ï¼å¯ä½¿ç¨<literal>list()</literal>çå¿«æ·æ¹å¼<literal>uniqueResult()</literal>ã
+ 注æï¼ä½¿ç¨éåé¢å
æåçæ¥è¯¢å¾å¾ä¼è¿åå¤æ¬¡æ ¹å¯¹è±¡ï¼ä»ä»¬çéåç±»é½è¢«åå§åäºï¼ãä½ å¯ä»¥éè¿ä¸ä¸ªéåæ¥è¿æ»¤è¿äºéå¤å¯¹è±¡ã
+ </para>
+
+ <sect3 id="objectstate-querying-executing-iterate">
+
+ <title>è¿ä»£å¼è·åç»æ(Iterating results)</title>
+
+ <para>
+ æäºæ
åµä¸ï¼ä½ å¯ä»¥ä½¿ç¨<literal>iterate()</literal>æ¹æ³å¾å°æ´å¥½çæ§è½ã
+ è¿é常æ¯ä½ é¢æè¿åçç»æå¨sessionï¼æäºçº§ç¼å(second-level cache)ä¸å·²ç»åå¨æ¶çæ
åµã
+ å¦è¥ä¸ç¶ï¼<literal>iterate()</literal>ä¼æ¯<literal>list()</literal>æ
¢ï¼èä¸å¯è½ç®åæ¥è¯¢ä¹éè¦è¿è¡å¤æ¬¡æ°æ®åºè®¿é®ï¼
+ <literal>iterate()</literal>ä¼é¦å
使ç¨<emphasis>1</emphasis>æ¡è¯å¥å¾å°ææ对象çæä¹
åæ è¯(identifiers)ï¼åæ ¹æ®æä¹
åæ è¯æ§è¡<emphasis>n</emphasis>æ¡éå çselectè¯å¥å®ä¾åå®é
ç对象ã
+ </para>
+
+ <programlisting><![CDATA[// fetch ids
+Iterator iter = sess.createQuery("from eg.Qux q order by q.likeliness").iterate();
+while ( iter.hasNext() ) {
+ Qux qux = (Qux) iter.next(); // fetch the object
+ // something we couldnt express in the query
+ if ( qux.calculateComplicatedAlgorithm() ) {
+ // delete the current instance
+ iter.remove();
+ // dont need to process the rest
+ break;
+ }
+}]]></programlisting>
+ </sect3>
+
+ <sect3 id="objectstate-querying-executing-tuples">
+ <title>è¿åå
ç»(tuples)çæ¥è¯¢</title>
+
+ <para>
+ ï¼è¯æ³¨ï¼å
ç»(tuples)æä¸æ¡ç»æè¡å
å«å¤ä¸ªå¯¹è±¡ï¼
+ Hibernateæ¥è¯¢ææ¶è¿åå
ç»(tuples)ï¼æ¯ä¸ªå
ç»(tuples)以æ°ç»çå½¢å¼è¿å:
+ </para>
+
+ <programlisting><![CDATA[Iterator kittensAndMothers = sess.createQuery(
+ "select kitten, mother from Cat kitten join kitten.mother mother")
+ .list()
+ .iterator();
+
+while ( kittensAndMothers.hasNext() ) {
+ Object[] tuple = (Object[]) kittensAndMothers.next();
+ Cat kitten = (Cat) tuple[0];
+ Cat mother = (Cat) tuple[1];
+ ....
+}]]></programlisting>
+
+ </sect3>
+
+ <sect3 id="objectstate-querying-executing-scalar" revision="1">
+ <title>æ é(Scalar)ç»æ</title>
+
+ <para>
+ æ¥è¯¢å¯å¨<literal>select</literal>ä»å¥ä¸æå®ç±»çå±æ§ï¼çè³å¯ä»¥è°ç¨SQLç»è®¡(aggregate)å½æ°ã
+ å±æ§æç»è®¡ç»æ被认å®ä¸º"æ é(Scalar)"çç»æï¼èä¸æ¯æä¹
(persistent state)çå®ä½ï¼ã
+ </para>
+
+ <programlisting><![CDATA[Iterator results = sess.createQuery(
+ "select cat.color, min(cat.birthdate), count(cat) from Cat cat " +
+ "group by cat.color")
+ .list()
+ .iterator();
+
+while ( results.hasNext() ) {
+ Object[] row = (Object[]) results.next();
+ Color type = (Color) row[0];
+ Date oldest = (Date) row[1];
+ Integer count = (Integer) row[2];
+ .....
+}]]></programlisting>
+
+ </sect3>
+
+ <sect3 id="objectstate-querying-executing-parameters">
+ <title>ç»å®åæ°</title>
+
+ <para>
+ æ¥å£<literal>Query</literal>æä¾äºå¯¹å½ååæ°(named parameters)ãJDBCé£æ ¼ç<literal>é®å·(?)</literal>åæ°è¿è¡ç»å®çæ¹æ³ã
+ <emphasis>ä¸åäºJDBCï¼Hibernate对åæ°ä»0å¼å§è®¡æ°ã</emphasis>
+ å½ååæ°(named parameters)å¨æ¥è¯¢å符串ä¸æ¯å½¢å¦<literal>:name</literal>çæ è¯ç¬¦ã
+ å½ååæ°(named parameters)çä¼ç¹æ¯:
+ </para>
+
+ <itemizedlist spacing="compact">
+ <listitem>
+ <para>
+ å½ååæ°(named parameters)ä¸å
¶å¨æ¥è¯¢ä¸²ä¸åºç°ç顺åºæ å
³
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ å®ä»¬å¯å¨åä¸æ¥è¯¢ä¸²ä¸å¤æ¬¡åºç°
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ å®ä»¬æ¬èº«æ¯èªæ说æç
+ </para>
+ </listitem>
+ </itemizedlist>
+
+ <programlisting><![CDATA[//named parameter (preferred)
+Query q = sess.createQuery("from DomesticCat cat where cat.name = :name");
+q.setString("name", "Fritz");
+Iterator cats = q.iterate();]]></programlisting>
+
+ <programlisting><![CDATA[//positional parameter
+Query q = sess.createQuery("from DomesticCat cat where cat.name = ?");
+q.setString(0, "Izi");
+Iterator cats = q.iterate();]]></programlisting>
+
+ <programlisting><![CDATA[//named parameter list
+List names = new ArrayList();
+names.add("Izi");
+names.add("Fritz");
+Query q = sess.createQuery("from DomesticCat cat where cat.name in (:namesList)");
+q.setParameterList("namesList", names);
+List cats = q.list();]]></programlisting>
+
+ </sect3>
+
+ <sect3 id="objectstate-querying-executing-pagination">
+ <title>å页</title>
+
+ <para>
+ å¦æä½ éè¦æå®ç»æéçèå´ï¼å¸æè¿åçæ大è¡æ°/æå¼å§çè¡æ°ï¼ï¼åºè¯¥ä½¿ç¨<literal>Query</literal>æ¥å£æä¾çæ¹æ³:
+ </para>
+
+ <programlisting><![CDATA[Query q = sess.createQuery("from DomesticCat cat");
+q.setFirstResult(20);
+q.setMaxResults(10);
+List cats = q.list();]]></programlisting>
+
+ <para>
+ Hibernate ç¥éå¦ä½å°è¿ä¸ªæéå®æ¡ä»¶çæ¥è¯¢è½¬æ¢æä½ çæ°æ®åºçåçSQL(native SQL)ã
+ </para>
+
+ </sect3>
+
+ <sect3 id="objectstate-querying-executing-scrolling">
+ <title>å¯æ»å¨éå(Scrollable iteration)</title>
+
+
+ <para>
+ å¦æä½ çJDBC驱å¨æ¯æå¯æ»å¨ç<literal>ResuleSet</literal>ï¼<literal>Query</literal>æ¥å£å¯ä»¥ä½¿ç¨<literal>ScrollableResults</literal>ï¼å
è®¸ä½ å¨æ¥è¯¢ç»æä¸çµæ´»æ¸¸èµ°ã
+ </para>
+
+ <programlisting><![CDATA[Query q = sess.createQuery("select cat.name, cat from DomesticCat cat " +
+ "order by cat.name");
+ScrollableResults cats = q.scroll();
+if ( cats.first() ) {
+
+ // find the first name on each page of an alphabetical list of cats by name
+ firstNamesOfPages = new ArrayList();
+ do {
+ String name = cats.getString(0);
+ firstNamesOfPages.add(name);
+ }
+ while ( cats.scroll(PAGE_SIZE) );
+
+ // Now get the first page of cats
+ pageOfCats = new ArrayList();
+ cats.beforeFirst();
+ int i=0;
+ while( ( PAGE_SIZE > i++ ) && cats.next() ) pageOfCats.add( cats.get(1) );
+
+}
+cats.close()]]></programlisting>
+
+ <para>
+ 请注æï¼ä½¿ç¨æ¤åè½éè¦ä¿ææ°æ®åºè¿æ¥ï¼ä»¥å游æ (cursor)ï¼å¤äºä¸ç´æå¼ç¶æã
+ å¦æä½ éè¦æå¼è¿æ¥ä½¿ç¨å页åè½ï¼è¯·ä½¿ç¨<literal>setMaxResult()</literal>/<literal>setFirstResult()</literal>
+ </para>
+
+ </sect3>
+
+ <sect3 id="objectstate-querying-executing-named" revision="1">
+ <title>å¤ç½®å½åæ¥è¯¢(Externalizing named queries)</title>
+
+ <para>
+ ä½ å¯ä»¥å¨æ å°æ件ä¸å®ä¹å½åæ¥è¯¢(named queries)ã
+ ï¼å¦æä½ çæ¥è¯¢ä¸²ä¸å
å«å¯è½è¢«è§£é为XMLæ è®°(markup)çå符ï¼å«å¿äºç¨<literal>CDATA</literal>å
裹起æ¥ãï¼
+ </para>
+
+ <programlisting><![CDATA[<query name="ByNameAndMaximumWeight"><![CDATA[
+ from eg.DomesticCat as cat
+ where cat.name = ?
+ and cat.weight > ?
+] ]></query>]]></programlisting>
+
+
+ <para>
+ åæ°ç»å®åæ§è¡ä»¥ç¼ç¨æ¹å¼(programatically)å®æï¼
+ </para>
+
+ <programlisting><![CDATA[Query q = sess.getNamedQuery("ByNameAndMaximumWeight");
+q.setString(0, name);
+q.setInt(1, minWeight);
+List cats = q.list();]]></programlisting>
+
+
+ <para>
+ 请注æå®é
çç¨åºä»£ç ä¸æç¨çæ¥è¯¢è¯è¨æ å
³ï¼ä½ ä¹å¯å¨å
æ°æ®ä¸å®ä¹åçSQL(native SQL)æ¥è¯¢ï¼
+ æå°åæçå
¶ä»çæ¥è¯¢è¯å¥æ¾å¨é
ç½®æ件ä¸ï¼è¿æ ·å°±å¯ä»¥è®©Hibernateç»ä¸ç®¡çï¼è¾¾å°è¿ç§»çç®çã
+ </para>
+
+ <para>
+
+ ä¹è¯·æ³¨æå¨<literal><hibernate-mapping></literal>å
ç´ ä¸å£°æçæ¥è¯¢å¿
é¡»æä¸ä¸ªå
¨å±å¯ä¸çåå,èå¨<literal><class></literal>å
ç´ ä¸å£°æçæ¥è¯¢èªå¨å
·æå
¨å±å,æ¯éè¿ç±»çå
¨åå 以éå®çãæ¯å¦<literal>eg.Cat.ByNameAndMaximumWeight</literal>ã
+ </para>
+
+ </sect3>
+
+ </sect2>
+
+ <sect2 id="objectstate-filtering" revision="1">
+ <title>è¿æ»¤éå</title>
+
+
+ <para>
+ éå<emphasis>è¿æ»¤å¨(filter)</emphasis>æ¯ä¸ç§ç¨äºä¸ä¸ªæä¹
åéåæè
æ°ç»çç¹æ®çæ¥è¯¢ãæ¥è¯¢å符串ä¸å¯ä»¥ä½¿ç¨<literal>"this"</literal>æ¥å¼ç¨éåä¸çå½åå
ç´ ã
+ </para>
+
+ <programlisting><![CDATA[Collection blackKittens = session.createFilter(
+ pk.getKittens(),
+ "where this.color = ?")
+ .setParameter( Color.BLACK, Hibernate.custom(ColorUserType.class) )
+ .list()
+);]]></programlisting>
+
+
+ <para>
+ è¿åçéåå¯ä»¥è¢«è®¤ä¸ºæ¯ä¸ä¸ªå
(bag, æ 顺åºå¯éå¤çéå(collection))ï¼å®æ¯æç»éåçå¯æ¬ã
+ åæ¥çéåä¸ä¼è¢«æ¹å¨ï¼è¿ä¸âè¿æ»¤å¨(filter)âçéå«çå«ä¹ä¸ç¬¦ï¼ä¸è¿ä¸æ们æå¾
çè¡ä¸ºä¸è´ï¼ã
+ </para>
+
+ <para>
+ 请注æè¿æ»¤å¨(filter)并ä¸éè¦<literal>from</literal>åå¥ï¼å½ç¶éè¦çè¯å®ä»¬ä¹å¯ä»¥å ä¸ï¼ãè¿æ»¤å¨(filter)ä¸éå®äºåªè½è¿åéåå
ç´ æ¬èº«ã
+ </para>
+
+ <programlisting><![CDATA[Collection blackKittenMates = session.createFilter(
+ pk.getKittens(),
+ "select this.mate where this.color = eg.Color.BLACK.intValue")
+ .list();]]></programlisting>
+
+ <para>
+ å³ä½¿æ æ¡ä»¶çè¿æ»¤å¨(filter)ä¹æ¯ææä¹çãä¾å¦ï¼ç¨äºå è½½ä¸ä¸ªå¤§éåçåéï¼
+ </para>
+
+ <programlisting><![CDATA[Collection tenKittens = session.createFilter(
+ mother.getKittens(), "")
+ .setFirstResult(0).setMaxResults(10)
+ .list();]]></programlisting>
+
+ </sect2>
+
+ <sect2 id="objecstate-querying-criteria" revision="1">
+ <title>æ¡ä»¶æ¥è¯¢(Criteria queries)</title>
+
+ <para>
+ HQLæ为强大ï¼ä½æ¯æäºäººå¸æè½å¤å¨æç使ç¨ä¸ç§é¢å对象APIå建æ¥è¯¢ï¼èéå¨ä»ä»¬çJava代ç ä¸åµå
¥å符串ã对äºé£é¨å人æ¥è¯´ï¼Hibernateæä¾äºç´è§ç<literal>Criteria</literal>æ¥è¯¢APIã
+ </para>
+
+ <programlisting><![CDATA[Criteria crit = session.createCriteria(Cat.class);
+crit.add( Restrictions.eq( "color", eg.Color.BLACK ) );
+crit.setMaxResults(10);
+List cats = crit.list();]]></programlisting>
+
+
+ <para>
+ <literal>Criteria</literal>以åç¸å
³ç<literal>æ ·ä¾(Example)</literal>APIå°ä¼å<xref linkend="querycriteria"/>ä¸è¯¦ç»è®¨è®ºã
+ </para>
+
+ </sect2>
+
+ <sect2 id="objectstate-querying-nativesql" revision="2">
+ <title>使ç¨åçSQLçæ¥è¯¢</title>
+
+
+ <para>
+ ä½ å¯ä»¥ä½¿ç¨<literal>createSQLQuery()</literal>æ¹æ³ï¼ç¨SQLæ¥æè¿°æ¥è¯¢ï¼å¹¶ç±Hibernateå°ç»æé转æ¢æ对象ã
+ 请注æï¼ä½ å¯ä»¥å¨ä»»ä½æ¶åè°ç¨<literal>session.connection()</literal>æ¥è·å¾å¹¶ä½¿ç¨JDBC <literal>Connection</literal>对象ã
+ å¦æä½ éæ©ä½¿ç¨HibernateçAPI, ä½ å¿
é¡»æSQLå«åç¨å¤§æ¬å·å
å´èµ·æ¥:
+ </para>
+
+ <programlisting><![CDATA[List cats = session.createSQLQuery("SELECT {cat.*} FROM CAT {cat} WHERE ROWNUM<10")
+ .addEntity("cat", Cat.class)
+.list();]]></programlisting>
+
+ <programlisting><![CDATA[List cats = session.createSQLQuery(
+ "SELECT {cat}.ID AS {cat.id}, {cat}.SEX AS {cat.sex}, " +
+ "{cat}.MATE AS {cat.mate}, {cat}.SUBCLASS AS {cat.class}, ... " +
+ "FROM CAT {cat} WHERE ROWNUM<10")
+ .addEntity("cat", Cat.class)
+.list()]]></programlisting>
+
+ <para>
+ åHibernateæ¥è¯¢ä¸æ ·ï¼SQLæ¥è¯¢ä¹å¯ä»¥å
å«å½ååæ°åå ä½åæ°ã
+ å¯ä»¥å¨<xref linkend="querysql"/>æ¾å°æ´å¤å
³äºHibernateä¸åçSQL(native SQL)çä¿¡æ¯ã
+ </para>
+
+ </sect2>
+
+ </sect1>
+
+ <sect1 id="objectstate-modifying" revision="1">
+ <title>ä¿®æ¹æä¹
对象</title>
+
+ <para>
+ <emphasis>äºå¡ä¸çæä¹
å®ä¾</emphasis>ï¼å°±æ¯éè¿<literal>session</literal>è£
è½½ãä¿åãå建æè
æ¥è¯¢åºç对象ï¼
+ 被åºç¨ç¨åºæä½æé æçä»»ä½ä¿®æ¹é½ä¼å¨<literal>Session</literal>被<emphasis>å·åºï¼flushedï¼</emphasis>çæ¶å被æä¹
åï¼æ¬ç« åé¢ä¼è¯¦ç»è®¨è®ºï¼ã
+ è¿éä¸éè¦è°ç¨æ个ç¹å®çæ¹æ³ï¼æ¯å¦<literal>update()</literal>ï¼è®¾è®¡å®çç®çæ¯ä¸åçï¼å°ä½ çä¿®æ¹æä¹
åã
+ æ以æç´æ¥çæ´æ°ä¸ä¸ªå¯¹è±¡çæ¹æ³å°±æ¯å¨<literal>Session</literal>å¤äºæå¼ç¶ææ¶<literal>load()</literal>å®ï¼ç¶åç´æ¥ä¿®æ¹å³å¯ï¼
+ </para>
+
+ <programlisting><![CDATA[DomesticCat cat = (DomesticCat) sess.load( Cat.class, new Long(69) );
+cat.setName("PK");
+sess.flush(); // changes to cat are automatically detected and persisted]]></programlisting>
+
+ <para>
+ ææ¶è¿ç§ç¨åºæ¨¡åæçä½ä¸ï¼å 为å®å¨åä¸Sessionééè¦ä¸æ¡SQL <literal>SELECT</literal>è¯å¥ï¼ç¨äºå 载对象ï¼
+ 以åä¸æ¡SQL <literal>UPDATE</literal>è¯å¥(æä¹
åæ´æ°çç¶æ)ã
+ 为æ¤Hibernateæä¾äºå¦ä¸ç§éå¾ï¼ä½¿ç¨è±ç®¡(detached)å®ä¾ã
+ </para>
+
+
+ <para>
+ <emphasis>请注æHibernateæ¬èº«ä¸æä¾ç´æ¥æ§è¡<literal>UPDATE</literal>æ<literal>DELETE</literal>è¯å¥çAPIã
+ Hibernateæä¾çæ¯<emphasis>ç¶æ管ç(state management)</emphasis>æå¡ï¼ä½ ä¸å¿
èèè¦ä½¿ç¨ç<emphasis>è¯å¥(statements)</emphasis>ã
+ JDBCæ¯åºè²çæ§è¡SQLè¯å¥çAPIï¼ä»»ä½æ¶åè°ç¨<literal>session.connection()</literal>ä½ é½å¯ä»¥å¾å°ä¸ä¸ªJDBC <literal>Connection</literal>对象ã
+ æ¤å¤ï¼å¨èæºäºå¡å¤ç(OLTP)ç¨åºä¸ï¼å¤§éæä½(mass operations)ä¸å¯¹è±¡/å
³ç³»æ å°çè§ç¹æ¯ç¸å²çªçã
+ Hibernateçå°æ¥çæ¬å¯è½ä¼æä¾ä¸é¨çè¿è¡å¤§éæä½(mass operation)çåè½ã
+ åè<xref linkend="batch"/>ï¼å¯»æ¾ä¸äºå¯ç¨çæ¹é(batch)æä½æå·§ã</emphasis>
+ </para>
+
+ </sect1>
+
+ <sect1 id="objectstate-detached" revision="2">
+ <title>ä¿®æ¹è±ç®¡(Detached)对象</title>
+
+ <para>
+ å¾å¤ç¨åºéè¦å¨æ个äºå¡ä¸è·å对象ï¼ç¶åå°å¯¹è±¡åéå°çé¢å±å»æä½ï¼æåå¨ä¸ä¸ªæ°çäºå¡ä¿åæåçä¿®æ¹ã
+ å¨é«å¹¶å访é®çç¯å¢ä¸ä½¿ç¨è¿ç§æ¹å¼ï¼é常使ç¨é带çæ¬ä¿¡æ¯çæ°æ®æ¥ä¿è¯è¿äºâé¿âå·¥ä½åå
ä¹é´çé离ã
+ </para>
+
+ <para>
+ Hibernateéè¿æä¾<literal>Session.update()</literal>æ<literal>Session.merge()</literal>
+ éæ°å
³èè±ç®¡å®ä¾çåæ³æ¥æ¯æè¿ç§æ¨¡åã
+ </para>
+
+
+ <programlisting><![CDATA[// in the first session
+Cat cat = (Cat) firstSession.load(Cat.class, catId);
+Cat potentialMate = new Cat();
+firstSession.save(potentialMate);
+
+// in a higher layer of the application
+cat.setMate(potentialMate);
+
+// later, in a new session
+secondSession.update(cat); // update cat
+secondSession.update(mate); // update mate]]></programlisting>
+
+ <para>
+ å¦æå
·æ<literal>catId</literal>æä¹
åæ è¯ç<literal>Cat</literal>ä¹åå·²ç»è¢«<literal>å¦ä¸Session(secondSession)</literal>è£
è½½äºï¼
+ åºç¨ç¨åºè¿è¡éå
³èæä½(reattach)çæ¶åä¼æåºä¸ä¸ªå¼å¸¸ã
+ </para>
+
+
+ <para>
+ å¦æä½ ç¡®å®å½åsession没æå
å«ä¸ä¹å
·æç¸åæä¹
åæ è¯çæä¹
å®ä¾ï¼ä½¿ç¨<literal>update()</literal>ã
+ å¦ææ³éæ¶åå¹¶ä½ ççæ¹å¨èä¸èèsessionçç¶æï¼ä½¿ç¨<literal>merge()</literal>ã
+ æ¢å¥è¯è¯´ï¼å¨ä¸ä¸ªæ°sessionä¸é常第ä¸ä¸ªè°ç¨çæ¯<literal>update()</literal>æ¹æ³ï¼ä»¥ä¾¿ä¿è¯éæ°å
³èè±ç®¡(detached)对象çæä½é¦å
被æ§è¡ã
+ </para>
+
+
+ <para>
+ å¦æå¸æç¸å
³èçè±ç®¡å¯¹è±¡ï¼éè¿å¼ç¨âå¯å°è¾¾âçè±ç®¡å¯¹è±¡ï¼çæ°æ®ä¹è¦æ´æ°å°æ°æ®åºæ¶ï¼å¹¶ä¸ä¹<emphasis>ä»
ä»
</emphasis>å¨è¿ç§æ
åµï¼ï¼
+ å¯ä»¥å¯¹è¯¥ç¸å
³èçè±ç®¡å¯¹è±¡åç¬è°ç¨<literal>update()</literal>
+ å½ç¶è¿äºå¯ä»¥èªå¨å®æï¼å³éè¿ä½¿ç¨<emphasis>ä¼ ææ§æä¹
å(transitive persistence)</emphasis>ï¼è¯·ç<xref linkend="objectstate-transitive"/>ã
+ </para>
+
+
+ <para>
+ <literal>lock()</literal>æ¹æ³ä¹å
许ç¨åºéæ°å
³èæ个对象å°ä¸ä¸ªæ°sessionä¸ãä¸è¿ï¼è¯¥è±ç®¡(detached)ç对象å¿
é¡»æ¯æ²¡æä¿®æ¹è¿çï¼
+ </para>
+
+ <programlisting><![CDATA[//just reassociate:
+sess.lock(fritz, LockMode.NONE);
+//do a version check, then reassociate:
+sess.lock(izi, LockMode.READ);
+//do a version check, using SELECT ... FOR UPDATE, then reassociate:
+sess.lock(pk, LockMode.UPGRADE);]]></programlisting>
+
+
+ <para>
+ 请注æï¼<literal>lock()</literal>å¯ä»¥æé
å¤ç§<literal>LockMode</literal>ï¼
+ æ´å¤ä¿¡æ¯è¯·é
读APIæ档以åå
³äºäºå¡å¤ç(transaction handling)çç« èãéæ°å
³èä¸æ¯<literal>lock()</literal>çå¯ä¸ç¨éã
+ </para>
+
+
+ <para>
+ å
¶ä»ç¨äºé¿æ¶é´å·¥ä½åå
ç模åä¼å¨<xref linkend="transactions-optimistic"/>ä¸è®¨è®ºã
+ </para>
+
+ </sect1>
+
+ <sect1 id="objectstate-saveorupdate">
+ <title>èªå¨ç¶ææ£æµ</title>
+
+
+ <para>
+ Hibernateçç¨æ·æ¾è¦æ±ä¸ä¸ªæ¢å¯èªå¨åé
æ°æä¹
åæ è¯(identifier)ä¿åç¬æ¶(transient)对象ï¼åå¯æ´æ°/éæ°å
³èè±ç®¡(detached)å®ä¾çéç¨æ¹æ³ã
+ <literal>saveOrUpdate()</literal>æ¹æ³å®ç°äºè¿ä¸ªåè½ã
+ </para>
+
+ <programlisting><![CDATA[// in the first session
+Cat cat = (Cat) firstSession.load(Cat.class, catID);
+
+// in a higher tier of the application
+Cat mate = new Cat();
+cat.setMate(mate);
+
+// later, in a new session
+secondSession.saveOrUpdate(cat); // update existing state (cat has a non-null id)
+secondSession.saveOrUpdate(mate); // save the new instance (mate has a null id)]]></programlisting>
+
+
+ <para>
+ <literal>saveOrUpdate()</literal>ç¨éåè¯ä¹å¯è½ä¼ä½¿æ°ç¨æ·æå°è¿·æã
+ é¦å
ï¼åªè¦ä½ 没æå°è¯å¨æ个sessionä¸ä½¿ç¨æ¥èªå¦ä¸sessionçå®ä¾ï¼ä½ å°±åºè¯¥ä¸éè¦ä½¿ç¨<literal>update()</literal>ï¼
+ <literal>saveOrUpdate()</literal>ï¼æ<literal>merge()</literal>ãæäºç¨åºä»æ¥ä¸ç¨è¿äºæ¹æ³ã
+ </para>
+
+
+ <para>
+ é常ä¸é¢çåºæ¯ä¼ä½¿ç¨<literal>update()</literal>æ<literal>saveOrUpdate()</literal>ï¼
+ </para>
+
+ <itemizedlist spacing="compact">
+ <listitem>
+ <para>
+ ç¨åºå¨ç¬¬ä¸ä¸ªsessionä¸å 载对象
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ è¯¥å¯¹è±¡è¢«ä¼ éå°è¡¨ç°å±
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ 对象åçäºä¸äºæ¹å¨
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ 该对象被è¿åå°ä¸å¡é»è¾å±
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ ç¨åºè°ç¨ç¬¬äºä¸ªsessionç<literal>update()</literal>æ¹æ³æä¹
è¿äºæ¹å¨
+ </para>
+ </listitem>
+ </itemizedlist>
+
+ <para>
+ <literal>saveOrUpdate()</literal>åä¸é¢çäº:
+ </para>
+
+ <itemizedlist spacing="compact">
+ <listitem>
+ <para>
+ å¦æ对象已ç»å¨æ¬sessionä¸æä¹
åäºï¼ä¸åä»»ä½äº
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ å¦æå¦ä¸ä¸ªä¸æ¬sessionå
³èç对象æ¥æç¸åçæä¹
åæ è¯(identifier)ï¼æåºä¸ä¸ªå¼å¸¸
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ å¦æ对象没ææä¹
åæ è¯(identifier)å±æ§ï¼å¯¹å
¶è°ç¨<literal>save()</literal>
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ å¦æ对象çæä¹
æ è¯(identifier)表æå
¶æ¯ä¸ä¸ªæ°å®ä¾åç对象ï¼å¯¹å
¶è°ç¨<literal>save()</literal>
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ å¦æ对象æ¯é带çæ¬ä¿¡æ¯çï¼éè¿<literal><version></literal>æ<literal><timestamp></literal>ï¼
+ 并ä¸çæ¬å±æ§çå¼è¡¨æå
¶æ¯ä¸ä¸ªæ°å®ä¾åç对象ï¼<literal>save()</literal>å®ã
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ å¦å<literal>update()</literal> è¿ä¸ªå¯¹è±¡
+ </para>
+ </listitem>
+ </itemizedlist>
+
+
+ <para>
+ <literal>merge()</literal>å¯é常ä¸å:
+ </para>
+
+ <itemizedlist spacing="compact">
+ <listitem>
+ <para>
+ å¦æsessionä¸åå¨ç¸åæä¹
åæ è¯(identifier)çå®ä¾ï¼ç¨ç¨æ·ç»åºç对象çç¶æè¦çæ§æçæä¹
å®ä¾
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ å¦æsession没æç¸åºçæä¹
å®ä¾ï¼åå°è¯ä»æ°æ®åºä¸å è½½ï¼æå建æ°çæä¹
åå®ä¾
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ æåè¿å该æä¹
å®ä¾
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ ç¨æ·ç»åºçè¿ä¸ªå¯¹è±¡æ²¡æ被å
³èå°sessionä¸ï¼å®ä¾æ§æ¯è±ç®¡ç
+ </para>
+ </listitem>
+ </itemizedlist>
+
+ </sect1>
+
+ <sect1 id="objectstate-deleting" revision="1">
+ <title>å é¤æä¹
对象</title>
+
+ <para>
+ 使ç¨<literal>Session.delete()</literal>ä¼æ对象çç¶æä»æ°æ®åºä¸ç§»é¤ã
+ å½ç¶ï¼ä½ çåºç¨ç¨åºå¯è½ä»ç¶ææä¸ä¸ªæåå·²å é¤å¯¹è±¡çå¼ç¨ãæ以ï¼æ好è¿æ ·ç解ï¼<literal>delete()</literal>çç¨éæ¯æä¸ä¸ªæä¹
å®ä¾åæç¬æ¶(transient)å®ä¾ã
+ </para>
+
+ <programlisting><![CDATA[sess.delete(cat);]]></programlisting>
+
+
+ <para>
+ ä½ å¯ä»¥ç¨ä½ å欢çä»»ä½é¡ºåºå é¤å¯¹è±¡ï¼ä¸ç¨æ
å¿å¤é®çº¦æå²çªãå½ç¶ï¼å¦æä½ æéäºé¡ºåºï¼è¿æ¯æå¯è½å¼åå¨å¤é®å段å®ä¹ç<literal>NOT NULL</literal>约æå²çªã
+ ä¾å¦ä½ å é¤äºç¶å¯¹è±¡ï¼ä½æ¯å¿è®°å é¤å©å们ã
+ </para>
+
+ </sect1>
+
+ <sect1 id="objectstate-replicating" revision="1">
+ <title>å¨ä¸¤ä¸ªä¸åæ°æ®åºé´å¤å¶å¯¹è±¡</title>
+
+
+ <para>
+ å¶å°ä¼ç¨å°ä¸éæ°çææä¹
åæ è¯(identifier)ï¼å°æä¹
å®ä¾ä»¥åå
¶å
³èçå®ä¾æä¹
å°ä¸åçæ°æ®åºä¸çæä½ã
+ </para>
+
+ <programlisting><![CDATA[//retrieve a cat from one database
+Session session1 = factory1.openSession();
+Transaction tx1 = session1.beginTransaction();
+Cat cat = session1.get(Cat.class, catId);
+tx1.commit();
+session1.close();
+
+//reconcile with a second database
+Session session2 = factory2.openSession();
+Transaction tx2 = session2.beginTransaction();
+session2.replicate(cat, ReplicationMode.LATEST_VERSION);
+tx2.commit();
+session2.close();]]></programlisting>
+
+
+ <para>
+ <literal>ReplicationMode</literal>å³å®å¨åæ°æ®åºä¸å·²åå¨è®°å½ç±å²çªæ¶ï¼<literal>replicate()</literal>å¦ä½å¤çã
+ </para>
+
+ <itemizedlist spacing="compact">
+ <listitem>
+ <para>
+ <literal>ReplicationMode.IGNORE</literal> - 忽ç¥å®
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ <literal>ReplicationMode.OVERWRITE</literal> - è¦çç¸åçè¡
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ <literal>ReplicationMode.EXCEPTION</literal> - æåºå¼å¸¸
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ <literal>ReplicationMode.LATEST_VERSION</literal> - å¦æå½åççæ¬è¾æ°ï¼åè¦çï¼å¦å忽ç¥
+ </para>
+ </listitem>
+ </itemizedlist>
+
+
+ <para>
+ è¿ä¸ªåè½çç¨éå
æ¬ä½¿å½å
¥çæ°æ®å¨ä¸åæ°æ®åºä¸ä¸è´ï¼äº§åå级æ¶å级系ç»é
置信æ¯ï¼åæ»non-ACIDäºå¡ä¸çä¿®æ¹ççã
+ ï¼è¯æ³¨ï¼non-ACIDï¼éACID;ACIDï¼Atomicï¼Consistentï¼Isolated and Durableç缩åï¼
+ </para>
+
+ </sect1>
+
+ <sect1 id="objectstate-flushing">
+ <title>Sessionå·åº(flush)</title>
+
+
+ <para>
+ æ¯é´éä¸æ®µæ¶é´ï¼<literal>Session</literal>ä¼æ§è¡ä¸äºå¿
éçSQLè¯å¥æ¥æå
åä¸ç对象çç¶æåæ¥å°JDBCè¿æ¥ä¸ãè¿ä¸ªè¿ç¨è¢«ç§°ä¸º<emphasis>å·åº(flush)</emphasis>ï¼é»è®¤ä¼å¨ä¸é¢çæ¶é´ç¹æ§è¡ï¼
+ </para>
+
+ <itemizedlist spacing="compact">
+ <listitem>
+ <para>
+ å¨æäºæ¥è¯¢æ§è¡ä¹å
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ å¨è°ç¨<literal>org.hibernate.Transaction.commit()</literal>çæ¶å
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ å¨è°ç¨<literal>Session.flush()</literal>çæ¶å
+ </para>
+ </listitem>
+ </itemizedlist>
+
+ <para>
+ æ¶åçSQLè¯å¥ä¼æç
§ä¸é¢ç顺åºååºæ§è¡ï¼
+ </para>
+
+ <orderedlist spacing="compact">
+ <listitem>
+ <para>
+ ææ对å®ä½è¿è¡æå
¥çè¯å¥ï¼å
¶é¡ºåºæç
§å¯¹è±¡æ§è¡<literal>Session.save()</literal>çæ¶é´é¡ºåº
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ ææ对å®ä½è¿è¡æ´æ°çè¯å¥
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ ææè¿è¡éåå é¤çè¯å¥
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ ææ对éåå
ç´ è¿è¡å é¤ï¼æ´æ°æè
æå
¥çè¯å¥
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ ææè¿è¡éåæå
¥çè¯å¥
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ ææ对å®ä½è¿è¡å é¤çè¯å¥ï¼å
¶é¡ºåºæç
§å¯¹è±¡æ§è¡<literal>Session.delete()</literal>çæ¶é´é¡ºåº
+ </para>
+ </listitem>
+ </orderedlist>
+
+ <para>
+ ï¼æä¸ä¸ªä¾å¤æ¯ï¼å¦æ对象使ç¨<literal>native</literal>æ¹å¼æ¥çæIDï¼æä¹
åæ è¯ï¼çè¯ï¼å®ä»¬ä¸æ§è¡saveå°±ä¼è¢«æå
¥ãï¼
+ </para>
+
+ <para>
+ é¤éä½ æç¡®å°ååºäº<literal>flush()</literal>æ令ï¼å
³äºSession<emphasis>ä½æ¶</emphasis>ä¼æ§è¡è¿äºJDBCè°ç¨æ¯å®å
¨æ æ³ä¿è¯çï¼åªè½ä¿è¯å®ä»¬æ§è¡çåå顺åºã
+ å½ç¶ï¼Hibernateä¿è¯ï¼<literal>Query.list(..)</literal>ç»å¯¹ä¸ä¼è¿åå·²ç»å¤±æçæ°æ®ï¼ä¹ä¸ä¼è¿åé误æ°æ®ã
+ </para>
+
+
+ <para>
+ ä¹å¯ä»¥æ¹åé»è®¤ç设置ï¼æ¥è®©å·åº(flush)æä½åççä¸é£ä¹é¢ç¹ã
+ <literal>FlushMode</literal>ç±»å®ä¹äºä¸ç§ä¸åçæ¹å¼ã
+ ä»
å¨æ交æ¶å·åº(ä»
å½Hibernateç<literal>Transaction</literal> API被使ç¨æ¶ææ)ï¼
+ æç
§åæ说çæ¹å¼å·åºï¼
+ 以åé¤éæ确使ç¨<literal>flush()</literal>å¦åä»ä¸å·åºã
+ æåä¸ç§æ¨¡å¼å¯¹äºé£äºéè¦é¿æ¶é´ä¿æ<literal>Session</literal>为æå¼æè
æ线ç¶æçé¿æ¶é´è¿è¡çå·¥ä½åå
å¾æç¨ã
+ (åè§ <xref linkend="transactions-optimistic-longsession"/>).
+ </para>
+
+ <programlisting><![CDATA[sess = sf.openSession();
+Transaction tx = sess.beginTransaction();
+sess.setFlushMode(FlushMode.COMMIT); // allow queries to return stale state
+
+Cat izi = (Cat) sess.load(Cat.class, id);
+izi.setName(iznizi);
+
+// might return stale data
+sess.find("from Cat as cat left outer join cat.kittens kitten");
+
+// change to izi is not flushed!
+...
+tx.commit(); // flush occurs
+sess.close();]]></programlisting>
+
+
+ <para>
+ å·åº(flush)æé´ï¼å¯è½ä¼æåºå¼å¸¸ãï¼ä¾å¦ä¸ä¸ªDMLæä½è¿åäºçº¦æï¼
+ å¼å¸¸å¤çæ¶åå°å¯¹Hibernateäºå¡æ§è¡ä¸ºçç解ï¼å æ¤æ们å°å¨<xref linkend="transactions"/>ä¸è®¨è®ºã
+ </para>
+
+ </sect1>
+
+ <sect1 id="objectstate-transitive" revision="1">
+ <title>ä¼ ææ§æä¹
å(transitive persistence)</title>
+
+ <para>
+ 对æ¯ä¸ä¸ªå¯¹è±¡é½è¦æ§è¡ä¿åï¼å é¤æéå
³èæä½è®©äººæè§æç¹éº»ç¦ï¼å°¤å
¶æ¯å¨å¤ç许å¤å½¼æ¤å
³èç对象çæ¶åã
+ ä¸ä¸ªå¸¸è§çä¾åæ¯ç¶åå
³ç³»ãèèä¸é¢çä¾å:
+ </para>
+
+
+ <para>
+ å¦æä¸ä¸ªç¶åå
³ç³»ä¸çå对象æ¯å¼ç±»å(value typed)ï¼ä¾å¦ï¼å°åæå符串çéåï¼çï¼ä»ä»¬ççå½å¨æä¼ä¾èµäºç¶å¯¹è±¡ï¼å¯ä»¥äº«åæ¹ä¾¿ç级èæä½(Cascading)ï¼ä¸éè¦é¢å¤çå¨ä½ã
+ ç¶å¯¹è±¡è¢«ä¿åæ¶ï¼è¿äºå¼ç±»å(value typed)å对象ä¹å°è¢«ä¿åï¼ç¶å¯¹è±¡è¢«å é¤æ¶ï¼å对象ä¹å°è¢«å é¤ã
+ è¿å¯¹å°ä¸ä¸ªå对象ä»éåä¸ç§»é¤æ¯åæ ·ææï¼Hibernateä¼æ£æµå°ï¼å¹¶ä¸å 为å¼ç±»å(value typed)ç对象ä¸å¯è½è¢«å
¶ä»å¯¹è±¡å¼ç¨ï¼æ以Hibernateä¼å¨æ°æ®åºä¸å é¤è¿ä¸ªå对象ã
+ </para>
+
+
+ <para>
+ ç°å¨èèåæ ·çåºæ¯ï¼ä¸è¿ç¶å对象é½æ¯å®ä½(entities)ç±»åï¼èéå¼ç±»å(value typed)ï¼ä¾å¦ï¼ç±»å«ä¸ä¸ªä½ï¼ææ¯ç«åå°ç«ï¼ã
+ å®ä½æèªå·±ççå½æï¼å
许å
±äº«å¯¹å
¶çå¼ç¨ï¼å æ¤ä»éåä¸ç§»é¤ä¸ä¸ªå®ä½ï¼ä¸æå³çå®å¯ä»¥è¢«å é¤ï¼ï¼
+ 并ä¸å®ä½å°å
¶ä»å
³èå®ä½ä¹é´é»è®¤æ²¡æ级èæä½ç设置ã
+ Hibernateé»è®¤ä¸å®ç°æè°ç<emphasis>å¯å°è¾¾å³æä¹
åï¼persistence by reachabilityï¼</emphasis>ççç¥ã
+ </para>
+
+ <para>
+ æ¯ä¸ªHibernate sessionçåºæ¬æä½ - å
æ¬ <literal>persist(), merge(),
+ saveOrUpdate(), delete(), lock(), refresh(), evict(), replicate()</literal> - é½æ对åºç级èé£æ ¼(cascade style)ã
+ è¿äºçº§èé£æ ¼(cascade style)é£æ ¼åå«å½å为 <literal>create,
+ merge, save-update, delete, lock, refresh, evict, replicate</literal>ã
+ å¦æä½ å¸æä¸ä¸ªæä½è¢«é¡ºçå
³èå
³ç³»çº§èä¼ æï¼ä½ å¿
é¡»å¨æ å°æ件ä¸æåºè¿ä¸ç¹ãä¾å¦ï¼
+ </para>
+
+ <programlisting><![CDATA[<one-to-one name="person" cascade="persist"/>]]></programlisting>
+
+
+ <para>
+ 级èé£æ ¼(cascade style)æ¯å¯ç»åç:
+ </para>
+
+ <programlisting><![CDATA[<one-to-one name="person" cascade="persist,delete,lock"/>]]></programlisting>
+
+
+ <para>
+ ä½ å¯ä»¥ä½¿ç¨<literal>cascade="all"</literal>æ¥æå®<emphasis>å
¨é¨</emphasis>æä½é½é¡ºçå
³èå
³ç³»çº§è(cascaded)ã
+ é»è®¤å¼æ¯<literal>cascade="none"</literal>ï¼å³ä»»ä½æä½é½ä¸ä¼è¢«çº§è(cascaded)ã
+ </para>
+
+ <para>
+ 注ææä¸ä¸ªç¹æ®ç级èé£æ ¼(cascade style) <literal>delete-orphan</literal>ï¼åªåºç¨äºone-to-manyå
³èï¼è¡¨æ<literal>delete()</literal>æä½
+ åºè¯¥è¢«åºç¨äºææä»å
³èä¸å é¤ç对象ã
+ </para>
+
+
+
+ <para>
+ 建议:
+ </para>
+
+ <itemizedlist spacing="compact">
+ <listitem>
+ <para>
+ é常å¨<literal><many-to-one></literal>æ<literal><many-to-many></literal>å
³ç³»ä¸åºç¨çº§è(cascade)没ä»ä¹æä¹ã
+ 级è(cascade)éå¸¸å¨ <literal><one-to-one></literal>å<literal><one-to-many></literal>å
³ç³»ä¸æ¯è¾æç¨ã
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ å¦æå对象ç寿å½éå®å¨ç¶äº²å¯¹è±¡ç寿å½ä¹å
ï¼å¯éè¿æå®<literal>cascade="all,delete-orphan"</literal>å°å
¶å为<emphasis>èªå¨çå½å¨æ管çç对象(life cycle object)</emphasis>ã
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ å
¶ä»æ
åµï¼ä½ å¯æ ¹æ¬ä¸éè¦çº§è(cascade)ãä½æ¯å¦æä½ è®¤ä¸ºä½ ä¼ç»å¸¸å¨æ个äºå¡ä¸åæ¶ç¨å°ç¶å¯¹è±¡ä¸å对象ï¼å¹¶ä¸ä½ å¸æå°æç¹å¿åï¼å¯ä»¥èè使ç¨<literal>cascade="persist,merge,save-update"</literal>ã
+ </para>
+ </listitem>
+ </itemizedlist>
+
+ <para>
+ å¯ä»¥ä½¿ç¨<literal>cascade="all"</literal>å°ä¸ä¸ªå
³èå
³ç³»ï¼æ 论æ¯å¯¹å¼å¯¹è±¡çå
³èï¼æè
对ä¸ä¸ªéåçå
³èï¼æ 记为<emphasis>ç¶/å</emphasis>å
³ç³»çå
³èã
+ è¿æ ·å¯¹ç¶å¯¹è±¡è¿è¡save/update/deleteæä½å°±ä¼å¯¼è´å对象ä¹è¿è¡save/update/deleteæä½ã
+ </para>
+
+ <para>
+ æ¤å¤ï¼ä¸ä¸ªæä¹
çç¶å¯¹è±¡å¯¹å对象çæµ
å¼ç¨(mere reference)ä¼å¯¼è´å对象被åæ¥save/updateã
+ ä¸è¿ï¼è¿ä¸ªéå»(metaphor)ç说æ³å¹¶ä¸å®æ´ãé¤éå
³èæ¯<literal><one-to-many></literal>å
³è并ä¸è¢«æ 记为<literal>cascade="delete-orphan"</literal>ï¼
+ å¦åç¶å¯¹è±¡å¤±å»å¯¹æ个å对象çå¼ç¨<emphasis>ä¸ä¼</emphasis>导è´è¯¥å对象被èªå¨å é¤ã
+ ç¶åå
³ç³»ç级è(cascading)æä½åç¡®è¯ä¹å¦ä¸ï¼
+ </para>
+
+ <itemizedlist spacing="compact">
+ <listitem>
+ <para>
+ å¦æç¶å¯¹è±¡è¢«<literal>persist()</literal>ï¼é£ä¹ææå对象ä¹ä¼è¢«<literal>persist()</literal>
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ å¦æç¶å¯¹è±¡è¢«<literal>merge()</literal>ï¼é£ä¹ææå对象ä¹ä¼è¢«<literal>merge()</literal>
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ å¦æç¶å¯¹è±¡è¢«<literal>save()</literal>ï¼<literal>update()</literal>æ
+ <literal>saveOrUpdate()</literal>ï¼é£ä¹ææå对象åä¼è¢«<literal>saveOrUpdate()</literal>
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ å¦ææ个æä¹
çç¶å¯¹è±¡å¼ç¨äºç¬æ¶(transient)æè
è±ç®¡(detached)çå对象ï¼é£ä¹å对象å°ä¼è¢«<literal>saveOrUpdate()</literal>
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ å¦æç¶å¯¹è±¡è¢«å é¤ï¼é£ä¹ææå对象ä¹ä¼è¢«<literal>delete()</literal>
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ é¤é被æ 记为<literal>cascade="delete-orphan"</literal>ï¼å é¤âå¤å¿â模å¼ï¼æ¤æ¶ä¸è¢«ä»»ä½ä¸ä¸ªç¶å¯¹è±¡å¼ç¨çå对象ä¼è¢«å é¤ï¼ï¼
+ å¦åå对象失æç¶å¯¹è±¡å¯¹å
¶çå¼ç¨æ¶ï¼<emphasis>ä»ä¹äºä¹ä¸ä¼åç</emphasis>ã
+ å¦ææç¹æ®éè¦ï¼åºç¨ç¨åºå¯éè¿æ¾å¼è°ç¨delete()å é¤å对象ã
+ </para>
+ </listitem>
+ </itemizedlist>
+ <para>
+ æåï¼æ³¨ææä½ç级èå¯è½æ¯å¨<emphasis>è°ç¨æ(call time)</emphasis>æè
<emphasis>åå
¥æ(flush time)</emphasis>ä½ç¨å°å¯¹è±¡å¾ä¸çãææçæä½ï¼å¦æå
许ï¼é½å¨æä½è¢«æ§è¡çæ¶å级èå°å¯è§¦åçå
³èå®ä½ä¸ãç¶èï¼<literal>save-upate</literal>å<literal>delete-orphan</literal>æ¯å¨<literal>Session</literal> flushçæ¶åæä½ç¨å°ææå¯è§¦åç被å
³è对象ä¸çã
+ </para>
+
+
+ </sect1>
+
+ <sect1 id="objectstate-metadata">
+ <title>使ç¨å
æ°æ®</title>
+
+ <para>
+ Hibernateä¸æä¸ä¸ªé常丰å¯çå
级å«(meta-level)ç模åï¼å«æææçå®ä½åå¼ç±»åæ°æ®çå
æ°æ®ã
+ ææ¶è¿ä¸ªæ¨¡å对åºç¨ç¨åºæ¬èº«ä¹ä¼é常æç¨ã
+ æ¯å¦è¯´ï¼åºç¨ç¨åºå¯è½å¨å®ç°ä¸ç§âæºè½âç深度æ·è´ç®æ³æ¶ï¼
+ éè¿ä½¿ç¨Hibernateçå
æ°æ®æ¥äºè§£åªäºå¯¹è±¡åºè¯¥è¢«æ·è´ï¼æ¯å¦ï¼å¯åçå¼ç±»åæ°æ®ï¼ï¼
+ é£äºä¸åºè¯¥ï¼ä¸å¯åçå¼ç±»åæ°æ®ï¼ä¹è®¸è¿ææäºè¢«å
³èçå®ä½ï¼ã
+ </para>
+
+
+ <para>
+ Hibernateæä¾äº<literal>ClassMetadata</literal>æ¥å£ï¼<literal>CollectionMetadata</literal>æ¥å£å<literal>Type</literal>å±æ¬¡ä½ç³»æ¥è®¿é®å
æ°æ®ã
+ å¯ä»¥éè¿<literal>SessionFactory</literal>è·åå
æ°æ®æ¥å£çå®ä¾ã
+ </para>
+
+ <programlisting><![CDATA[Cat fritz = ......;
+ClassMetadata catMeta = sessionfactory.getClassMetadata(Cat.class);
+
+Object[] propertyValues = catMeta.getPropertyValues(fritz);
+String[] propertyNames = catMeta.getPropertyNames();
+Type[] propertyTypes = catMeta.getPropertyTypes();
+
+// get a Map of all properties which are not collections or associations
+Map namedValues = new HashMap();
+for ( int i=0; i<propertyNames.length; i++ ) {
+ if ( !propertyTypes[i].isEntityType() && !propertyTypes[i].isCollectionType() ) {
+ namedValues.put( propertyNames[i], propertyValues[i] );
+ }
+}]]></programlisting>
+
+ </sect1>
+
+</chapter>
+
Copied: core/trunk/documentation/manual/zh-CN/src/main/docbook/content/toolset_guide.xml (from rev 14080, core/trunk/documentation/manual/zh-CN/src/main/docbook/modules/toolset_guide.xml)
===================================================================
--- core/trunk/documentation/manual/zh-CN/src/main/docbook/content/toolset_guide.xml (rev 0)
+++ core/trunk/documentation/manual/zh-CN/src/main/docbook/content/toolset_guide.xml 2007-10-09 20:10:34 UTC (rev 14081)
@@ -0,0 +1,564 @@
+<chapter id="toolsetguide" revision="2">
+ <title>å·¥å
·ç®±æå</title>
+
+ <para>
+ å¯ä»¥éè¿ä¸ç³»åEclipseæ件ãå½ä»¤è¡å·¥å
·åAntä»»å¡æ¥è¿è¡ä¸Hibernateå
³èç转æ¢ã
+
+ </para>
+
+ <para>
+ é¤äºAntä»»å¡å¤ï¼å½åç<emphasis>Hibernate Tools</emphasis>ä¹å
å«äºEclipse IDEçæ件ï¼ç¨äºä¸ç°åæ°æ®åºçéåå·¥ç¨ã
+ </para>
+
+ <itemizedlist>
+ <listitem><para>
+
+ <emphasis>Mapping Editor:</emphasis> Hibernate XMLæ å°æ件çç¼è¾å¨ï¼æ¯æèªå¨å®æåè¯æ³é«äº®ãå®ä¹æ¯æ对类ååå±æ§/å段åçè¯ä¹èªå¨å®æï¼æ¯é常çXMLç¼è¾å¨æ¹ä¾¿å¾å¤ã
+ </para></listitem>
+ <listitem><para>
+ <emphasis>Console:</emphasis> Consoleæ¯Eclipseçä¸ä¸ªæ°è§å¾ãé¤äºå¯¹ä½ çconsoleé
ç½®çæ ç¶æ¦è§ï¼ä½ è¿å¯ä»¥è·å¾å¯¹ä½ æä¹
åç±»åå
¶å
³èç交äºå¼è§å¾ãConsoleå
è®¸ä½ å¯¹æ°æ®åºæ§è¡HQLæ¥è¯¢ï¼å¹¶ç´æ¥å¨Eclipseä¸æµè§ç»æã
+ </para></listitem>
+ <listitem><para>
+ <emphasis>Development Wizards:</emphasis> å¨Hibernate Eclipse toolsä¸è¿æä¾äºå 个å导ï¼ä½ å¯ä»¥ç¨å导快éçæHibernate é
ç½®æ件ï¼cfg.xmlï¼ï¼ä½ çè³è¿å¯ä»¥åç°åçæ°æ®åºschemaä¸ååå·¥ç¨åºPOJOæºä»£ç ä¸Hibernate æ å°æ件ãååå·¥ç¨æ¯æå¯å®å¶ç模çã
+ </para></listitem>
+ <listitem><para>
+ <emphasis>Ant Tasks:</emphasis>
+ </para></listitem>
+
+ </itemizedlist>
+
+ <para>
+ è¦å¾å°æ´å¤ä¿¡æ¯ï¼è¯·æ¥é
<emphasis>Hibernate Tools</emphasis> å
åå
¶ææ¡£ã
+ </para>
+
+ <para>
+ åæ¶ï¼Hibernate主åè¡å
è¿é带äºä¸ä¸ªéæçå·¥å
·ï¼å®çè³å¯ä»¥å¨Hibernateâå
é¨âå¿«éè¿è¡ï¼<emphasis>SchemaExport</emphasis> ï¼ä¹å°±æ¯ <literal>hbm2ddl</literal>ã
+
+ </para>
+
+ <sect1 id="toolsetguide-s1" revision="2">
+ <title>Schemaèªå¨çæï¼Automatic schema generationï¼</title>
+
+ <para>
+ å¯ä»¥ä»ä½ çæ å°æ件使ç¨ä¸ä¸ªHibernateå·¥å
·çæDDLã çæçschemaå
å«æ对å®ä½åéå类表çå®æ´æ§å¼ç¨çº¦æï¼ä¸»é®åå¤é®ï¼ãæ¶åå°çæ 示符çæå¨æéç表åsequenceä¹ä¼åæ¶çæã
+ </para>
+
+ <para>
+ å¨ä½¿ç¨è¿ä¸ªå·¥å
·çæ¶åï¼ä½ <emphasis>å¿
é¡»</emphasis> éè¿<literal>hibernate.dialet</literal>å±æ§æå®ä¸ä¸ªSQL<literal>æ¹è¨(Dialet)</literal>ï¼å 为DDLæ¯ä¸ä¾åºåé«åº¦ç¸å
³çã
+ </para>
+
+ <para>
+ é¦å
ï¼è¦å®å¶ä½ çæ å°æ件ï¼æ¥æ¹åçæçschemaã
+ </para>
+
+ <sect2 id="toolsetguide-s1-2" revision="3">
+ <title>对schemaå®å¶å(Customizing the schema)</title>
+
+ <para>
+ å¾å¤Hibernateæ å°å
ç´ å®ä¹äºå¯éç<literal>length</literal>ã<literal>precision</literal> æè
<literal>scale</literal>å±æ§ãä½ å¯ä»¥éè¿è¿ä¸ªå±æ§è®¾ç½®å段çé¿åº¦ã精度ãå°æ°ç¹ä½æ°ã
+ </para>
+
+ <programlisting><![CDATA[<property name="zip" length="5"/>]]></programlisting>
+ <programlisting><![CDATA[<property name="balance" precision="12" scale="2"/>]]></programlisting>
+
+ <para>
+ æäºtagè¿æ¥å<literal>not-null</literal>å±æ§ï¼ç¨æ¥å¨è¡¨å段ä¸çæ<literal>NOT NULL</literal>约æï¼å<literal>unique</literal>å±æ§ï¼ç¨æ¥å¨è¡¨å段ä¸çæ<literal>UNIQUE</literal>约æï¼ã
+ </para>
+
+ <programlisting><![CDATA[<many-to-one name="bar" column="barId" not-null="true"/>]]></programlisting>
+ <programlisting><![CDATA[<element column="serialNumber" type="long" not-null="true" unique="true"/>]]></programlisting>
+
+ <para>
+ <literal>unique-key</literal>å±æ§å¯ä»¥å¯¹æç»çå段æå®ä¸ä¸ªå¯ä¸é®çº¦æ(unique key constraint)ãç®åï¼<literal>unique-key</literal>å±æ§æå®çå¼å¨çæDDLæ¶<emphasis>并ä¸ä¼</emphasis>被å½ä½è¿ä¸ªçº¦æçååï¼å®ä»¬åªæ¯å¨ç¨æ¥å¨æ å°æ件å
é¨ç¨ä½åºåçã
+ </para>
+
+ <programlisting><![CDATA[<many-to-one name="org" column="orgId" unique-key="OrgEmployeeId"/>
+<property name="employeeId" unique-key="OrgEmployee"/>]]></programlisting>
+
+ <para>
+ <literal>index</literal>å±æ§ä¼ç¨å¯¹åºçå段ï¼ä¸ä¸ªæå¤ä¸ªï¼çæä¸ä¸ªindex,å®æåºäºè¿ä¸ªindexçååãå¦æå¤ä¸ªå段对åºçindexååç¸åï¼å°±ä¼çæå
å«è¿äºå段çindexã
+ </para>
+
+ <programlisting><![CDATA[<property name="lastName" index="CustName"/>
+<property name="firstName" index="CustName"/>]]></programlisting>
+
+ <para>
+ <literal>foreign-key</literal>å±æ§å¯ä»¥ç¨æ¥è¦çä»»ä½çæçå¤é®çº¦æçååã
+ </para>
+
+ <programlisting><![CDATA[<many-to-one name="bar" column="barId" foreign-key="FKFooBar"/>]]></programlisting>
+
+ <para>
+ å¾å¤æ å°å
ç´ è¿æ¥å<literal><column></literal>åå
ç´ ãè¿å¨å®ä¹è·¨è¶å¤å段çç±»åæ¶ç¹å«æç¨ã
+ </para>
+
+ <programlisting><![CDATA[<property name="name" type="my.customtypes.Name"/>
+ <column name="last" not-null="true" index="bar_idx" length="30"/>
+ <column name="first" not-null="true" index="bar_idx" length="20"/>
+ <column name="initial"/>
+</property>]]></programlisting>
+
+ <para>
+ <literal>default</literal>å±æ§ä¸ºå段æå®ä¸ä¸ªé»è®¤å¼ (å¨ä¿å被æ å°çç±»çæ°å®ä¾ä¹åï¼ä½ åºè¯¥å°åæ ·çå¼èµäºå¯¹åºçå±æ§)ã
+ </para>
+
+ <programlisting><![CDATA[<property name="credits" type="integer" insert="false">
+ <column name="credits" default="10"/>
+</property>]]></programlisting>
+
+ <programlisting><![CDATA[<version name="version" type="integer" insert="false">
+ <column name="version" default="0"/>
+</property>]]></programlisting>
+
+ <para>
+ <literal>sql-type</literal>å±æ§å
许ç¨æ·è¦çé»è®¤çHibernateç±»åå°SQLæ°æ®ç±»åçæ å°ã
+ </para>
+
+ <programlisting><![CDATA[<property name="balance" type="float">
+ <column name="balance" sql-type="decimal(13,3)"/>
+</property>]]></programlisting>
+
+ <para>
+ <literal>check</literal>å±æ§å
许ç¨æ·æå®ä¸ä¸ªçº¦ææ£æ¥ã
+ </para>
+
+ <programlisting><![CDATA[<property name="foo" type="integer">
+ <column name="foo" check="foo > 10"/>
+</property>]]></programlisting>
+
+ <programlisting><![CDATA[<class name="Foo" table="foos" check="bar < 100.0">
+ ...
+ <property name="bar" type="float"/>
+</class>]]></programlisting>
+
+
+ <table frame="topbot" id="schemattributes-summary" revision="1">
+ <title>Summary</title>
+ <tgroup cols="2">
+ <colspec colwidth="1*"/>
+ <colspec colwidth="2.5*"/>
+ <thead>
+ <row>
+ <entry>å±æ§(Attribute)</entry>
+ <entry>å¼ï¼Valuesï¼</entry>
+ <entry>解éï¼Interpretationï¼</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry><literal>length</literal></entry>
+ <entry>æ°å</entry>
+ <entry>å段é¿åº¦</entry>
+
+ </row>
+ <row>
+ <entry><literal>precision</literal></entry>
+ <entry>æ°å</entry>
+ <entry>精度(decimal precision)</entry>
+ </row>
+ <row>
+ <entry><literal>scale</literal></entry>
+ <entry>æ°å</entry>
+ <entry>å°æ°ç¹ä½æ°(decimal scale)</entry>
+ </row>
+ <row>
+ <entry><literal>not-null</literal></entry>
+ <entry><literal>true|false</literal></entry>
+ <entry>ææå段æ¯å¦åºè¯¥æ¯é空ç</entry>
+ </row>
+ <row>
+ <entry><literal>unique</literal></entry>
+ <entry><literal>true|false</literal></entry>
+ <entry>æææ¯å¦è¯¥å段å
·ææä¸çº¦æ</entry>
+ </row>
+ <row>
+ <entry><literal>index</literal></entry>
+ <entry><literal>index_name</literal></entry>
+ <entry>ææä¸ä¸ªï¼å¤å段ï¼çç´¢å¼(index)çåå</entry>
+ </row>
+ <row>
+ <entry><literal>unique-key</literal></entry>
+ <entry><literal>unique_key_name</literal></entry>
+ <entry>ææå¤å段æä¸çº¦æçååï¼åè§ä¸é¢ç说æï¼</entry>
+ </row>
+ <row>
+ <entry><literal>foreign-key</literal></entry>
+ <entry><literal>foreign_key_name</literal></entry>
+ <entry>
+ specifies the name of the foreign key constraint generated
+ for an association, for a <literal><one-to-one></literal>,
+ <literal><many-to-one></literal>, <literal><key></literal>,
+ or <literal><many-to-many></literal> mapping element. Note that
+ <literal>inverse="true"</literal> sides will not be considered
+ by <literal>SchemaExport</literal>.
+ ææä¸ä¸ªå¤é®çååï¼å®æ¯ä¸ºå
³èçæçï¼æè
<literal><one-to-one></literal>ï¼<literal><many-to-one></literal>, <literal><key></literal>, æè
<literal><many-to-many></literal>æ å°å
ç´ ã注æ<literal>inverse="true"</literal>å¨<literal>SchemaExport</literal>æ¶ä¼è¢«å¿½ç¥ã
+
+ </entry>
+ </row>
+ <row>
+ <entry><literal>sql-type</literal></entry>
+ <entry><literal>SQL å段类å</literal></entry>
+ <entry>
+ è¦çé»è®¤çå段类å(åªè½ç¨äº<literal><column></literal>å±æ§ï¼
+ </entry>
+ </row>
+ <row>
+ <entry><literal>default</literal></entry>
+ <entry>SQL表达å¼</entry>
+ <entry>
+ 为å段æå®é»è®¤å¼
+ </entry>
+ </row>
+ <row>
+ <entry><literal>check</literal></entry>
+ <entry>SQL 表达å¼</entry>
+ <entry>
+ 对å段æ表å å
¥SQL约ææ£æ¥
+ </entry>
+ </row>
+
+ </tbody>
+ </tgroup>
+ </table>
+
+ <para>
+ <literal><comment></literal>å
ç´ å¯ä»¥è®©ä½ å¨çæçschemaä¸å å
¥æ³¨éã
+ </para>
+
+ <programlisting><![CDATA[<class name="Customer" table="CurCust">
+ <comment>Current customers only</comment>
+ ...
+</class>]]></programlisting>
+
+ <programlisting><![CDATA[<property name="balance">
+ <column name="bal">
+ <comment>Balance in USD</comment>
+ </column>
+</property>]]></programlisting>
+
+ <para>
+ ç»ææ¯å¨çæçDDLä¸å
å«<literal>comment on table</literal> æè
+ <literal>comment on column</literal>è¯å¥(åè¥æ¯æçè¯)ã
+ </para>
+
+ </sect2>
+
+ <sect2 id="toolsetguide-s1-3" revision="2">
+ <title>è¿è¡è¯¥å·¥å
·</title>
+
+ <para>
+ <literal>SchemaExport</literal>å·¥å
·æDDLèæ¬åå°æ åè¾åºï¼åæ¶/æè
æ§è¡DDLè¯å¥ã
+ </para>
+
+ <para>
+ <literal>java -cp </literal><emphasis>hibernate_classpaths</emphasis>
+ <literal>org.hibernate.tool.hbm2ddl.SchemaExport</literal> <emphasis>options mapping_files</emphasis>
+ </para>
+
+ <table frame="topbot">
+ <title><literal>SchemaExport</literal>å½ä»¤è¡é项</title>
+ <tgroup cols="2">
+ <colspec colwidth="1.5*"/>
+ <colspec colwidth="2*"/>
+ <thead>
+ <row>
+ <entry>é项</entry>
+ <entry>说æ</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry><literal>--quiet</literal></entry>
+ <entry>ä¸è¦æèæ¬è¾åºå°stdout</entry>
+ </row>
+ <row>
+ <entry><literal>--drop</literal></entry>
+ <entry>åªè¿è¡drop tablesçæ¥éª¤</entry>
+ </row>
+ <row>
+ <entry><literal>--create</literal></entry>
+ <entry>åªå建表</entry>
+ </row>
+ <row>
+ <entry><literal>--text</literal></entry>
+ <entry>ä¸æ§è¡å¨æ°æ®åºä¸è¿è¡çæ¥éª¤</entry>
+ </row>
+ <row>
+ <entry><literal>--output=my_schema.ddl</literal></entry>
+ <entry>æè¾åºçddlèæ¬è¾åºå°ä¸ä¸ªæ件</entry>
+ </row>
+ <row>
+ <entry><literal>--naming=eg.MyNamingStrategy</literal></entry>
+ <entry>éæ©ä¸ä¸ªå½åçç¥(<literal>NamingStrategy</literal>)</entry>
+ </row>
+ <row>
+ <entry><literal>--config=hibernate.cfg.xml</literal></entry>
+ <entry>ä»XMLæ件读å
¥Hibernateé
ç½®</entry>
+ </row>
+ <row>
+ <entry><literal>--properties=hibernate.properties</literal></entry>
+ <entry>ä»æ件读å
¥æ°æ®åºå±æ§</entry>
+ </row>
+ <row>
+ <entry><literal>--format</literal></entry>
+ <entry>æèæ¬ä¸çSQLè¯å¥å¯¹é½åç¾å</entry>
+ </row>
+ <row>
+ <entry><literal>--delimiter=;</literal></entry>
+ <entry>为èæ¬è®¾ç½®è¡ç»æ符</entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </table>
+
+ <para>
+ ä½ çè³å¯ä»¥å¨ä½ çåºç¨ç¨åºä¸åµå
¥<literal>SchemaExport</literal>å·¥å
·:
+ </para>
+
+ <programlisting><![CDATA[Configuration cfg = ....;
+new SchemaExport(cfg).create(false, true);]]></programlisting>
+
+ </sect2>
+
+ <sect2 id="toolsetguide-s1-4">
+ <title>å±æ§(Properties)</title>
+
+ <para>
+ å¯ä»¥éè¿å¦ä¸æ¹å¼æå®æ°æ®åºå±æ§:
+ </para>
+
+ <itemizedlist spacing="compact">
+ <listitem>
+ <para>éè¿<literal>-D</literal><emphasis><property></emphasis>ç³»ç»åæ°</para>
+ </listitem>
+ <listitem>
+ <para>å¨<literal>hibernate.properties</literal>æ件ä¸</para>
+ </listitem>
+ <listitem>
+ <para>ä½äºä¸ä¸ªå
¶å®ååçpropertiesæ件ä¸,ç¶åç¨ <literal>--properties</literal>åæ°æå®</para>
+ </listitem>
+ </itemizedlist>
+
+ <para>
+ æéçåæ°å
æ¬:
+ </para>
+
+ <table frame="topbot">
+ <title>SchemaExport è¿æ¥å±æ§</title>
+ <tgroup cols="2">
+ <colspec colwidth="1.5*"/>
+ <colspec colwidth="2*"/>
+ <thead>
+ <row>
+ <entry>å±æ§å</entry>
+ <entry>说æ</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry><literal>hibernate.connection.driver_class</literal></entry>
+ <entry>jdbc driver class</entry>
+ </row>
+ <row>
+ <entry><literal>hibernate.connection.url</literal></entry>
+ <entry>jdbc url</entry>
+ </row>
+ <row>
+ <entry><literal>hibernate.connection.username</literal></entry>
+ <entry>database user</entry>
+ </row>
+ <row>
+ <entry><literal>hibernate.connection.password</literal></entry>
+ <entry>user password</entry>
+ </row>
+ <row>
+ <entry><literal>hibernate.dialect</literal></entry>
+ <entry>æ¹è¨(dialect)</entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </table>
+
+ </sect2>
+
+ <sect2 id="toolsetguide-s1-5">
+ <title>使ç¨Ant(Using Ant)</title>
+
+ <para>
+ ä½ å¯ä»¥å¨ä½ çAnt buildèæ¬ä¸è°ç¨<literal>SchemaExport</literal>:
+ </para>
+
+ <programlisting><![CDATA[<target name="schemaexport">
+ <taskdef name="schemaexport"
+ classname="org.hibernate.tool.hbm2ddl.SchemaExportTask"
+ classpathref="class.path"/>
+
+ <schemaexport
+ properties="hibernate.properties"
+ quiet="no"
+ text="no"
+ drop="no"
+ delimiter=";"
+ output="schema-export.sql">
+ <fileset dir="src">
+ <include name="**/*.hbm.xml"/>
+ </fileset>
+ </schemaexport>
+</target>]]></programlisting>
+
+ </sect2>
+
+ <sect2 id="toolsetguide-s1-6" revision="2">
+ <title>对schemaçå¢éæ´æ°(Incremental schema updates)</title>
+
+ <para>
+ <literal>SchemaUpdate</literal>å·¥å
·å¯¹å·²åå¨çschemaéç¨"å¢é"æ¹å¼è¿è¡æ´æ°ã注æ<literal>SchemaUpdate</literal>严éä¾èµäºJDBC metadata API,æ以å®å¹¶é对ææJDBC驱å¨é½ææã
+ </para>
+
+ <para>
+ <literal>java -cp </literal><emphasis>hibernate_classpaths</emphasis>
+ <literal>org.hibernate.tool.hbm2ddl.SchemaUpdate</literal> <emphasis>options mapping_files</emphasis>
+ </para>
+
+ <table frame="topbot">
+ <title><literal>SchemaUpdate</literal>å½ä»¤è¡é项</title>
+ <tgroup cols="2">
+ <colspec colwidth="1.5*"/>
+ <colspec colwidth="2*"/>
+ <thead>
+ <row>
+ <entry>é项</entry>
+ <entry>说æ</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry><literal>--quiet</literal></entry>
+ <entry>ä¸è¦æèæ¬è¾åºå°stdout</entry>
+ </row>
+ <row>
+ <entry><literal>--text</literal></entry>
+ <entry>ä¸æèæ¬è¾åºå°æ°æ®åº</entry>
+ </row>
+ <row>
+ <entry><literal>--naming=eg.MyNamingStrategy</literal></entry>
+ <entry>éæ©ä¸ä¸ªå½åçç¥ (<literal>NamingStrategy</literal>)</entry>
+ </row>
+ <row>
+ <entry><literal>--properties=hibernate.properties</literal></entry>
+ <entry>ä»æå®æ件读å
¥æ°æ®åºå±æ§</entry>
+ </row>
+ <row>
+ <entry><literal>--config=hibernate.cfg.xml</literal></entry>
+ <entry>æå®ä¸ä¸ª <literal>.cfg.xml</literal>æ件</entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </table>
+
+ <para>
+ ä½ å¯ä»¥å¨ä½ çåºç¨ç¨åºä¸åµå
¥<literal>SchemaUpdate</literal>å·¥å
·:
+ </para>
+
+ <programlisting><![CDATA[Configuration cfg = ....;
+new SchemaUpdate(cfg).execute(false);]]></programlisting>
+
+ </sect2>
+
+ <sect2 id="toolsetguide-s1-7">
+ <title>ç¨Antæ¥å¢éæ´æ°schema(Using Ant for incremental schema updates)</title>
+
+ <para>
+ ä½ å¯ä»¥å¨Antèæ¬ä¸è°ç¨<literal>SchemaUpdate</literal>ï¼
+ </para>
+
+ <programlisting><![CDATA[<target name="schemaupdate">
+ <taskdef name="schemaupdate"
+ classname="org.hibernate.tool.hbm2ddl.SchemaUpdateTask"
+ classpathref="class.path"/>
+
+ <schemaupdate
+ properties="hibernate.properties"
+ quiet="no">
+ <fileset dir="src">
+ <include name="**/*.hbm.xml"/>
+ </fileset>
+ </schemaupdate>
+</target>]]></programlisting>
+
+ </sect2>
+
+ <sect2 id="toolsetguide-s1-8" revision="1">
+ <title>Schema æ ¡éª</title>
+
+ <para>
+ <literal>SchemaValidator</literal>å·¥å
·ä¼æ¯è¾æ°æ®åºç°ç¶æ¯å¦ä¸æ å°ææ¡£âå¹é
âã注æï¼<literal>SchemaValidator</literal> 严éä¾èµäºJDBCçmetadata APIï¼å æ¤ä¸æ¯å¯¹ææçJDBC驱å¨é½éç¨ãè¿ä¸å·¥å
·å¨æµè¯çæ¶åç¹å«æç¨ã
+ </para>
+
+ <para>
+ <literal>java -cp </literal><emphasis>hibernate_classpaths</emphasis>
+ <literal>org.hibernate.tool.hbm2ddl.SchemaValidator</literal> <emphasis>options mapping_files</emphasis>
+ </para>
+
+ <table frame="topbot">
+ <title><literal>SchemaValidator</literal>å½ä»¤è¡åæ°</title>
+ <tgroup cols="2">
+ <colspec colwidth="1.5*"/>
+ <colspec colwidth="2*"/>
+ <thead>
+ <row>
+ <entry>é项</entry>
+ <entry>æè¿°</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry><literal>--naming=eg.MyNamingStrategy</literal></entry>
+ <entry>éæ©ä¸ä¸ªå½åçç¥ (<literal>NamingStrategy</literal>)</entry>
+ </row>
+ <row>
+ <entry><literal>--properties=hibernate.properties</literal></entry>
+ <entry>ä»æ件ä¸è¯»åæ°æ®åºå±æ§</entry>
+ </row>
+ <row>
+ <entry><literal>--config=hibernate.cfg.xml</literal></entry>
+ <entry>æå®ä¸ä¸ª<literal>.cfg.xml</literal>æ件</entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </table>
+
+ <para>
+ ä½ å¯ä»¥å¨ä½ çåºç¨ç¨åºä¸åµå
¥<literal>SchemaValidator</literal>ï¼
+ </para>
+
+ <programlisting><![CDATA[Configuration cfg = ....;
+new SchemaValidator(cfg).validate();]]></programlisting>
+
+ </sect2>
+
+ <sect2 id="toolsetguide-s1-9">
+ <title>使ç¨Antè¿è¡schemaæ ¡éª</title>
+
+ <para>
+ ä½ å¯ä»¥å¨Antèæ¬ä¸è°ç¨<literal>SchemaValidator</literal>:
+ </para>
+
+ <programlisting><![CDATA[<target name="schemavalidate">
+ <taskdef name="schemavalidator"
+ classname="org.hibernate.tool.hbm2ddl.SchemaValidatorTask"
+ classpathref="class.path"/>
+
+ <schemavalidator
+ properties="hibernate.properties">
+ <fileset dir="src">
+ <include name="**/*.hbm.xml"/>
+ </fileset>
+ </schemavalidator>
+</target>]]></programlisting>
+
+ </sect2>
+ </sect1>
+
+</chapter>
+
Copied: core/trunk/documentation/manual/zh-CN/src/main/docbook/content/transactions.xml (from rev 14080, core/trunk/documentation/manual/zh-CN/src/main/docbook/modules/transactions.xml)
===================================================================
--- core/trunk/documentation/manual/zh-CN/src/main/docbook/content/transactions.xml (rev 0)
+++ core/trunk/documentation/manual/zh-CN/src/main/docbook/content/transactions.xml 2007-10-09 20:10:34 UTC (rev 14081)
@@ -0,0 +1,870 @@
+<chapter id="transactions" revision="2">
+ <title>äºå¡å并å</title>
+ <para>
+ Hibernateçäºå¡å并åæ§å¶å¾å®¹æææ¡ãHibernateç´æ¥ä½¿ç¨JDBCè¿æ¥åJTAèµæºï¼ä¸æ·»å ä»»ä½éå éå®
+ è¡ä¸ºãæ们强çæ¨èä½ è±ç¹æ¶é´äºè§£JDBCç¼ç¨ï¼ANSI SQLæ¥è¯¢è¯è¨åä½ ä½¿ç¨
+ çæ°æ®åºç³»ç»çäºå¡é离è§èã
+ </para>
+
+ <para>
+ Hibernateä¸éå®å
åä¸ç对象ãä½ çåºç¨ç¨åºä¼æç
§ä½ çæ°æ®åºäºå¡çé离级å«è§å®çé£æ ·è¿ä½ã幸äºæäº<literal>Session</literal>ï¼ä½¿å¾Hibernateéè¿æ è¯ç¬¦æ¥æ¾ï¼åå®ä½æ¥è¯¢ï¼ä¸æ¯è¿åæ éå¼çæ¥è¡¨æ¥è¯¢ï¼æä¾äºå¯éå¤ç读åï¼Repeatable readsï¼åè½ï¼<literal>Session</literal>åæ¶ä¹æ¯äºå¡èå´å
çç¼åï¼cacheï¼ã
+ </para>
+
+ <para>
+ é¤äºå¯¹èªå¨ä¹è§å¹¶åæ§å¶æä¾çæ¬ç®¡çï¼é对è¡çº§æ²è§éå®ï¼Hibernateä¹æä¾äºè¾
å©çï¼è¾å°ç)APIï¼å®ä½¿ç¨äº
+ <literal>SELECT FOR UPDATE</literal>çSQLè¯æ³ãæ¬ç« åé¢ä¼è®¨è®ºä¹è§å¹¶åæ§å¶åè¿ä¸ªAPIã
+ </para>
+ <para>
+ æ们ä»<literal>Configuration</literal>å±ã<literal>SessionFactory</literal>å±, å
+ <literal>Session</literal>å±å¼å§è®¨è®ºHibernateç并è¡æ§å¶ãæ°æ®åºäºå¡ååºç¨
+ ç¨åºçé¿äºå¡ã
+ </para>
+ <sect1 id="transactions-basics" revision="1">
+ <title>Sessionåäºå¡èå´(transaction scope)</title>
+ <para>
+ <literal>SessionFactory</literal>对象çå建代价å¾æè´µï¼å®æ¯çº¿ç¨å®å
¨ç对象ï¼å®ä¸ºææçåºç¨ç¨åºçº¿ç¨æå
±äº«ãå®åªå建ä¸æ¬¡ï¼é常æ¯å¨åºç¨ç¨åºå¯å¨çæ¶åï¼ç±ä¸ä¸ª<literal>Configuraion</literal>çå®ä¾æ¥å建ã
+ </para>
+ <para>
+ <literal>Session</literal>对象çå建代价æ¯è¾å°ï¼æ¯é线ç¨å®å
¨çï¼å¯¹äºå个请æ±ï¼å个ä¼è¯ãå个ç
+ å·¥ä½åå
èè¨ï¼å®åªè¢«ä½¿ç¨ä¸æ¬¡ï¼ç¶å就丢å¼ãåªæå¨éè¦çæ¶åï¼ä¸ä¸ª<literal>Session</literal>对象
+ æä¼è·åä¸ä¸ªJDBCç<literal>Connection</literal>ï¼æä¸ä¸ª<literal>Datasource</literal>ï¼
+ 对象ï¼å æ¤åè¥ä¸ä½¿ç¨çæ¶åå®ä¸æ¶è´¹ä»»ä½èµæºã
+ </para>
+ <para>
+ æ¤å¤æ们è¿è¦èèæ°æ®åºäºå¡ãæ°æ®åºäºå¡åºè¯¥å°½å¯è½ççï¼éä½æ°æ®åºä¸çéäºç¨ã
+ æ°æ®åºé¿äºå¡ä¼é»æ¢ä½ çåºç¨ç¨åºæ©å±å°é«ç并åè´è½½ãå æ¤ï¼åè¥å¨ç¨æ·æèæé´è®©æ°æ®åºäºå¡å¼çï¼ç´å°æ´ä¸ªå·¥ä½åå
å®ææå
³éè¿ä¸ªäºå¡ï¼è¿ç»ä¸æ¯ä¸ä¸ªå¥½ç设计ã
+ </para>
+ <para>
+ ä¸ä¸ªæä½åå
(Unit of work)çèå´æ¯å¤å¤§ï¼å个çHibernate <literal>Session</literal>è½è·¨è¶å¤ä¸ª
+ æ°æ®åºäºå¡åï¼è¿æ¯ä¸ä¸ª<literal>Session</literal>çä½ç¨èå´å¯¹åºä¸ä¸ªæ°æ®åºäºå¡çèå´ï¼åºè¯¥ä½æ¶æå¼
+ <literal>Session</literal>ï¼ä½æ¶å
³é<literal>Session</literal>ï¼ï¼ä½ åå¦ä½ååæ°æ®åºäºå¡çè¾¹çå¢ï¼
+ </para>
+ <sect2 id="transactions-basics-uow" revision="1">
+ <title>æä½åå
(Unit of work)</title>
+ <para>
+ é¦å
ï¼å«ç¨<emphasis>session-per-operation</emphasis>è¿ç§å模å¼äºï¼ä¹å°±æ¯è¯´ï¼å¨å个线ç¨ä¸ï¼
+ ä¸è¦å 为ä¸æ¬¡ç®åçæ°æ®åºè°ç¨ï¼å°±æå¼åå
³éä¸æ¬¡<literal>Session</literal>ï¼æ°æ®åºäºå¡ä¹æ¯å¦æ¤ã
+ åºç¨ç¨åºä¸çæ°æ®åºè°ç¨æ¯æç
§è®¡å好ç次åºï¼åç»ä¸ºååçæä½åå
ãï¼æ³¨æï¼è¿ä¹æå³çï¼åºç¨ç¨
+ åºä¸ï¼å¨å个çSQLè¯å¥åéä¹åï¼èªå¨äºå¡æ交(auto-commit)模å¼å¤±æäºãè¿ç§æ¨¡å¼ä¸é¨ä¸ºSQLæ§å¶å°æä½è®¾è®¡çã
+ Hibernateç¦æ¢ç«å³èªå¨äºå¡æ交模å¼ï¼æè
ææåºç¨æå¡å¨ç¦æ¢ç«å³èªå¨äºå¡æ交模å¼ãï¼æ°æ®åºäºå¡ç»ä¸æ¯å¯æå¯æ çï¼ä»»ä½ä¸æ°æ®åºä¹é´çé讯é½å¿
é¡»å¨æ个äºå¡ä¸è¿è¡ï¼ä¸ç®¡ä½ æ¯å¨è¯»è¿æ¯å¨åæ°æ®ã对读æ°æ®èè¨ï¼åºè¯¥é¿å
auto-commitè¡ä¸ºï¼å 为å¾å¤å°çäºå¡æ¯ä¸ä¸ªæ¸
æ°å®ä¹çå·¥ä½åå
æ§è½å·®ãåè
ä¹æ´å®¹æç»´æ¤åæ©å±ã
+ </para>
+ <para>
+ å¨å¤ç¨æ·çclient/serveråºç¨ç¨åºä¸ï¼æ常ç¨ç模å¼æ¯ <emphasis>æ¯ä¸ªè¯·æ±ä¸ä¸ªä¼è¯(session-per-request)</emphasis>ã
+ å¨è¿ç§æ¨¡å¼ä¸ï¼æ¥èªå®¢æ·ç«¯ç请æ±è¢«åéå°æå¡å¨ç«¯ï¼å³Hibernateæä¹
åå±è¿è¡çå°æ¹ï¼ï¼ä¸
+ 个æ°çHibernate <literal>Session</literal>被æå¼ï¼å¹¶ä¸æ§è¡è¿ä¸ªæä½åå
ä¸ææçæ°æ®åºæä½ã
+ ä¸æ¦æä½å®æï¼åæ¶å¯¹å®¢æ·ç«¯çååºä¹åå¤å°±ç»ªï¼ï¼session被åæ¥ï¼ç¶åå
³éãä½ ä¹å¯ä»¥ä½¿ç¨å
+ 个æ°æ®åºäºå¡æ¥å¤ç客æ·ç«¯è¯·æ±ï¼å¨ä½ æå¼<literal>Session</literal>ä¹åå¯å¨äºå¡ï¼å¨ä½ å
³é
+ <literal>Session</literal>ä¹åæ交äºå¡ãä¼è¯å请æ±ä¹é´çå
³ç³»æ¯ä¸å¯¹ä¸çå
³ç³»ï¼è¿ç§æ¨¡å¼å¯¹
+ äºå¤§å¤æ°åºç¨ç¨åºæ¥è¯´æ¯å¾æ£çã
+ </para>
+ <para>
+ å®ç°ææ¯çæ£çææãHibernateå
ç½®äºå¯¹"å½åsession(current session)" ç管çï¼ç¨äºç®åæ¤æ¨¡å¼ãä½ è¦åçä¸åå°±æ¯å¨æå¡å¨ç«¯è¦å¤ç请æ±çæ¶åï¼å¼å¯äºå¡ï¼å¨ååºåéç»å®¢æ·ä¹åç»æäºå¡ãä½ å¯ä»¥ç¨ä»»ä½æ¹å¼æ¥å®æè¿ä¸æä½ï¼é常çæ¹æ¡æ<literal>ServletFilter</literal>ï¼å¨serviceæ¹æ³ä¸è¿è¡pointcutçAOPæ¦æªå¨ï¼æè
proxy/interception容å¨ãEJB容å¨æ¯å®ç°æ¨ªå诸å¦EJB session beanä¸çäºå¡åçï¼ç¨CMT对äºå¡è¿è¡å£°æçæ¹é¢çæ åæ段ãåè¥ä½ å³å®ä½¿ç¨ç¼ç¨å¼çäºå¡åçï¼è¯·åèæ¬ç« åé¢è®²å°çHibernate <literal>Transaction</literal> APIï¼è¿å¯¹æç¨æ§å代ç å¯ç§»æ¤æ§é½æ好å¤ã
+ </para>
+
+ <para>
+ å¨ä»»ä½æ¶é´ï¼ä»»ä½å°æ¹ï¼ä½ çåºç¨ä»£ç å¯ä»¥éè¿ç®åçè°ç¨<literal>sessionFactory.getCurrentSession()</literal>æ¥è®¿é®"å½åsession"ï¼ç¨äºå¤ç请æ±ãä½ æ»æ¯ä¼å¾å°å½åæ°æ®åºäºå¡èå´å
ç<literal>Session</literal>ãå¨ä½¿ç¨æ¬å°èµæºæJTAç¯å¢æ¶ï¼å¿
é¡»é
ç½®å®ï¼è¯·åè§<xref linkend="architecture-current-session"/>ã
+ </para>
+
+ <para>
+ ææ¶ï¼å°<literal>Session</literal>åæ°æ®åºäºå¡çè¾¹ç延伸å°"å±ç¤ºå±è¢«æ¸²æå"ä¼å¸¦æ¥ä¾¿å©ãæäºserlvetåºç¨ç¨åºå¨å¯¹è¯·æ±è¿è¡å¤çåï¼æ个åç¬ç渲ææï¼è¿ç§å»¶ä¼¸å¯¹è¿ç§ç¨åºç¹å«æç¨ãåè¥ä½ å®ç°ä½ èªå·±çæ¦æªå¨ï¼æäºå¡è¾¹ç延伸å°å±ç¤ºå±æ¸²æç»æåé常容æãç¶èï¼åè¥ä½ ä¾èµæ容å¨ç®¡çäºå¡çEJBï¼è¿å°±ä¸å¤ªå®¹æäºï¼å 为äºå¡ä¼å¨EJBæ¹æ³è¿ååç»æï¼èé£æ¯å¨ä»»ä½å±ç¤ºå±æ¸²æå¼å§ä¹åã请访é®Hibernateç½ç«å论åï¼ä½ å¯ä»¥æ¾å°<emphasis>Open Session in View</emphasis>è¿ä¸æ¨¡å¼çæ示å示ä¾ã
+ </para>
+
+ </sect2>
+
+ <sect2 id="transactions-basics-apptx" revision="1">
+ <title>é¿å¯¹è¯</title>
+ <para>
+ session-per-request模å¼ä¸ä»
ä»
æ¯ä¸ä¸ªå¯ä»¥ç¨æ¥è®¾è®¡æä½åå
çæç¨æ¦å¿µãå¾å¤ä¸å¡å¤çé½é
+ è¦ä¸ç³»åå®æ´çä¸ç¨æ·ä¹é´ç交äºï¼èè¿äºç¨æ·æ¯æ对æ°æ®åºæ交å访é®çç¨æ·ãå¨åºäºwebçåºç¨åä¼ä¸
+ åºç¨ä¸ï¼è·¨ç¨æ·äº¤äºçæ°æ®åºäºå¡æ¯æ æ³æ¥åçãèèä¸é¢çä¾åï¼
+ </para>
+ <itemizedlist>
+ <listitem>
+ <para>
+ å¨çé¢ç第ä¸å±ï¼æå¼å¯¹è¯æ¡ï¼ç¨æ·æçå°çæ°æ®æ¯è¢«ä¸ä¸ªç¹å®ç <literal>Session</literal> åæ°æ®
+ åºäºå¡è½½å
¥(load)çãç¨æ·å¯ä»¥éæä¿®æ¹å¯¹è¯æ¡ä¸çæ°æ®å¯¹è±¡ã
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ 5åéåï¼ç¨æ·ç¹å»âä¿åâï¼æææååºçä¿®æ¹è¢«æä¹
åï¼åæ¶ä»ä¹ææèªå·±æ¯å¯ä¸ä¿®æ¹è¿ä¸ªä¿¡æ¯ç人ï¼ä¸ä¼åºç°
+ ä¿®æ¹å²çªã
+ </para>
+ </listitem>
+ </itemizedlist>
+
+ <para>
+ ä»ç¨æ·çè§åº¦æ¥çï¼æ们æè¿ä¸ªæä½åå
称为é¿æ¶é´è¿è¡ç<emphasis>对è¯</emphasis>ï¼conversationï¼,æè
(or <emphasis>åºç¨äºå¡</emphasis>,application transaction)ã
+ å¨ä½ çåºç¨ç¨åºä¸ï¼å¯ä»¥æå¾å¤ç§æ¹æ³æ¥å®ç°å®ã
+ </para>
+ <para>
+ 头ä¸ä¸ªå¹¼ç¨çåæ³æ¯ï¼å¨ç¨æ·æèçè¿ç¨ä¸ï¼ä¿æ<literal>Session</literal>åæ°æ®åºäºå¡æ¯æå¼çï¼
+ ä¿ææ°æ®åºéå®ï¼ä»¥é»æ¢å¹¶åä¿®æ¹ï¼ä»èä¿è¯æ°æ®åºäºå¡é离级å«åååæä½ãè¿ç§æ¹å¼å½ç¶æ¯ä¸ä¸ªå模å¼ï¼
+ å 为éäºç¨ä¼å¯¼è´åºç¨ç¨åºæ æ³æ©å±å¹¶åç¨æ·çæ°ç®ã
+ </para>
+ <para>
+ å¾ææ¾ï¼æ们å¿
须使ç¨å¤ä¸ªæ°æ®åºäºå¡æ¥å®ç°è¿ä¸ªå¯¹è¯ãå¨è¿ä¸ªä¾åä¸ï¼ç»´æ¤ä¸å¡å¤çç
+ äºå¡é离åæäºåºç¨ç¨åºå±çé¨å责任ãä¸ä¸ªå¯¹è¯é常跨è¶å¤ä¸ªæ°æ®åºäºå¡ãå¦æä»
ä»
åªæä¸
+ 个æ°æ®åºäºå¡ï¼æåçé£ä¸ªäºå¡ï¼ä¿åæ´æ°è¿çæ°æ®ï¼èææå
¶ä»äºå¡åªæ¯å纯ç读åæ°æ®ï¼ä¾å¦å¨ä¸
+ 个跨è¶å¤ä¸ªè¯·æ±/ååºå¨æçå导é£æ ¼ç对è¯æ¡ä¸ï¼ï¼é£ä¹åºç¨ç¨åºäºå¡å°ä¿è¯å
¶ååæ§ãè¿ç§æ¹å¼æ¯å¬
+ èµ·æ¥è¿è¦å®¹æå®ç°ï¼ç¹å«æ¯å½ä½ 使ç¨äºHibernateçä¸è¿°ç¹æ§çæ¶åï¼
+ </para>
+
+ <itemizedlist>
+ <listitem>
+ <para>
+ <emphasis>èªå¨çæ¬å</emphasis> - Hibernateè½å¤èªå¨è¿è¡ä¹è§å¹¶åæ§å¶ ï¼å¦æå¨ç¨æ·æè
+ çè¿ç¨ä¸åç并åä¿®æ¹ï¼Hibernateè½å¤èªå¨æ£æµå°ãä¸è¬æ们åªå¨å¯¹è¯ç»ææ¶ææ£æ¥ã
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ <emphasis>è±ç®¡å¯¹è±¡</emphasis>ï¼Detached Objectsï¼- å¦æä½ å³å®éç¨åé¢å·²ç»è®¨è®ºè¿ç
+ <emphasis>session-per-request</emphasis>模å¼ï¼ææè½½å
¥çå®ä¾å¨ç¨æ·æèçè¿ç¨
+ ä¸é½å¤äºä¸Sessionè±ç¦»çç¶æãHibernateå
è®¸ä½ æä¸Sessionè±ç¦»ç对象éæ°å
³èå°Session
+ ä¸ï¼å¹¶ä¸å¯¹ä¿®æ¹è¿è¡æä¹
åï¼è¿ç§æ¨¡å¼è¢«ç§°ä¸º
+ <emphasis>session-per-request-with-detached-objects</emphasis>ãèªå¨çæ¬å被ç¨æ¥é离并åä¿®æ¹ã
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ <emphasis>Extended (or Long) Session</emphasis> - Hibernate ç<literal>Session</literal>
+ å¯ä»¥å¨æ°æ®åºäºå¡æ交ä¹åååºå±çJDBCè¿æ¥æå¼ï¼å½ä¸ä¸ªæ°ç客æ·ç«¯è¯·æ±å°æ¥çæ¶åï¼å®åéæ°è¿æ¥ä¸åºå±ç
+ JDBCè¿æ¥ãè¿ç§æ¨¡å¼è¢«ç§°ä¹ä¸º<emphasis>session-per-conversation</emphasis>ï¼è¿ç§æ
åµå¯
+ è½ä¼é æä¸å¿
è¦çSessionåJDBCè¿æ¥çéæ°å
³èãèªå¨çæ¬å被ç¨æ¥é离并åä¿®æ¹, <literal>Session</literal>é常ä¸å
许èªå¨flush,èæ¯æç¡®flushã
+ </para>
+ </listitem>
+ </itemizedlist>
+
+ <para>
+ <emphasis>session-per-request-with-detached-objects</emphasis> å
+ <emphasis>session-per-conversation</emphasis> åæä¼ç¼ºç¹ï¼æ们å¨æ¬ç« åé¢ä¹è§å¹¶å
+ æ§å¶é£é¨ååè¿è¡è®¨è®ºã
+ </para>
+ </sect2>
+
+ <sect2 id="transactions-basics-identity">
+ <title>å
³æ³¨å¯¹è±¡æ è¯(Considering object identity)</title>
+ <para>
+ åºç¨ç¨åºå¯è½å¨ä¸¤ä¸ªä¸åç<literal>Session</literal>ä¸å¹¶å访é®åä¸æä¹
åç¶æï¼ä½æ¯ï¼
+ ä¸ä¸ªæä¹
åç±»çå®ä¾æ æ³å¨ä¸¤ä¸ª <literal>Session</literal>ä¸å
±äº«ãå æ¤æ两ç§ä¸åçæ è¯è¯ä¹ï¼
+ </para>
+ <para>
+ <variablelist spacing="compact">
+ <varlistentry>
+ <term>æ°æ®åºæ è¯</term>
+ <listitem>
+ <para>
+ <literal>foo.getId().equals( bar.getId() )</literal>
+ </para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>JVM æ è¯</term>
+ <listitem>
+ <para>
+ <literal>foo==bar</literal>
+ </para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+
+ <para>
+ 对äºé£äºå
³èå° <emphasis>ç¹å®</emphasis><literal>Session</literal>
+ ï¼ä¹å°±æ¯å¨å个<literal>Session</literal>çèå´å
ï¼ä¸ç对象æ¥è¯´ï¼è¿
+ 两ç§æ è¯çè¯ä¹æ¯çä»·çï¼ä¸æ°æ®åºæ è¯å¯¹åºçJVMæ è¯æ¯ç±Hibernateæ¥ä¿
+ è¯çãä¸è¿ï¼å½åºç¨ç¨åºå¨ä¸¤ä¸ªä¸åçsessionä¸å¹¶å访é®å
·æåä¸æä¹
åæ
+ è¯çä¸å¡å¯¹è±¡å®ä¾çæ¶åï¼è¿ä¸ªä¸å¡å¯¹è±¡ç两个å®ä¾äºå®ä¸æ¯ä¸ç¸åçï¼ä»
+ JVMè¯å«æ¥çï¼ãè¿ç§å²çªå¯ä»¥éè¿å¨åæ¥åæ交çæ¶å使ç¨èªå¨çæ¬ååä¹
+ è§éå®æ¹æ³æ¥è§£å³ã
+ </para>
+ <para>
+ è¿ç§æ¹å¼æå
³äºå¹¶åç头ç¼é®é¢çç»äºHibernateåæ°æ®åºï¼ç±äºå¨å个线ç¨å
ï¼æä½åå
ä¸ç对象è¯å«ä¸
+ éè¦ä»£ä»·æè´µçéå®æå
¶ä»æä¹ä¸çåæ¥ï¼å æ¤å®åæ¶å¯ä»¥æä¾æ好çå¯ä¼¸ç¼©æ§ãåªè¦å¨å个线ç¨åªææä¸ä¸ª
+ <literal>Session</literal>ï¼åºç¨ç¨åºå°±ä¸éè¦åæ¥ä»»ä½ä¸å¡å¯¹è±¡ãå¨<literal>Session</literal>
+ çèå´å
ï¼åºç¨ç¨åºå¯ä»¥æ¾å¿ç使ç¨<literal>==</literal>è¿è¡å¯¹è±¡æ¯è¾ã
+ </para>
+ <para>
+ ä¸è¿ï¼åºç¨ç¨åºå¨<literal>Session</literal>çå¤é¢ä½¿ç¨<literal>==</literal>è¿è¡å¯¹è±¡æ¯è¾å¯è½ä¼
+ 导è´æ æ³é¢æçç»æãå¨ä¸äºæ æ³é¢æçåºåï¼ä¾å¦ï¼å¦æä½ æ两个è±ç®¡å¯¹è±¡å®ä¾æ¾è¿åä¸ä¸ª
+ <literal>Set</literal>çæ¶åï¼å°±å¯è½åçãè¿ä¸¤ä¸ªå¯¹è±¡å®ä¾å¯è½æåä¸ä¸ªæ°æ®åºæ è¯ï¼ä¹å°±æ¯è¯´ï¼
+ ä»ä»¬ä»£è¡¨äºè¡¨çåä¸è¡æ°æ®ï¼ï¼ä»JVMæ è¯çå®ä¹ä¸æ¥è¯´ï¼å¯¹è±ç®¡ç对象èè¨ï¼Hibernateæ æ³ä¿è¯ä»ä»¬
+ ççJVMæ è¯ä¸è´ãå¼å人åå¿
é¡»è¦çæä¹
åç±»ç<literal>equals()</literal>æ¹æ³å
+ <literal>hashCode()</literal> æ¹æ³ï¼ä»èå®ç°èªå®ä¹ç对象ç¸çè¯ä¹ãè¦åï¼ä¸è¦ä½¿ç¨æ°æ®åºæ è¯
+ æ¥å®ç°å¯¹è±¡ç¸çï¼åºè¯¥ä½¿ç¨ä¸å¡é®å¼ï¼ç±å¯ä¸çï¼é常ä¸åçå±æ§ç»æãå½ä¸ä¸ªç¬æ¶å¯¹è±¡è¢«æä¹
åçæ¶
+ åï¼å®çæ°æ®åºæ è¯ä¼åçæ¹åãå¦æä¸ä¸ªç¬æ¶å¯¹è±¡ï¼é常ä¹å
æ¬è±ç®¡å¯¹è±¡å®ä¾ï¼è¢«æ¾å
¥ä¸
+ 个<literal>Set</literal>ï¼æ¹åå®çhashcodeä¼å¯¼è´ä¸è¿ä¸ª<literal>Set</literal>çå
³ç³»ä¸æãè½
+ ç¶ä¸å¡é®å¼çå±æ§ä¸è±¡æ°æ®åºä¸»é®é£æ ·ç¨³å®ä¸åï¼ä½æ¯ä½ åªéè¦ä¿è¯å¨åä¸ä¸ª<literal>Set</literal>
+ ä¸ç对象å±æ§ç稳å®æ§å°±è¶³å¤äºã请å°Hibernateç½ç«å»å¯»æ±è¿ä¸ªé®é¢æ´å¤ç详ç»ç讨论ã请注æï¼è¿ä¸æ¯ä¸
+ 个æå
³Hibernateçé®é¢ï¼èä»
ä»
æ¯ä¸ä¸ªå
³äºJava对象æ è¯åå¤çè¡ä¸ºå¦ä½å®ç°çé®é¢ã
+ </para>
+ </para>
+ </sect2>
+
+ <sect2 id="transactions-basics-issues">
+ <title>常è§é®é¢</title>
+ <para>
+ å³ä¸è¦ä½¿ç¨å模å¼<emphasis>session-per-user-session</emphasis>æè
<emphasis>
+ session-per-application</emphasis>ï¼å½ç¶ï¼è¿ä¸ªè§å®å ä¹æ²¡æä¾å¤ï¼ã请注æï¼
+ ä¸è¿°ä¸äºé®é¢å¯è½ä¹ä¼åºç°å¨æ们æ¨èç模å¼ä¸ï¼å¨ä½ ä½åºæ个设计å³å®ä¹åï¼è¯·å¡å¿
ç解该模å¼çåºç¨åæã
+ </para>
+ <itemizedlist>
+ <listitem>
+ <para>
+ <literal>Session</literal> 对象æ¯é线ç¨å®å
¨çãå¦æä¸ä¸ª<literal>Session</literal>
+ å®ä¾å
许å
±äº«çè¯ï¼é£äºæ¯æ并åè¿è¡çä¸ä¸ï¼ä¾å¦HTTP requestï¼session beans,æè
æ¯
+ Swing workersï¼å°ä¼å¯¼è´åºç°èµæºäºç¨ï¼race conditionï¼ãå¦æå¨<literal>HttpSession</literal>ä¸æ
+ Hibernate ç<literal>Session</literal>çè¯ï¼ç¨å讨论ï¼ï¼ä½ åºè¯¥èèåæ¥è®¿é®ä½ çHttp sessionã
+ å¦åï¼åªè¦ç¨æ·è¶³å¤å¿«çç¹å»æµè§å¨çâå·æ°âï¼å°±ä¼å¯¼è´ä¸¤ä¸ªå¹¶åè¿è¡çº¿ç¨ä½¿ç¨åä¸ä¸ª
+ <literal>Session</literal>ã
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ ä¸ä¸ªç±Hibernateæåºçå¼å¸¸æå³çä½ å¿
é¡»ç«å³åæ»æ°æ®åºäºå¡ï¼å¹¶ç«å³å
³é<literal>Session</literal>
+ ï¼ç¨åä¼å±å¼è®¨è®ºï¼ãå¦æä½ ç<literal>Session</literal>ç»å®å°ä¸ä¸ªåºç¨ç¨åºä¸ï¼ä½ å¿
+ é¡»åæ¢è¯¥åºç¨ç¨åºãåæ»æ°æ®åºäºå¡å¹¶ä¸ä¼æä½ çä¸å¡å¯¹è±¡éåå°äºå¡å¯å¨æ¶åçç¶æãè¿
+ æå³çæ°æ®åºç¶æåä¸å¡å¯¹è±¡ç¶æä¸åæ¥ãé常æ
åµä¸ï¼è¿ä¸æ¯ä»ä¹é®é¢ï¼å 为å¼å¸¸æ¯ä¸å¯
+ æ¢å¤ç,ä½ å¿
é¡»å¨åæ»ä¹åéæ°å¼å§æ§è¡ã
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ <literal>Session</literal> ç¼åäºå¤äºæä¹
åç¶æçæ¯ä¸ªå¯¹è±¡ï¼Hibernateä¼çè§åæ£æ¥èæ°æ®ï¼ã
+ è¿æå³çï¼å¦æä½ è®©<literal>Session</literal>æå¼å¾é¿ä¸æ®µæ¶é´ï¼ææ¯ä»
ä»
è½½å
¥äºè¿å¤çæ°æ®ï¼
+ <literal>Session</literal>å ç¨çå
åä¼ä¸ç´å¢é¿ï¼ç´å°æåºOutOfMemoryExceptionå¼å¸¸ãè¿ä¸ª
+ é®é¢çä¸ä¸ªè§£å³æ¹æ³æ¯è°ç¨<literal>clear()</literal> å<literal>evict()</literal>æ¥ç®¡ç
+ <literal>Session</literal>çç¼åï¼ä½æ¯å¦æä½ éè¦å¤§æ¹éæ°æ®æä½çè¯ï¼æ好èè
+ 使ç¨åå¨è¿ç¨ãå¨<xref linkend="batch"/>ä¸æä¸äºè§£å³æ¹æ¡ãå¨ç¨æ·ä¼è¯æé´ä¸ç´ä¿æ
+ <literal>Session</literal>æå¼ä¹æå³çåºç°èæ°æ®çå¯è½æ§å¾é«ã
+ </para>
+ </listitem>
+ </itemizedlist>
+
+ </sect2>
+
+ </sect1>
+
+ <sect1 id="transactions-demarcation">
+ <title>æ°æ®åºäºå¡å£°æ</title>
+ <para>
+ æ°æ®åºï¼æè
ç³»ç»ï¼äºå¡ç声ææ»æ¯å¿
é¡»çãå¨æ°æ®åºäºå¡ä¹å¤ï¼å°±æ æ³åæ°æ®åºé讯ï¼è¿å¯è½ä¼è®©é£äºä¹ æ¯äº
+ èªå¨æ交äºå¡æ¨¡å¼çå¼å人åæå°è¿·æï¼ãæ°¸è¿ä½¿ç¨æ¸
æ°çäºå¡å£°æï¼å³ä½¿åªè¯»æä½ä¹æ¯å¦æ¤ãè¿è¡
+ æ¾å¼çäºå¡å£°æ并ä¸æ»æ¯éè¦çï¼è¿åå³äºä½ çäºå¡é离级å«åæ°æ®åºçè½åï¼ä½ä¸ç®¡æä¹è¯´ï¼å£°æäºå¡æ»å½æçæ 害ãå½ç¶ï¼ä¸ä¸ªåç¬çæ°æ®åºäºå¡æ»æ¯æ¯å¾å¤çç¢çäºå¡æ§è½æ´å¥½ï¼å³æ¶å¯¹è¯»æ°æ®èè¨ä¹æ¯ä¸æ ·ã
+ </para>
+ <para>
+ ä¸ä¸ªHibernateåºç¨ç¨åºå¯ä»¥è¿è¡å¨éæ管ç¯å¢ä¸ï¼ä¹å°±æ¯ç¬ç«è¿è¡çåºç¨ç¨åºï¼ç®åWebåºç¨ç¨åºï¼
+ æè
Swingå¾å½¢æ¡é¢åºç¨ç¨åºï¼ï¼ä¹å¯ä»¥è¿è¡å¨æ管çJ2EEç¯å¢ä¸ãå¨ä¸ä¸ªéæ管ç¯å¢ä¸ï¼Hibernate
+ é常èªå·±è´è´£ç®¡çæ°æ®åºè¿æ¥æ± ãåºç¨ç¨åºå¼å人åå¿
é¡»æ工设置äºå¡å£°æï¼æ¢å¥è¯è¯´ï¼å°±æ¯æå·¥å¯
+ å¨ï¼æ交ï¼æè
åæ»æ°æ®åºäºå¡ãä¸ä¸ªæ管çç¯å¢é常æä¾äºå®¹å¨ç®¡çäºå¡(CMT)ï¼ä¾å¦äºå¡è£
é
éè¿å¯å£°
+ æçæ¹å¼å®ä¹å¨EJB session beansçé¨ç½²æ述符ä¸ãå¯ç¼ç¨å¼äºå¡å£°æä¸åéè¦ï¼å³ä½¿æ¯
+ <literal>Session</literal> çåæ¥ä¹å¯ä»¥èªå¨å®æã
+ </para>
+ <para>
+ 让æä¹
å±å
·å¤å¯ç§»æ¤æ§æ¯äººä»¬ççæ³,è¿ç§ç§»æ¤åçå¨éæ管çæ¬å°èµæºç¯å¢ï¼ä¸ä¾èµJTAä½æ¯ä½¿ç¨BMTèéCMTçç³»ç»ä¹é´ãå¨ä¸¤ç§æ
åµä¸ä½ é½å¯ä»¥ä½¿ç¨ç¼ç¨å¼çäºå¡ç®¡çãHibernateæä¾äºä¸å¥ç§°ä¸º<literal>Transaction</literal>çå°è£
APIï¼
+ ç¨æ¥æä½ çé¨ç½²ç¯å¢ä¸çæ¬å°äºå¡ç®¡çç³»ç»è½¬æ¢å°Hibernateäºå¡ä¸ãè¿ä¸ªAPIæ¯å¯éçï¼ä½æ¯æ们强ç
+ æ¨èä½ ä½¿ç¨ï¼é¤éä½ ç¨CMT session beanã
+ </para>
+ <para>
+ é常æ
åµä¸ï¼ç»æ <literal>Session</literal> å
å«äºå个ä¸åçé¶æ®µ:
+ </para>
+ <itemizedlist spacing="compact">
+ <listitem>
+ <para>
+ åæ¥session(flush,å·åºå°ç£çï¼
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ æ交äºå¡
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ å
³ésession
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ å¤çå¼å¸¸
+ </para>
+ </listitem>
+ </itemizedlist>
+
+
+ <para>
+ sessionçåæ¥(flush,å·åºï¼åé¢å·²ç»è®¨è®ºè¿äºï¼æ们ç°å¨è¿ä¸æ¥èå¯å¨æ管åéæ管ç¯å¢ä¸çäºå¡å£°æåå¼å¸¸å¤çã
+ </para>
+
+ <sect2 id="transactions-demarcation-nonmanaged" revision="2">
+ <title>éæ管ç¯å¢</title>
+ <para>
+ å¦æHibernatæä¹
å±è¿è¡å¨ä¸ä¸ªéæ管ç¯å¢ä¸ï¼æ°æ®åºè¿æ¥é常ç±Hibernateçç®åï¼å³éDataSource)è¿æ¥æ± æºå¶
+ æ¥å¤çãsession/transactionå¤çæ¹å¼å¦ä¸æ示ï¼
+ </para>
+ <programlisting><![CDATA[//Non-managed environment idiom
+Session sess = factory.openSession();
+Transaction tx = null;
+try {
+ tx = sess.beginTransaction();
+
+ // do some work
+ ...
+
+ tx.commit();
+}
+catch (RuntimeException e) {
+ if (tx != null) tx.rollback();
+ throw e; // or display error message
+}
+finally {
+ sess.close();
+}]]></programlisting>
+ <para>
+ ä½ ä¸éè¦æ¾å¼<literal>flush()</literal> <literal>Session</literal> -
+ 对<literal>commit()</literal>çè°ç¨ä¼èªå¨è§¦åsessionçåæ¥(åå³äºsessionç<xref linkend="objectstate-flushing">FlushMode</xref>)ãè°ç¨ <literal>close()</literal> æ å¿sessionçç»æã<literal>close()</literal>æ¹æ³éè¦çæ示æ¯ï¼<literal>session</literal>éæ¾äºJDBCè¿æ¥ãè¿æ®µJava代ç å¨éæ管ç¯å¢ä¸åJTAç¯å¢ä¸é½å¯ä»¥è¿è¡ã
+ </para>
+
+ <para>
+ æ´å çµæ´»çæ¹æ¡æ¯Hibernateå
ç½®ç"current session"ä¸ä¸æ管çï¼åæå·²ç»è®²è¿ï¼
+ </para>
+
+ <programlisting><![CDATA[// Non-managed environment idiom with getCurrentSession()
+try {
+ factory.getCurrentSession().beginTransaction();
+
+ // do some work
+ ...
+
+ factory.getCurrentSession().getTransaction().commit();
+}
+catch (RuntimeException e) {
+ factory.getCurrentSession().getTransaction().rollback();
+ throw e; // or display error message
+}]]></programlisting>
+
+ <para>
+ ä½ å¾å¯è½ä»æªå¨ä¸ä¸ªé常çåºç¨ç¨åºçä¸å¡ä»£ç ä¸è§è¿è¿æ ·ç代ç çæï¼è´å½çï¼ç³»ç»ï¼å¼å¸¸åºè¯¥æ»æ¯
+ å¨åºç¨ç¨åºâ顶å±â被æè·ãæ¢å¥è¯è¯´ï¼æ§è¡Hibernateè°ç¨ç代ç ï¼å¨æä¹
å±ï¼åå¤ç
+ <literal>RuntimeException</literal>å¼å¸¸ç代ç ï¼é常åªè½æ¸
çåéåºåºç¨ç¨åºï¼åºè¯¥å¨ä¸å
+ çåºç¨ç¨åºé»è¾å±ãHibernateçå½åä¸ä¸æ管çå¯ä»¥æ大å°ç®åè¿ä¸è®¾è®¡ï¼ä½ ææçä¸åå°±æ¯<literal>SessionFactory</literal>ã å¼å¸¸å¤çå°å¨æ¬ç« ç¨åè¿è¡è®¨è®ºã
+ </para>
+
+ <para>
+ 请注æï¼ä½ åºè¯¥éæ© <literal>org.hibernate.transaction.JDBCTransactionFactory</literal>
+ (è¿æ¯é»è®¤é项)ï¼å¯¹ç¬¬äºä¸ªä¾åæ¥è¯´ï¼<literal>hibernate.current_session_context_class</literal>åºè¯¥æ¯<literal>"thread"</literal>
+ </para>
+
+ </sect2>
+
+ <sect2 id="transactions-demarcation-jta" revision="3">
+ <title>使ç¨JTA</title>
+ <para>
+ å¦æä½ çæä¹
å±è¿è¡å¨ä¸ä¸ªåºç¨æå¡å¨ä¸ï¼ä¾å¦ï¼å¨EJB session beansçåé¢ï¼ï¼Hibernateè·å
+ çæ¯ä¸ªæ°æ®æºè¿æ¥å°èªå¨æ为å
¨å±JTAäºå¡çä¸é¨åã
+ ä½ å¯ä»¥å®è£
ä¸ä¸ªç¬ç«çJTAå®ç°ï¼ä½¿ç¨å®èä¸ä½¿ç¨EJBãHibernateæä¾äºä¸¤ç§çç¥è¿è¡JTAéæã
+ </para>
+
+ <para>
+ å¦æä½ ä½¿ç¨bean管çäºå¡ï¼BMTï¼ï¼å¯ä»¥éè¿ä½¿ç¨Hibernateç <literal>Transaction</literal> APIæ¥åè¯
+ åºç¨æå¡å¨å¯å¨åç»æBMTäºå¡ãå æ¤ï¼äºå¡ç®¡ç代ç åå¨éæ管ç¯å¢ä¸æ¯ä¸æ ·çã
+ </para>
+
+ <programlisting><![CDATA[// BMT idiom
+Session sess = factory.openSession();
+Transaction tx = null;
+try {
+ tx = sess.beginTransaction();
+
+ // do some work
+ ...
+
+ tx.commit();
+}
+catch (RuntimeException e) {
+ if (tx != null) tx.rollback();
+ throw e; // or display error message
+}
+finally {
+ sess.close();
+}]]></programlisting>
+
+ <para>
+ å¦æä½ å¸æ使ç¨ä¸äºå¡ç»å®ç<literal>Session</literal>ï¼ä¹å°±æ¯ä½¿ç¨<literal>getCurrentSession()</literal>æ¥ç®åä¸ä¸æ管çï¼ä½ å°ä¸å¾ä¸ç´æ¥ä½¿ç¨JTA <literal>UserTransaction</literal>APIã
+ </para>
+
+ <programlisting><![CDATA[// BMT idiom with getCurrentSession()
+try {
+ UserTransaction tx = (UserTransaction)new InitialContext()
+ .lookup("java:comp/UserTransaction");
+
+ tx.begin();
+
+ // Do some work on Session bound to transaction
+ factory.getCurrentSession().load(...);
+ factory.getCurrentSession().persist(...);
+
+ tx.commit();
+}
+catch (RuntimeException e) {
+ tx.rollback();
+ throw e; // or display error message
+}]]></programlisting>
+
+
+ <para>
+ å¨CMTæ¹å¼ä¸ï¼äºå¡å£°ææ¯å¨session beançé¨ç½²æ述符ä¸ï¼èä¸éè¦ç¼ç¨ã
+ å æ¤ï¼ä»£ç 被ç®å为:
+ </para>
+
+ <programlisting><![CDATA[// CMT idiom
+Session sess = factory.getCurrentSession();
+
+// do some work
+...
+
+]]></programlisting>
+
+ <para>
+ å¨CMT/EJBä¸çè³ä¼èªå¨rollbackï¼å 为åè¥ææªæè·ç<literal>RuntimeException</literal>ä»session beanæ¹æ³ä¸æåºï¼è¿å°±ä¼éç¥å®¹å¨æå
¨å±äºå¡åæ»ã<emphasis>è¿å°±æå³çï¼å¨BMTæè
CMTä¸ï¼ä½ æ ¹æ¬å°±ä¸éè¦ä½¿ç¨Hibernate <literal>Transaction</literal> API ï¼ä½ èªå¨å¾å°äºç»å®å°äºå¡çâå½åâSessionã
+ </emphasis>
+ </para>
+
+ <para>
+ 注æï¼å½ä½ é
ç½®Hibernateçtransaction factoryçæ¶åï¼å¨ç´æ¥ä½¿ç¨JTAçæ¶åï¼BMTï¼ï¼ä½ åºè¯¥éæ©<literal>org.hibernate.transaction.JTATransactionFactory</literal>,å¨CMT session beanä¸éæ©<literal>org.hibernate.transaction.CMTTransactionFactory</literal>ãè®°å¾ä¹è¦è®¾ç½®<literal>hibernate.transaction.manager_lookup_class</literal>ãè¿æï¼ç¡®è®¤ä½ ç<literal>hibernate.current_session_context_class</literal>æªè®¾ç½®ï¼ä¸ºäºåä¸å
¼å®¹ï¼ï¼æè
设置为<literal>"jta"</literal>ã
+ </para>
+
+ <para>
+ <literal>getCurrentSession()</literal>å¨JTAç¯å¢ä¸æä¸ä¸ªå¼ç«¯ã对<literal>after_statement</literal>è¿æ¥éæ¾æ¹å¼æä¸ä¸ªè¦åï¼è¿æ¯è¢«é»è®¤ä½¿ç¨çãå 为JTAè§èçä¸ä¸ªå¾æè ¢çéå¶ï¼Hibernateä¸å¯è½èªå¨æ¸
çä»»ä½æªå
³éç<literal>ScrollableResults</literal> æè
<literal>Iterator</literal>ï¼å®ä»¬æ¯ç±<literal>scroll()</literal>æ<literal>iterate()</literal>产ççãä½ <emphasis>must</emphasis>éè¿å¨<literal>finally</literal>åä¸ï¼æ¾å¼è°ç¨<literal>ScrollableResults.close()</literal>æè
<literal>Hibernate.close(Iterator)</literal>æ¹æ³æ¥éæ¾åºå±æ°æ®åºæ¸¸æ ã(å½ç¶ï¼å¤§é¨åç¨åºå®å
¨å¯ä»¥å¾å®¹æçé¿å
å¨JTAæCMT代ç ä¸åºç°<literal>scroll()</literal>æ<literal>iterate()</literal>ã)
+ </para>
+
+
+ </sect2>
+
+
+
+ <sect2 id="transactions-demarcation-exceptions">
+ <title>å¼å¸¸å¤ç</title>
+ <para>
+ å¦æ <literal>Session</literal> æåºå¼å¸¸ (å
æ¬ä»»ä½<literal>SQLException</literal>),
+ ä½ åºè¯¥ç«å³åæ»æ°æ®åºäºå¡ï¼è°ç¨ <literal>Session.close()</literal> ï¼ä¸¢å¼è¯¥
+ <literal>Session</literal>å®ä¾ã<literal>Session</literal>çæäºæ¹æ³å¯è½ä¼å¯¼è´session
+ å¤äºä¸ä¸è´çç¶æãææç±Hibernateæåºçå¼å¸¸é½è§ä¸ºä¸å¯ä»¥æ¢å¤çãç¡®ä¿å¨
+ <literal>finally</literal> 代ç åä¸è°ç¨<literal>close()</literal>æ¹æ³ï¼ä»¥å
³éæ
+ <literal>Session</literal>ã
+ </para>
+ <para>
+ <literal>HibernateException</literal>æ¯ä¸ä¸ªéæ£æ¥æå¼å¸¸ï¼è¿ä¸åäºHibernateèççæ¬ï¼ï¼
+ å®å°è£
äºHibernateæä¹
å±å¯è½åºç°ç大å¤æ°é误ãæ们çè§ç¹æ¯ï¼ä¸åºè¯¥å¼ºè¿«åºç¨ç¨åºå¼å人å
+ å¨åºå±æè·æ æ³æ¢å¤çå¼å¸¸ãå¨å¤§å¤æ°è½¯ä»¶ç³»ç»ä¸ï¼éæ£æ¥æå¼å¸¸åè´å½å¼å¸¸é½æ¯å¨ç¸åºæ¹æ³è°ç¨
+ çå æ ç顶å±è¢«å¤ççï¼ä¹å°±æ¯è¯´ï¼å¨è½¯ä»¶ä¸é¢çé»è¾å±ï¼ï¼å¹¶ä¸æä¾ä¸ä¸ªé误信æ¯ç»åºç¨è½¯ä»¶çç¨æ·
+ ï¼æè
éåå
¶ä»æäºç¸åºçæä½ï¼ã请注æï¼Hibernateä¹æå¯è½æåºå
¶ä»å¹¶ä¸å±äº
+ <literal>HibernateException</literal>çéæ£æ¥æå¼å¸¸ãè¿äºå¼å¸¸åæ ·ä¹æ¯æ æ³æ¢å¤çï¼åºè¯¥
+ éåæäºç¸åºçæä½å»å¤çã
+ </para>
+ <para>
+ å¨åæ°æ®åºè¿è¡äº¤äºæ¶ï¼Hibernateææè·ç<literal>SQLException</literal>å°è£
为Hibernateç
+ <literal>JDBCException</literal>ãäºå®ä¸ï¼Hibernateå°è¯æå¼å¸¸è½¬æ¢ä¸ºæ´æå®é
å«ä¹
+ ç<literal>JDBCException</literal>å¼å¸¸çåç±»ãåºå±ç<literal>SQLException</literal>å¯ä»¥
+ éè¿<literal>JDBCException.getCause()</literal>æ¥å¾å°ãHibernateéè¿ä½¿ç¨å
³èå°
+ <literal>SessionFactory</literal>ä¸ç<literal>SQLExceptionConverter</literal>æ¥
+ æ<literal>SQLException</literal>转æ¢ä¸ºä¸ä¸ªå¯¹åºç<literal>JDBCException</literal>
+ å¼å¸¸çåç±»ãé»è®¤æ
åµä¸ï¼<literal>SQLExceptionConverter</literal>å¯ä»¥éè¿é
ç½®dialect
+ é项æå®ï¼æ¤å¤ï¼ä¹å¯ä»¥ä½¿ç¨ç¨æ·èªå®ä¹çå®ç°ç±»ï¼åèjavadocs
+ <literal>SQLExceptionConverterFactory</literal>ç±»æ¥äºè§£è¯¦æ
ï¼ãæ åç
+ <literal>JDBCException</literal>åç±»åæ¯ï¼
+ </para>
+ <itemizedlist spacing="compact">
+ <listitem>
+ <para>
+ <literal>JDBCConnectionException</literal> - ææåºå±çJDBCé讯åºç°é误
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ <literal>SQLGrammarException</literal> - ææåéçSQLè¯å¥çè¯æ³æè
æ ¼å¼é误
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ <literal>ConstraintViolationException</literal> - æææç§ç±»åç约æè¿ä¾é误
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ <literal>LockAcquisitionException</literal> - ææäºå¨æ§è¡è¯·æ±æä½æ¶ï¼è·å
+ æéçé级å«æ¶åºç°çé误ã
+
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ <literal>GenericJDBCException</literal> - ä¸å±äºä»»ä½å
¶ä»ç§ç±»çåçå¼å¸¸
+ </para>
+ </listitem>
+ </itemizedlist>
+
+
+ </sect2>
+
+ <sect2 id="transactions-demarcation-timeout">
+ <title>äºå¡è¶
æ¶</title>
+
+ <para>
+ EJBè¿æ ·çæ管ç¯å¢æä¸é¡¹æ为éè¦çç¹æ§ï¼èå®ä»æªå¨éæ管ç¯å¢ä¸æä¾è¿ï¼é£å°±æ¯äºå¡è¶
æ¶ãå¨åºç°é误çäºå¡è¡ä¸ºçæ¶åï¼è¶
æ¶å¯ä»¥ç¡®ä¿ä¸ä¼æ éæèµ·èµæºã对ç¨æ·æ²¡æ交代ãå¨æ管(JTA)ç¯å¢ä¹å¤ï¼Hibernateæ æ³å®å
¨æä¾è¿ä¸åè½ãä½æ¯ï¼Hiberanteè³å°å¯ä»¥æ§å¶æ°æ®è®¿é®ï¼ç¡®ä¿æ°æ®åºçº§å«çæ»éï¼åè¿å巨大ç»æéçæ¥è¯¢è¢«éå®å¨ä¸ä¸ªè§å®çæ¶é´å
ãå¨æ管ç¯å¢ä¸ï¼Hibernateä¼æäºå¡è¶
æ¶è½¬äº¤ç»JTAãè¿ä¸åè½éè¿Hibernate <literal>Transaction</literal>对象è¿è¡æ½è±¡ã
+ </para>
+
+ <programlisting><![CDATA[
+Session sess = factory.openSession();
+try {
+ //set transaction timeout to 3 seconds
+ sess.getTransaction().setTimeout(3);
+ sess.getTransaction().begin();
+
+ // do some work
+ ...
+
+ sess.getTransaction().commit()
+}
+catch (RuntimeException e) {
+ sess.getTransaction().rollback();
+ throw e; // or display error message
+}
+finally {
+ sess.close();
+}]]></programlisting>
+
+ <para>
+ 注æ<literal>setTimeout()</literal>ä¸åºè¯¥å¨CMT beanä¸è°ç¨ï¼æ¤æ¶äºå¡è¶
æ¶å¼åºè¯¥æ¯è¢«å£°æå¼å®ä¹çã
+ </para>
+
+ </sect2>
+ </sect1>
+
+ <sect1 id="transactions-optimistic">
+ <title>ä¹è§å¹¶åæ§å¶(Optimistic concurrency control)</title>
+ <para>
+ å¯ä¸è½å¤åæ¶ä¿æé«å¹¶ååé«å¯ä¼¸ç¼©æ§çæ¹æ³å°±æ¯ä½¿ç¨å¸¦çæ¬åçä¹è§å¹¶åæ§å¶ãçæ¬æ£æ¥ä½¿ç¨çæ¬å·ã
+ æè
æ¶é´æ³æ¥æ£æµæ´æ°å²çªï¼å¹¶ä¸é²æ¢æ´æ°ä¸¢å¤±ï¼ãHibernate为使ç¨ä¹è§å¹¶åæ§å¶ç代ç æä¾äºä¸ç§å¯
+ è½çæ¹æ³ï¼åºç¨ç¨åºå¨ç¼åè¿äºä»£ç æ¶ï¼å¯ä»¥éç¨å®ä»¬ãæ们已ç»å¨åé¢åºç¨ç¨åºå¯¹è¯é£é¨åå±ç¤ºäº
+ ä¹è§å¹¶åæ§å¶çåºç¨åºæ¯ï¼æ¤å¤ï¼å¨å个æ°æ®åºäºå¡èå´å
ï¼çæ¬æ£æ¥ä¹æä¾äºé²æ¢æ´æ°ä¸¢å¤±ç好å¤ã
+ </para>
+
+ <sect2 id="transactions-optimistic-manual">
+ <title>åºç¨ç¨åºçº§å«ççæ¬æ£æ¥(Application version checking)</title>
+ <para>
+ æªè½å
åå©ç¨Hibernateåè½çå®ç°ä»£ç ä¸ï¼æ¯æ¬¡åæ°æ®åºäº¤äºé½éè¦ä¸ä¸ªæ°ç
+ <literal>Session</literal>ï¼èä¸å¼å人åå¿
é¡»å¨æ¾ç¤ºæ°æ®ä¹åä»æ°æ®åºä¸é
+ æ°è½½å
¥ææçæä¹
å对象å®ä¾ãè¿ç§æ¹å¼è¿«ä½¿åºç¨ç¨åºèªå·±å®ç°çæ¬æ£æ¥æ¥ç¡®ä¿
+ 对è¯äºå¡çé离ï¼ä»æ°æ®è®¿é®çè§åº¦æ¥è¯´æ¯æä½æçãè¿ç§ä½¿ç¨æ¹å¼å
+ entity EJBæç¸ä¼¼ã
+ </para>
+
+ <programlisting><![CDATA[// foo is an instance loaded by a previous Session
+session = factory.openSession();
+Transaction t = session.beginTransaction();
+
+int oldVersion = foo.getVersion();
+session.load( foo, foo.getKey() ); // load the current state
+if ( oldVersion != foo.getVersion() ) throw new StaleObjectStateException();
+foo.setProperty("bar");
+
+t.commit();
+session.close();]]></programlisting>
+
+ <para>
+ <literal>version</literal> å±æ§ä½¿ç¨ <literal><version></literal>æ¥æ å°ï¼å¦æ对象
+ æ¯èæ°æ®ï¼å¨åæ¥çæ¶åï¼Hibernateä¼èªå¨å¢å çæ¬å·ã
+ </para>
+
+ <para>
+ å½ç¶ï¼å¦æä½ çåºç¨æ¯å¨ä¸ä¸ªä½æ°æ®å¹¶åç¯å¢ä¸ï¼å¹¶ä¸éè¦çæ¬æ£æ¥çè¯ï¼ä½ ç
§æ ·å¯ä»¥ä½¿ç¨
+ è¿ç§æ¹å¼ï¼åªä¸è¿è·³è¿çæ¬æ£æ¥å°±æ¯äºãå¨è¿ç§æ
åµä¸ï¼<emphasis>æææ交çæ</emphasis>
+ ï¼<emphasis>last commit wins</emphasis>ï¼å°±æ¯ä½ çé¿å¯¹è¯çé»è®¤å¤ççç¥ã
+ 请记ä½è¿ç§çç¥å¯è½ä¼è®©åºç¨è½¯ä»¶çç¨æ·æå°å°æï¼å 为ä»ä»¬æå¯è½ä¼ç¢°ä¸æ´æ°ä¸¢å¤±æå´æ²¡
+ æåºéä¿¡æ¯ï¼æè
éè¦å并æ´æ¹å²çªçæ
åµã
+ </para>
+
+ <para>
+ å¾ææ¾ï¼æå·¥è¿è¡çæ¬æ£æ¥åªéåäºæäºè½¯ä»¶è§æ¨¡é常å°çåºç¨åºæ¯ï¼å¯¹äºå¤§å¤æ°è½¯ä»¶åºç¨åºæ¯
+ æ¥è¯´å¹¶ä¸ç°å®ãé常æ
åµä¸ï¼ä¸ä»
æ¯å个对象å®ä¾éè¦è¿è¡çæ¬æ£æ¥ï¼æ´ä¸ªè¢«ä¿®æ¹è¿çå
³
+ è对象å¾ä¹é½éè¦è¿è¡çæ¬æ£æ¥ãä½ä¸ºæ å设计èä¾ï¼Hibernate使ç¨æ©å±å¨æç
+ <literal>Session</literal>çæ¹å¼ï¼æè
è±ç®¡å¯¹è±¡å®ä¾çæ¹å¼æ¥æä¾èªå¨çæ¬æ£æ¥ã
+ </para>
+
+ </sect2>
+
+ <sect2 id="transactions-optimistic-longsession">
+ <title>æ©å±å¨æçsessionåèªå¨çæ¬å</title>
+ <para>
+ å个 <literal>Session</literal>å®ä¾åå®æå
³èçæææä¹
å对象å®ä¾é½è¢«ç¨äºæ´ä¸ª
+ 对è¯ï¼è¿è¢«ç§°ä¸º<emphasis>session-per-conversation</emphasis>ãHibernateå¨åæ¥çæ¶åè¿è¡å¯¹è±¡å®ä¾ççæ¬æ£æ¥ï¼å¦ææ£æµå°å¹¶åä¿®
+ æ¹åæåºå¼å¸¸ãç±å¼å人åæ¥å³å®æ¯å¦éè¦æè·åå¤çè¿ä¸ªå¼å¸¸ï¼é常çææ©æ¯ç»ç¨æ·
+ æä¾ä¸ä¸ªå并æ´æ¹ï¼æè
å¨æ èæ°æ®æ
åµä¸éæ°è¿è¡ä¸å¡å¯¹è¯çæºä¼ï¼ã
+ </para>
+ <para>
+ å¨çå¾
ç¨æ·äº¤äºçæ¶åï¼ <literal>Session</literal> æå¼åºå±çJDBCè¿æ¥ãè¿ç§æ¹å¼
+ 以æ°æ®åºè®¿é®çè§åº¦æ¥è¯´æ¯æé«æçæ¹å¼ãåºç¨ç¨åºä¸éè¦å
³å¿çæ¬æ£æ¥æè±ç®¡å¯¹è±¡å®ä¾
+ çéæ°å
³èï¼å¨æ¯ä¸ªæ°æ®åºäºå¡ä¸ï¼åºç¨ç¨åºä¹ä¸éè¦è½½å
¥è¯»å对象å®ä¾ã
+ </para>
+
+ <programlisting><![CDATA[// foo is an instance loaded earlier by the old session
+Transaction t = session.beginTransaction(); // Obtain a new JDBC connection, start transaction
+
+foo.setProperty("bar");
+
+session.flush(); // Only for last transaction in conversation
+t.commit(); // Also return JDBC connection
+session.close(); // Only for last transaction in conversation]]></programlisting>
+
+ <para>
+ <literal>foo</literal>对象ç¥éå®æ¯å¨åªä¸ª<literal>Session</literal>ä¸è¢«è£
å
¥çãå¨ä¸ä¸ªæ§sessionä¸å¼å¯ä¸ä¸ªæ°çæ°æ®åºäºå¡ï¼ä¼å¯¼è´sessionè·åä¸ä¸ªæ°çè¿æ¥ï¼å¹¶æ¢å¤sessionçåè½ãå°æ°æ®åºäºå¡æ交ï¼ä½¿å¾sessionä»JDBCè¿æ¥æå¼ï¼å¹¶å°æ¤è¿æ¥äº¤è¿ç»è¿æ¥æ± ãå¨éæ°è¿æ¥ä¹åï¼è¦å¼ºå¶å¯¹ä½ 没ææ´æ°çæ°æ®è¿è¡ä¸æ¬¡çæ¬æ£æ¥ï¼ä½ å¯ä»¥å¯¹ææå¯è½è¢«å
¶ä»äºå¡ä¿®æ¹è¿ç对象ï¼ä½¿ç¨åæ°<literal>LockMode.READ</literal>æ¥è°ç¨<literal>Session.lock()</literal>ãä½ ä¸ç¨lockä»»ä½ä½ <emphasis>æ£å¨</emphasis>æ´æ°çæ°æ®ãä¸è¬ä½ ä¼å¨æ©å±ç<literal>Session</literal>ä¸è®¾ç½®<literal>FlushMode.MANUAL</literal>ï¼å æ¤åªææåä¸ä¸ªæ°æ®åºäºå¡å¾ªç¯æä¼çæ£çå§æ´ä¸ªå¯¹è¯ä¸åççä¿®æ¹åéå°æ°æ®åºãå æ¤ï¼åªæè¿æåä¸æ¬¡æ°æ®åºäºå¡æä¼å
å«<literal>flush()</literal>æä½ï¼ç¶åå¨æ´ä¸ªå¯¹è¯ç»æåï¼è¿è¦<litera!
l>close()</literal>è¿ä¸ªsessionã
+ </para>
+
+ <para>
+ å¦æå¨ç¨æ·æèçè¿ç¨ä¸ï¼<literal>Session</literal>å 为太大äºèä¸è½ä¿åï¼é£ä¹è¿ç§æ¨¡å¼æ¯æ
+ é®é¢çã举ä¾æ¥è¯´ï¼ä¸ä¸ª<literal>HttpSession</literal>åºè¯¥å°½å¯è½çå°ãç±äº
+ <literal>Session</literal>æ¯ä¸çº§ç¼åï¼å¹¶ä¸ä¿æäºææ被载å
¥è¿ç对象ï¼å æ¤
+ æ们åªåºè¯¥å¨é£äºå°éçrequest/responseæ
åµä¸ä½¿ç¨è¿ç§çç¥ãä½ åºè¯¥åªæä¸ä¸ª<literal>Session</literal>ç¨äºå个对è¯ï¼å 为å®å¾å¿«å°±ä¼åºç°èæ°æ®ã
+ </para>
+
+ <para>
+ ï¼æ³¨æï¼æ©æçHibernateçæ¬éè¦æç¡®ç对<literal>Session</literal>è¿è¡disconnecåreconnectãè¿äºæ¹æ³ç°å¨å·²ç»è¿æ¶äºï¼æå¼äºå¡åå
³éäºå¡ä¼èµ·å°åæ ·çææãï¼
+ </para>
+
+
+ <para>
+ æ¤å¤ï¼ä¹è¯·æ³¨æï¼ä½ åºè¯¥è®©ä¸æ°æ®åºè¿æ¥æå¼ç<literal>Session</literal>对æä¹
å±ä¿æ
+ å
³éç¶æãæ¢å¥è¯è¯´ï¼å¨ä¸å±ç¯å¢ä¸ï¼ä½¿ç¨æç¶æçEJB session beanæ¥ææ<literal>Session</literal>ï¼
+ èä¸è¦æå®ä¼ éå°webå±ï¼çè³æå®åºååå°ä¸ä¸ªåç¬çå±ï¼ï¼ä¿åå¨<literal>HttpSession</literal>ä¸ã
+ </para>
+
+ <para>
+ æ©å±session模å¼ï¼æè
被称为<emphasis>æ¯æ¬¡å¯¹è¯ä¸ä¸ªsession(session-per-conversation)</emphasis>, å¨ä¸èªå¨ç®¡çå½åsessionä¸ä¸æèç¨çæ¶åä¼æ´å°é¾ãä½ éè¦æä¾ä½ èªå·±ç<literal>CurrentSessionContext</literal>å®ç°ã请åé
Hibernate Wiki以è·å¾ç¤ºä¾ã
+ </para>
+
+
+ </sect2>
+
+ <sect2 id="transactions-optimistic-detached">
+ <title>è±ç®¡å¯¹è±¡(deatched object)åèªå¨çæ¬å</title>
+
+ <para>
+ è¿ç§æ¹å¼ä¸ï¼ä¸æä¹
ååå¨çæ¯æ¬¡äº¤äºé½åçå¨ä¸ä¸ªæ°ç<literal>Session</literal>ä¸ã
+ ç¶èï¼åä¸æä¹
å对象å®ä¾å¯ä»¥å¨å¤æ¬¡ä¸æ°æ®åºç交äºä¸éç¨ãåºç¨ç¨åºæ纵è±ç®¡å¯¹è±¡å®ä¾
+ çç¶æï¼è¿ä¸ªè±ç®¡å¯¹è±¡å®ä¾æåæ¯å¨å¦ä¸ä¸ª<literal>Session</literal> ä¸è½½å
¥çï¼ç¶å
+ è°ç¨ <literal>Session.update()</literal>ï¼<literal>Session.saveOrUpdate()</literal>, æè
+ <literal>Session.merge()</literal> æ¥éæ°å
³è该对象å®ä¾ã
+ </para>
+
+ <programlisting><![CDATA[// foo is an instance loaded by a previous Session
+foo.setProperty("bar");
+session = factory.openSession();
+Transaction t = session.beginTransaction();
+session.saveOrUpdate(foo); // Use merge() if "foo" might have been loaded already
+t.commit();
+session.close();]]></programlisting>
+
+ <para>
+ Hibernateä¼åä¸æ¬¡å¨åæ¥çæ¶åæ£æ¥å¯¹è±¡å®ä¾ççæ¬ï¼å¦æåçæ´æ°å²çªï¼å°±æåºå¼å¸¸ã
+ </para>
+
+ <para>
+ å¦æä½ ç¡®ä¿¡å¯¹è±¡æ²¡æ被修æ¹è¿ï¼ä½ ä¹å¯ä»¥è°ç¨<literal>lock()</literal> æ¥è®¾ç½®
+ <literal>LockMode.READ</literal>ï¼ç»è¿ææçç¼åï¼æ§è¡çæ¬æ£æ¥ï¼ï¼ä»èå
+ 代 <literal>update()</literal>æä½ã
+ </para>
+
+ </sect2>
+
+ <sect2 id="transactions-optimistic-customizing">
+ <title>å®å¶èªå¨çæ¬åè¡ä¸º</title>
+ <para>
+ 对äºç¹å®çå±æ§åéåï¼éè¿ä¸ºå®ä»¬è®¾ç½®æ å°å±æ§<literal>optimistic-lock</literal>çå¼
+ 为<literal>false</literal>ï¼æ¥ç¦æ¢Hibernateççæ¬èªå¨å¢å ãè¿æ ·çè¯ï¼å¦æ该å±æ§
+ èæ°æ®ï¼Hibernateå°ä¸åå¢å çæ¬å·ã
+ </para>
+
+ <para>
+ éçç³»ç»çæ°æ®åºSchemaé常æ¯éæçï¼ä¸å¯ä¿®æ¹çãæè
ï¼å
¶ä»åºç¨ç¨åºä¹å¯è½è®¿é®åä¸æ°æ®
+ åºï¼æ ¹æ¬æ æ³å¾ç¥å¦ä½å¤ççæ¬å·ï¼çè³æ¶é´æ³ãå¨ä»¥ä¸çææåºæ¯ä¸ï¼å®ç°çæ¬åä¸è½ä¾é
+ æ°æ®åºè¡¨çæ个ç¹å®åãå¨<literal><class></literal>çæ å°ä¸è®¾ç½®
+ <literal>optimistic-lock="all"</literal>å¯ä»¥å¨æ²¡æçæ¬æè
æ¶é´æ³å±æ§æ å°çæ
åµä¸å®ç°
+ çæ¬æ£æ¥ï¼æ¤æ¶Hibernateå°æ¯è¾ä¸è¡è®°å½çæ¯ä¸ªå段çç¶æã请注æï¼åªæå½Hibernateè½å¤æ¯
+ è¾æ°æ§ç¶æçæ
åµä¸ï¼è¿ç§æ¹å¼æè½çæï¼ä¹å°±æ¯è¯´ï¼
+ ä½ å¿
须使ç¨å个é¿çå½å¨æ<literal>Session</literal>模å¼ï¼èä¸è½ä½¿ç¨
+ session-per-request-with-detached-objects模å¼ã
+ </para>
+
+ <para>
+ æäºæ
åµä¸ï¼åªè¦æ´æ¹ä¸åç交éï¼å¹¶åä¿®æ¹ä¹æ¯å
许çãå½ä½ å¨<literal><class></literal>
+ çæ å°ä¸è®¾ç½®<literal>optimistic-lock="dirty"</literal>ï¼Hibernateå¨åæ¥çæ¶åå°åªæ¯è¾æè
+ æ°æ®çå段ã
+ </para>
+
+ <para>
+ å¨ä»¥ä¸ææåºæ¯ä¸ï¼ä¸ç®¡æ¯ä¸é¨è®¾ç½®ä¸ä¸ªçæ¬/æ¶é´æ³åï¼è¿æ¯è¿è¡å
¨é¨å段/èæ°æ®å段æ¯è¾ï¼
+ Hibernateé½ä¼é对æ¯ä¸ªå®ä½å¯¹è±¡åéä¸æ¡<literal>UPDATE</literal>ï¼å¸¦æç¸åºç
+ <literal>WHERE</literal>è¯å¥ ï¼çSQLè¯å¥æ¥æ§è¡çæ¬æ£æ¥åæ°æ®æ´æ°ãå¦æä½ å¯¹å
³èå®ä½
+ 设置级èå
³ç³»ä½¿ç¨ä¼ ææ§æä¹
åï¼transitive persistenceï¼ï¼é£ä¹Hibernateå¯è½ä¼æ§è¡ä¸å¿
+ è¦çupdateè¯å¥ãè¿é常ä¸æ¯ä¸ªé®é¢ï¼ä½æ¯æ°æ®åºéé¢å¯¹<emphasis>on update</emphasis>ç¹ç«
+ ç触åå¨å¯è½å¨è±ç®¡å¯¹è±¡æ²¡æä»»ä½æ´æ¹çæ
åµä¸è¢«è§¦åãå æ¤ï¼ä½ å¯ä»¥å¨
+ <literal><class></literal>çæ å°ä¸ï¼éè¿è®¾ç½®<literal>select-before-update="true"</literal>
+ æ¥å®å¶è¿ä¸è¡ä¸ºï¼å¼ºå¶Hibernate <literal>SELECT</literal>è¿ä¸ªå¯¹è±¡å®ä¾ï¼ä»èä¿è¯ï¼
+ å¨æ´æ°è®°å½ä¹åï¼å¯¹è±¡çç¡®æ¯è¢«ä¿®æ¹è¿ã
+ </para>
+
+ </sect2>
+
+ </sect1>
+
+ <sect1 id="transactions-locking">
+ <title>æ²è§éå®(Pessimistic Locking)</title>
+ <para>
+ ç¨æ·å
¶å®å¹¶ä¸éè¦è±å¾å¤ç²¾åå»æ
å¿éå®çç¥çé®é¢ãé常æ
åµä¸ï¼åªè¦ä¸ºJDBCè¿æ¥æå®ä¸ä¸é
+ 离级å«ï¼ç¶å让æ°æ®åºå»æå®ä¸åå°±å¤äºãç¶èï¼é«çº§ç¨æ·ææ¶åå¸æè¿è¡ä¸ä¸ªæå®çæ²è§éå®ï¼
+ æè
å¨ä¸ä¸ªæ°çäºå¡å¯å¨çæ¶åï¼éæ°è¿è¡éå®ã
+ </para>
+
+ <para>
+ Hibernateæ»æ¯ä½¿ç¨æ°æ®åºçéå®æºå¶ï¼ä»ä¸å¨å
åä¸éå®å¯¹è±¡ï¼
+ </para>
+
+ <para>
+ ç±»<literal>LockMode</literal> å®ä¹äºHibernateæéçä¸åçéå®çº§å«ãä¸ä¸ªéå®
+ å¯ä»¥éè¿ä»¥ä¸çæºå¶æ¥è®¾ç½®:
+ </para>
+
+ <itemizedlist spacing="compact">
+ <listitem>
+ <para>
+ å½Hibernateæ´æ°æè
æå
¥ä¸è¡è®°å½çæ¶åï¼éå®çº§å«èªå¨è®¾ç½®ä¸º<literal>LockMode.WRITE</literal>ã
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ å½ç¨æ·æ¾å¼ç使ç¨æ°æ®åºæ¯æçSQLæ ¼å¼<literal>SELECT ... FOR UPDATE</literal>
+ åéSQLçæ¶åï¼éå®çº§å«è®¾ç½®ä¸º<literal>LockMode.UPGRADE</literal>
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ å½ç¨æ·æ¾å¼ç使ç¨Oracleæ°æ®åºçSQLè¯å¥<literal>SELECT ... FOR UPDATE NOWAIT</literal>
+ çæ¶åï¼éå®çº§å«è®¾ç½®<literal>LockMode.UPGRADE_NOWAIT</literal>
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ å½Hibernateå¨âå¯éå¤è¯»âæè
æ¯âåºååâæ°æ®åºé离级å«ä¸è¯»åæ°æ®çæ¶åï¼éå®æ¨¡å¼
+ èªå¨è®¾ç½®ä¸º<literal>LockMode.READ</literal>ãè¿ç§æ¨¡å¼ä¹å¯ä»¥éè¿ç¨æ·æ¾å¼æå®è¿è¡è®¾ç½®ã
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ <literal>LockMode.NONE</literal> 代表æ ééå®ãå¨<literal>Transaction</literal>ç»ææ¶ï¼
+ ææç对象é½åæ¢å°è¯¥æ¨¡å¼ä¸æ¥ãä¸sessionç¸å
³èç对象éè¿è°ç¨<literal>update()</literal>
+ æè
<literal>saveOrUpdate()</literal>è±ç¦»è¯¥æ¨¡å¼ã
+ </para>
+ </listitem>
+ </itemizedlist>
+
+ <para>
+ "æ¾å¼çç¨æ·æå®"å¯ä»¥éè¿ä»¥ä¸å ç§æ¹å¼ä¹ä¸æ¥è¡¨ç¤º:
+ </para>
+
+ <itemizedlist spacing="compact">
+ <listitem>
+ <para>
+ è°ç¨ <literal>Session.load()</literal>çæ¶åæå®<literal>éå®æ¨¡å¼(LockMode)</literal>ã
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ è°ç¨<literal>Session.lock()</literal>ã
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ è°ç¨<literal>Query.setLockMode()</literal>ã
+ </para>
+ </listitem>
+ </itemizedlist>
+
+ <para>
+ å¦æå¨<literal>UPGRADE</literal>æè
<literal>UPGRADE_NOWAIT</literal>éå®æ¨¡å¼ä¸è°
+ ç¨<literal>Session.load()</literal>ï¼å¹¶ä¸è¦è¯»åç对象å°æªè¢«sessionè½½å
¥è¿ï¼é£ä¹å¯¹è±¡
+ éè¿<literal>SELECT ... FOR UPDATE</literal>è¿æ ·çSQLè¯å¥è¢«è½½å
¥ãå¦æ为ä¸ä¸ªå¯¹è±¡è°ç¨
+ <literal>load()</literal>æ¹æ³æ¶ï¼è¯¥å¯¹è±¡å·²ç»å¨å¦ä¸ä¸ªè¾å°éå¶çéå®æ¨¡å¼ä¸è¢«è½½å
¥äºï¼é£
+ ä¹Hibernate就对该对象è°ç¨<literal>lock()</literal> æ¹æ³ã
+ </para>
+
+ <para>
+ å¦ææå®çéå®æ¨¡å¼æ¯<literal>READ</literal>, <literal>UPGRADE</literal> æ
+ <literal>UPGRADE_NOWAIT</literal>ï¼é£ä¹<literal>Session.lock()</literal>å°±
+ æ§è¡çæ¬å·æ£æ¥ãï¼å¨<literal>UPGRADE</literal> æè
<literal>UPGRADE_NOWAIT</literal>
+ éå®æ¨¡å¼ä¸ï¼æ§è¡<literal>SELECT ... FOR UPDATE</literal>è¿æ ·çSQLè¯å¥ãï¼
+ </para>
+
+ <para>
+ å¦ææ°æ®åºä¸æ¯æç¨æ·è®¾ç½®çéå®æ¨¡å¼ï¼Hibernateå°ä½¿ç¨éå½çæ¿ä»£æ¨¡å¼ï¼èä¸æ¯æåºå¼å¸¸ï¼ã
+ è¿ä¸ç¹å¯ä»¥ç¡®ä¿åºç¨ç¨åºçå¯ç§»æ¤æ§ã
+ </para>
+ </sect1>
+ <sect1 id="transactions-connection-release">
+ <title>è¿æ¥éæ¾æ¨¡å¼(Connection Release Modes)</title>
+
+ <para>
+ Hibernateå
³äºJDBCè¿æ¥ç®¡ççæ§(2.x)è¡ä¸ºæ¯ï¼<literal>Session</literal>å¨ç¬¬ä¸æ¬¡éè¦çæ¶åè·åä¸ä¸ªè¿æ¥ï¼å¨sessionå
³éä¹åä¸ç´ä¼ææè¿ä¸ªè¿æ¥ãHibernateå¼å
¥äºè¿æ¥éæ¾çæ¦å¿µï¼æ¥åè¯sessionå¦ä½å¤çå®çJDBCè¿æ¥ã注æï¼ä¸é¢ç讨论åªéç¨äºéç¨é
ç½®<literal>ConnectionProvider</literal>æ¥æä¾è¿æ¥çæ
åµï¼ç¨æ·èªå·±æä¾çè¿æ¥ä¸è¿éç讨论æ å
³ãéè¿<literal>org.hibernate.ConnectionReleaseMode</literal>çä¸åæ举å¼æ¥ä½¿ç¨ä¸ç¨çéæ¾æ¨¡å¼:
+
+ </para>
+
+ <itemizedlist spacing="compact">
+ <listitem>
+ <para>
+ <literal>ON_CLOSE</literal> - åºæ¬ä¸å°±æ¯ä¸é¢æå°çèå¼è¡ä¸ºãHibernate sessionå¨ç¬¬ä¸æ¬¡éè¦è¿è¡JDBCæä½çæ¶åè·åè¿æ¥ï¼ç¶åææå®ï¼ç´å°sessionå
³éã
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ <literal>AFTER_TRANSACTION</literal> - å¨<literal>org.hibernate.Transaction</literal>ç»æåéæ¾è¿æ¥ã
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ <literal>AFTER_STATEMENT</literal> (ä¹è¢«ç§°å积æéæ¾) - å¨æ¯ä¸æ¡è¯å¥è¢«æ§è¡åå°±éæ¾è¿æ¥ãä½åè¥è¯å¥çä¸äºä¸sessionç¸å
³çèµæºï¼é£å°±ä¸ä¼è¢«éæ¾ãç®åå¯ä¸çè¿ç§æ
形就æ¯ä½¿ç¨<literal>org.hibernate.ScrollableResults</literal>ã
+ </para>
+ </listitem>
+ </itemizedlist>
+
+ <para>
+ <literal>hibernate.connection.release_mode</literal>é
ç½®åæ°ç¨æ¥æå®ä½¿ç¨åªä¸ç§éæ¾æ¨¡å¼ãå¯è½çå¼æï¼
+ </para>
+
+ <itemizedlist spacing="compact">
+ <listitem>
+ <para>
+ <literal>auto</literal>(é»è®¤) - è¿ä¸éæ©æéæ¾æ¨¡å¼å§æ´¾ç»<literal>org.hibernate.transaction.TransactionFactory.getDefaultReleaseMode()</literal>æ¹æ³ã对JTATransactionFactoryæ¥è¯´ï¼å®ä¼è¿åConnectionReleaseMode.AFTER_STATEMENT;对JDBCTransactionFactoryæ¥è¯´ï¼åæ¯ConnectionReleaseMode.AFTER_TRANSACTIONãå¾å°éè¦ä¿®æ¹è¿ä¸é»è®¤è¡ä¸ºï¼å 为åè¥è®¾ç½®ä¸å½ï¼å°±ä¼å¸¦æ¥bugï¼æè
ç»ç¨æ·ä»£ç 带æ¥è¯¯å¯¼ã
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ <literal>on_close</literal> - ä½¿ç¨ ConnectionReleaseMode.ON_CLOSE. è¿ç§æ¹å¼æ¯ä¸ºäºåä¸å
¼å®¹ç,ä½æ¯å·²ç»å®å
¨ä¸è¢«é¼å±ä½¿ç¨äºã
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ <literal>after_transaction</literal> - 使ç¨ConnectionReleaseMode.AFTER_TRANSACTIONãè¿ä¸è®¾ç½®ä¸åºè¯¥å¨JTAç¯å¢ä¸ä½¿ç¨ãä¹è¦æ³¨æï¼ä½¿ç¨ConnectionReleaseMode.AFTER_TRANSACTIONçæ¶åï¼åè¥session å¤äºauto-commitç¶æï¼è¿æ¥ä¼åAFTER_STATEMENTé£æ ·è¢«éæ¾ã
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ <literal>after_statement</literal> - 使ç¨ConnectionReleaseMode.AFTER_STATEMENTãé¤æ¤ä¹å¤ï¼ä¼æ¥è¯¢é
ç½®ç<literal>ConnectionProvider</literal>ï¼æ¯å¦å®æ¯æè¿ä¸è®¾ç½®ï¼(<literal>supportsAggressiveRelease()</literal>)ï¼ãåè¥ä¸æ¯æï¼éæ¾æ¨¡å¼ä¼è¢«è®¾ç½®ä¸ºConnectionReleaseMode.AFTER_TRANSACTIONãåªæå¨ä½ æ¯æ¬¡è°ç¨<literal>ConnectionProvider.getConnection()</literal>è·ååºå±JDBCè¿æ¥çæ¶åï¼é½å¯ä»¥ç¡®ä¿¡è·å¾åä¸ä¸ªè¿æ¥çæ¶åï¼è¿ä¸è®¾ç½®ææ¯å®å
¨çï¼æè
å¨auto-commitç¯å¢ä¸ï¼ä½ å¯ä»¥ä¸ç®¡æ¯å¦æ¯æ¬¡é½è·å¾åä¸ä¸ªè¿æ¥çæ¶åï¼è¿ææ¯å®å
¨çã
+
+ </para>
+ </listitem>
+ </itemizedlist>
+
+ </sect1>
+
+</chapter>
+
Copied: core/trunk/documentation/manual/zh-CN/src/main/docbook/content/tutorial.xml (from rev 14080, core/trunk/documentation/manual/zh-CN/src/main/docbook/modules/tutorial.xml)
===================================================================
--- core/trunk/documentation/manual/zh-CN/src/main/docbook/content/tutorial.xml (rev 0)
+++ core/trunk/documentation/manual/zh-CN/src/main/docbook/content/tutorial.xml 2007-10-09 20:10:34 UTC (rev 14081)
@@ -0,0 +1,1233 @@
+<chapter id="tutorial">
+ <title>
+ Hibernateå
¥é¨
+ </title>
+ <sect1 id="tutorial-intro" revision="1">
+ <title>
+ åè¨
+ </title>
+
+ <para>
+ æ¬ç« æ¯é¢åHibernateåå¦è
çä¸ä¸ªå
¥é¨æç¨ãæ们ä»ä¸ä¸ªä½¿ç¨é©»çå
åå¼(in-memory)æ°æ®åºçç®åå½ä»¤è¡åºç¨ç¨åºå¼å§, ç¨æäºç解çæ¹å¼éæ¥å¼åã
+
+ </para>
+
+ <para>
+ æ¬ç« é¢åHibernateåå¦è
ï¼ä½éè¦JavaåSQLç¥è¯ãå®æ¯å¨Michael Goeglæåçæåçåºç¡ä¸å®æçãå¨è¿éï¼æ们称第ä¸æ¹åºæ件æ¯æJDK 1.4å5.0ãè¥ä½¿ç¨JDK1.3ï¼ä½ å¯è½éè¦å
¶å®çåºæ件ã
+ </para>
+
+ <para>
+ æ¬ç« çæºä»£ç å·²å
å«å¨åå¸å
ä¸ï¼ä½äº<literal>doc/reference/tutorial/</literal>ç®å½ä¸ã
+ </para>
+
+ </sect1>
+
+ <sect1 id="tutorial-firstapp" revision="2">
+ <title>
+ 第ä¸é¨å ï¼ ç¬¬ä¸ä¸ªHibernateåºç¨ç¨åº
+ </title>
+ <para>
+ é¦å
æ们å°å建ä¸ä¸ªç®åçåºäºæ§å¶å°ç(console-based)Hibernateåºç¨ç¨åºãç±äºæ们使ç¨Javaæ°æ®åº(HSQL DB)ï¼æ以ä¸å¿
å®è£
ä»»ä½æ°æ®åºæå¡å¨ã
+ </para>
+
+ <para>
+ å设æ们å¸ææä¸ä¸ªå°åºç¨ç¨åºå¯ä»¥ä¿åæ们å¸æåå çæ´»å¨ï¼eventsï¼åè¿äºæ´»å¨ä¸»åæ¹çç¸å
³ä¿¡æ¯ã
+ ï¼è¯è
注ï¼å¨æ¬æç¨çåé¢é¨åï¼æ们å°ç´æ¥ä½¿ç¨eventèä¸æ¯å®çä¸æç¿»è¯âæ´»å¨âï¼ä»¥å
æ··æ·ãï¼
+ </para>
+
+ <para>
+ æ们æåç第ä¸ä»¶äºå°±æ¯å建æ们çå¼åç®å½ï¼å¹¶ä¸æææéè¦ç¨å°çJavaåºæ件æ¾è¿å»ã解å缩ä»Hibernateç½ç«ä¸è½½çHibernateåå¸å
ï¼å¹¶æ<literal>/lib</literal>ç®å½ä¸ææéè¦çåºæ件æ·å°æ们æ°å»ºå¼åç®å½ä¸ç<literal>/lib</literal>ç®å½ä¸ãçèµ·æ¥å°±åè¿æ ·ï¼
+ </para>
+
+ <programlisting><![CDATA[.
++lib
+ antlr.jar
+ cglib.jar
+ asm.jar
+ asm-attrs.jars
+ commons-collections.jar
+ commons-logging.jar
+ ehcache.jar
+ hibernate3.jar
+ jta.jar
+ dom4j.jar
+ log4j.jar ]]></programlisting>
+
+ <para>
+ <emphasis>å°ç¼åæ¬ææ¶ä¸ºæ¢</emphasis>ï¼è¿äºæ¯Hibernateè¿è¡æéè¦çæå°åºæ件éåï¼æ³¨ææ们ä¹æ·è´äº Hibernate3.jarï¼è¿ä¸ªæ¯æ主è¦çæ件ï¼ãä½ æ£ä½¿ç¨çHibernateçæ¬å¯è½éè¦æ¯è¿æ´å¤æå°ä¸äºçåºæ件ã请åè§åå¸å
ä¸ç<literal>lib/</literal>ç®å½ä¸ç<literal>README.txt</literal>ï¼ä»¥è·åæ´å¤å
³äºæéåå¯éç第ä¸æ¹åºæ件信æ¯ï¼äºå®ä¸ï¼Log4j并ä¸æ¯å¿
é¡»çåºæ件ï¼ä½è¢«è®¸å¤å¼åè
æå欢ï¼ã
+
+ </para>
+
+ <para>
+ æ¥ä¸æ¥æ们å建ä¸ä¸ªç±»ï¼ç¨æ¥ä»£è¡¨é£äºæ们å¸æå¨åå¨æ°æ®åºéçeventã
+ </para>
+
+ <sect2 id="tutorial-firstapp-firstclass" revision="1">
+ <title>
+ 第ä¸ä¸ªclass
+ </title>
+
+ <para>
+ æ们ç第ä¸ä¸ªæä¹
åç±»æ¯ä¸ä¸ªå¸¦æä¸äºå±æ§ï¼propertyï¼çç®åJavaBeanç±»ï¼
+ </para>
+
+ <programlisting><![CDATA[package events;
+
+import java.util.Date;
+
+public class Event {
+ private Long id;
+
+ private String title;
+ private Date date;
+
+ public Event() {}
+
+ public Long getId() {
+ return id;
+ }
+
+ private void setId(Long id) {
+ this.id = id;
+ }
+
+ public Date getDate() {
+ return date;
+ }
+
+ public void setDate(Date date) {
+ this.date = date;
+ }
+
+ public String getTitle() {
+ return title;
+ }
+
+ public void setTitle(String title) {
+ this.title = title;
+ }
+}]]></programlisting>
+
+ <para>
+ ä½ å¯ä»¥çå°è¿ä¸ªç±»å¯¹å±æ§çååæ¹æ³ï¼getter and setter methodï¼ä½¿ç¨äºæ åJavaBeanå½å约å®ï¼åæ¶æç±»å±æ§ï¼fieldï¼ç访é®çº§å«è®¾æç§æçï¼privateï¼ãè¿æ¯æ¨èç设计ï¼ä½å¹¶ä¸æ¯å¿
é¡»çãHibernateä¹å¯ä»¥ç´æ¥è®¿é®è¿äºfieldï¼è使ç¨è®¿é®æ¹æ³ï¼accessor methodï¼ç好å¤æ¯æä¾äºéææ¶çå¥å£®æ§ï¼robustnessï¼ã为äºéè¿åå°æºå¶ï¼Reflectionï¼æ¥å®ä¾åè¿ä¸ªç±»ç对象ï¼æ们éè¦æä¾ä¸ä¸ªæ åçæé å¨ï¼no-argument constructor)ã
+ </para>
+
+ <para>
+ 对ä¸ç¹å®çevent, <literal>id</literal> å±æ§ææå¯ä¸çæ è¯ç¬¦ï¼identifierï¼çå¼ãå¦ææ们å¸æ使ç¨Hibernateæä¾çææç¹æ§ï¼é£ä¹ææçæä¹
åå®ä½ï¼persistent entityï¼ç±»ï¼è¿éä¹å
æ¬ä¸äºæ¬¡è¦ä¾èµç±»ï¼é½éè¦ä¸ä¸ªè¿æ ·çæ è¯ç¬¦å±æ§ãèäºå®ä¸ï¼å¤§å¤æ°åºç¨ç¨åºï¼ç¹å«æ¯webåºç¨ç¨åºï¼é½éè¦éè¿æ è¯ç¬¦æ¥åºå«å¯¹è±¡ï¼æä»¥ä½ åºè¯¥èè使ç¨æ è¯ç¬¦å±æ§èä¸æ¯æå®å½ä½ä¸ç§éå¶ãç¶èï¼æ们é常ä¸ä¼æä½å¯¹è±¡çæ è¯ï¼identityï¼ï¼å æ¤å®çsetteræ¹æ³ç访é®çº§å«åºè¯¥å£°æprivateãè¿æ ·å½å¯¹è±¡è¢«ä¿åçæ¶åï¼åªæHibernateå¯ä»¥ä¸ºå®åé
æ è¯ç¬¦å¼ãä½ å¯çå°Hibernateå¯ä»¥ç´æ¥è®¿é®publicï¼privateåprotectedç访é®æ¹æ³åfieldãæ以éæ©åªç§æ¹å¼å®å
¨åå³äºä½ ï¼ä½ å¯ä»¥ä½¿ä½ çéæ©ä¸ä½ çåºç¨ç¨åºè®¾è®¡ç¸å»åã
+ </para>
+
+ <para>
+ ææçæä¹
åç±»ï¼persistent classesï¼é½è¦æ±ææ åçæé å¨ï¼å 为Hibernateå¿
须使ç¨Javaåå°æºå¶æ¥ä¸ºä½ å建对象ãæé å¨ï¼constructorï¼ç访é®çº§å«å¯ä»¥æ¯privateï¼ç¶èå½çæè¿è¡æ¶ä»£çï¼runtime proxyï¼çæ¶ååè¦æ±ä½¿ç¨è³å°æ¯package 级å«ç访é®æ§å¶ï¼è¿æ ·å¨æ²¡æåèç æ令ï¼bytecode instrumentationï¼çæ
åµä¸ï¼ä»æä¹
åç±»éè·åæ°æ®ä¼æ´ææçã
+ </para>
+
+ <para>
+ æè¿ä¸ªJavaæºä»£ç æ件æ¾å°å¼åç®å½ä¸ç<literal>src</literal>ç®å½éï¼æ³¨æå
ä½ç½®è¦æ£ç¡®ã ç°å¨è¿ä¸ªç®å½çèµ·æ¥åºè¯¥åè¿æ ·ï¼
+ </para>
+
+ <programlisting><![CDATA[.
++lib
+ <Hibernate and third-party libraries>
++src
+ +events
+ Event.java]]></programlisting>
+
+ <para>
+ ä¸ä¸æ¥ï¼æ们æè¿ä¸ªæä¹
åç±»çä¿¡æ¯åè¯Hibernateã
+ </para>
+
+ </sect2>
+
+ <sect2 id="tutorial-firstapp-mapping" revision="1">
+ <title>
+ æ å°æ件
+ </title>
+
+ <para>
+ Hibernateéè¦ç¥éææ ·å»å è½½ï¼loadï¼ååå¨ï¼storeï¼æä¹
åç±»ç对象ãè¿æ£æ¯Hibernateæ å°æ件åæ¥ä½ç¨çå°æ¹ãæ å°æ件åè¯Hibernateå®ï¼åºè¯¥è®¿é®æ°æ®åº(database)éé¢çåªä¸ªè¡¨ï¼tableï¼ååºè¯¥ä½¿ç¨è¡¨éé¢çåªäºå段ï¼columnï¼ã
+
+ </para>
+
+ <para>
+ ä¸ä¸ªæ å°æ件çåºæ¬ç»æçèµ·æ¥åè¿æ ·ï¼
+ </para>
+
+ <programlisting><![CDATA[<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC
+ "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+ "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<hibernate-mapping>
+[...]
+</hibernate-mapping>]]></programlisting>
+
+ <para>
+ 注æHibernateçDTDæ¯é常å¤æçãä½ çç¼è¾å¨æè
IDEé使ç¨å®æ¥èªå¨å®æé£äºç¨æ¥æ å°çXMLå
ç´ ï¼elementï¼åå±æ§ï¼attributeï¼ãä½ ä¹å¯ä»¥å¨ææ¬ç¼è¾å¨éæå¼DTDï¼è¿æ¯æç®åçæ¹å¼æ¥æ¦è§ææçå
ç´ åattributeï¼å¹¶æ¥çå®ä»¬ç缺çå¼ä»¥å注éã注æHibernateä¸ä¼ä»webå è½½DTDæ件ï¼ä½å®ä¼é¦å
å¨åºç¨ç¨åºçclasspathä¸æ¥æ¾ãDTDæ件已å
æ¬å¨<literal>hibernate3.jar</literal>éï¼åæ¶ä¹å¨Hibernateåå¸å
ç<literal>src/</literal>ç®å½ä¸ã
+ </para>
+
+ <para>
+ 为缩ç代ç é¿åº¦ï¼å¨ä»¥åçä¾åéæ们ä¼çç¥DTDç声æãå½ç¶ï¼å¨å®é
çåºç¨ç¨åºä¸ï¼DTD声ææ¯å¿
é¡»çã
+ </para>
+
+ <para>
+ å¨<literal>hibernate-mapping</literal>æ ç¾ï¼tagï¼ä¹é´, å«æä¸ä¸ª<literal>class</literal>å
ç´ ãææçæä¹
åå®ä½ç±»ï¼å次声æï¼æ许æ¥ä¸æ¥ä¼æä¾èµç±»ï¼å°±æ¯é£äºæ¬¡è¦çå®ä½ï¼é½éè¦ä¸ä¸ªè¿æ ·çæ å°ï¼æ¥æ类对象æ å°å°SQLæ°æ®åºéç表ã
+ </para>
+
+ <programlisting><![CDATA[<hibernate-mapping>
+
+ <class name="events.Event" table="EVENTS">
+
+ </class>
+
+</hibernate-mapping>]]></programlisting>
+
+ <para>
+ å°ç®å为æ¢ï¼æ们åè¯äºHibernateææ ·æ<literal>Events</literal>ç±»ç对象æä¹
åå°æ°æ®åºç<literal>EVENTS</literal>表éï¼ä»¥åææ ·ä»<literal>EVENTS</literal>表å è½½å°<literal>Events</literal>ç±»ç对象ãæ¯ä¸ªå®ä¾å¯¹åºçæ°æ®åºè¡¨ä¸çä¸è¡ãç°å¨æ们å°ç»§ç»è®¨è®ºæå
³å¯ä¸æ è¯ç¬¦å±æ§å°æ°æ®åºè¡¨çæ å°ãå¦å¤ï¼ç±äºæ们ä¸å
³å¿ææ ·å¤çè¿ä¸ªæ è¯ç¬¦ï¼æ们就é
ç½®ç±Hibernateçæ è¯ç¬¦çæçç¥æ¥äº§ç代ç主é®å段ã
+
+ </para>
+
+ <programlisting><![CDATA[<hibernate-mapping>
+
+ <class name="events.Event" table="EVENTS">
+ <id name="id" column="EVENT_ID">
+ <generator class="native"/>
+ </id>
+ </class>
+
+</hibernate-mapping>]]></programlisting>
+
+ <para>
+ <literal>id</literal>å
ç´ æ¯æ è¯ç¬¦å±æ§ç声æï¼<literal>name="id"</literal> 声æäºJavaå±æ§çåå ï¼ Hibernateä¼ä½¿ç¨<literal>getId()</literal>å<literal>setId()</literal>æ¥è®¿é®å®ã <literal>column</literal>å±æ§ååè¯Hibernate, æ们使ç¨<literal>EVENTS</literal>表çåªä¸ªå段ä½ä¸ºä¸»é®ãåµå¥ç<literal>generator</literal>å
ç´ æå®äºæ è¯ç¬¦çæçç¥ï¼å¨è¿éæ们æå®<literal>native</literal>ï¼å®æ ¹æ®å·²é
ç½®çæ°æ®åºï¼æ¹è¨ï¼èªå¨éæ©æä½³çæ è¯ç¬¦çæçç¥ãHibernateæ¯æç±æ°æ®åºçæï¼å
¨å±å¯ä¸æ§ï¼globally uniqueï¼ååºç¨ç¨åºæå®ï¼æè
ä½ èªå·±ä¸ºä»»ä½å·²æçç¥æåçæ©å±ï¼è¿äºçç¥æ¥çææ è¯ç¬¦ã
+ </para>
+
+ <para>
+ æåæ们å¨æ å°æ件éé¢å
å«éè¦æä¹
åå±æ§ç声æãé»è®¤æ
åµä¸ï¼ç±»éé¢çå±æ§é½è¢«è§ä¸ºéæä¹
åçï¼
+ </para>
+
+ <programlisting><![CDATA[
+<hibernate-mapping>
+
+ <class name="events.Event" table="EVENTS">
+ <id name="id" column="EVENT_ID">
+ <generator class="native"/>
+ </id>
+ <property name="date" type="timestamp" column="EVENT_DATE"/>
+ <property name="title"/>
+ </class>
+
+</hibernate-mapping>]]></programlisting>
+
+ <para>
+ å<literal>id</literal>å
ç´ ä¸æ ·ï¼<literal>property</literal>å
ç´ ç<literal>name</literal>å±æ§åè¯Hibernate使ç¨åªä¸ªgetteråsetteræ¹æ³ãå¨æ¤ä¾ä¸ï¼Hibernateä¼å¯»æ¾<literal>getDate()/setDate()</literal>, 以å<literal>getTitle()/setTitle()</literal>ã
+ </para>
+
+ <para>
+ 为ä»ä¹<literal>date</literal>å±æ§çæ å°å«æ<literal>column</literal> attributeï¼è<literal>title</literal>å´æ²¡æï¼å½æ²¡æ设å®<literal>column</literal> attribute çæ¶åï¼Hibernate缺çå°ä½¿ç¨JavaBeançå±æ§åä½ä¸ºå段åã对äº<literal>title</literal>ï¼è¿æ ·å·¥ä½å¾å¾å¥½ãç¶èï¼<literal>date</literal>å¨å¤æ°çæ°æ®åºéï¼æ¯ä¸ä¸ªä¿çå
³é®åï¼æ以æ们æ好æå®æ å°æä¸ä¸ªä¸åçååã
+
+ </para>
+
+ <para>
+ å¦ä¸æ趣çäºæ
æ¯<literal>title</literal>å±æ§ç¼ºå°ä¸ä¸ª<literal>type</literal> attributeãæ们å¨æ å°æ件é声æ并使ç¨çç±»åï¼å´ä¸æ¯æ们ææçé£æ ·ï¼æ¯Javaæ°æ®ç±»åï¼åæ¶ä¹ä¸æ¯SQLæ°æ®åºçæ°æ®ç±»åãè¿äºç±»åå°±æ¯æè°çHibernate æ å°ç±»å<emphasis>ï¼mapping typesï¼</emphasis>ï¼å®ä»¬è½æJavaæ°æ®ç±»å转æ¢å°SQLæ°æ®ç±»åï¼åä¹äº¦ç¶ãå次éç³ï¼å¦æå¨æ å°æ件ä¸æ²¡æ设置<literal>type</literal>å±æ§çè¯ï¼Hibernateä¼èªå·±è¯çå»ç¡®å®æ£ç¡®ç转æ¢ç±»ååå®çæ å°ç±»åãå¨æäºæ
åµä¸è¿ä¸ªèªå¨æ£æµæºå¶ï¼å¨Java ç±»ä¸ä½¿ç¨åå°æºå¶ï¼ä¸ä¼äº§çä½ ææå¾
æéè¦ç缺çå¼ã<literal>date</literal>å±æ§å°±æ¯ä¸ªå¾å¥½çä¾åï¼Hibernateæ æ³ç¥éè¿ä¸ªå±æ§ï¼<literal>java.util.Date</literal>ç±»åçï¼åºè¯¥è¢«æ å°æï¼SQL <literal>date</literal>ï¼æ<literal>timestamp</literal>ï¼è¿æ¯<literal>time</literal> å段ãå¨æ¤ä¾ä¸ï¼!
æè¿ä¸ªå±æ§æ å°æ<literal>timestamp</literal> 转æ¢å¨ï¼è¿æ ·æ们é¢çäºæ¥æåæ¶é´çå
¨é¨ä¿¡æ¯ã
+ </para>
+
+ <para>
+ åºè¯¥æè¿ä¸ªæ å°æ件ä¿å为<literal>Event.hbm.xml</literal>ï¼ä¸å°±å¨<literal>Event</literal>Javaç±»çæºæ件ç®å½ä¸ãæ å°æ件å¯éæå°å½åï¼ä½<literal>hbm.xml</literal>çåç¼å·²æ为Hibernateå¼åè
社åºç约å®ãç°å¨ç®å½ç»æçèµ·æ¥åºè¯¥åè¿æ ·ï¼
+ </para>
+
+ <programlisting><![CDATA[.
++lib
+ <Hibernate and third-party libraries>
++src
+ +events
+ Event.java
+ Event.hbm.xml]]></programlisting>
+
+ <para>
+ æ们继ç»è¿è¡Hibernateç主è¦é
ç½®ã
+ </para>
+
+ </sect2>
+
+ <sect2 id="tutorial-firstapp-configuration" revision="2">
+ <title>
+ Hibernateé
ç½®
+ </title>
+
+ <para>
+ ç°å¨æ们已ç»æäºä¸ä¸ªæä¹
åç±»åå®çæ å°æ件ï¼è¯¥æ¯é
ç½®Hibernateçæ¶åäºãå¨æ¤ä¹åï¼æ们éè¦ä¸ä¸ªæ°æ®åºã HSQL DBæ¯ç§åºäºJava çSQLæ°æ®åºç®¡çç³»ç»ï¼DBMSï¼ï¼å¯ä»¥ä»HSQL DBçç½ç«ä¸ä¸è½½ãå®é
ä¸ï¼ä½ åªéä¸è½½çå
ä¸ç<literal>hsqldb.jar</literal>æ件ï¼å¹¶æè¿ä¸ªæ件æ¾å¨å¼åæ件夹ç<literal>lib/</literal>ç®å½ä¸å³å¯ã
+
+ </para>
+
+ <para>
+ å¨å¼åçæ ¹ç®å½ä¸å建ä¸ä¸ª<literal>data</literal>ç®å½ ï¼ è¿æ¯HSQL DBåå¨æ°æ®æ件çå°æ¹ãæ¤æ¶å¨dataç®å½ä¸è¿è¡<literal>java -classpath ../lib/hsqldb.jar org.hsqldb.Server</literal>å°±å¯å¯å¨æ°æ®åºãä½ å¯ä»¥å¨logä¸çå°å®çå¯å¨ï¼åç»å®å°TCP/IPå¥ç»åï¼è¿æ£æ¯æ们çåºç¨ç¨åºç¨åä¼è¿æ¥çå°æ¹ãå¦æä½ å¸æå¨æ¬ä¾ä¸è¿è¡ä¸ä¸ªå
¨æ°çæ°æ®åºï¼å°±å¨çªå£ä¸æä¸<literal>CTRL + C</literal>æ¥å
³éHSQLæ°æ®åºï¼å¹¶å é¤<literal>data/</literal>ç®å½ä¸çæææ件ï¼åéæ°å¯å¨HSQLæ°æ®åºã
+ </para>
+
+ <para>
+ Hibernateæ¯ä½ çåºç¨ç¨åºéè¿æ¥æ°æ®åºçé£å±ï¼æ以å®éè¦è¿æ¥ç¨çä¿¡æ¯ãè¿æ¥ï¼connectionï¼æ¯éè¿ä¸ä¸ªä¹ç±æ们é
ç½®çJDBCè¿æ¥æ± ï¼connection poolï¼æ¥å®æçãHibernateçåå¸å
éå
å«äºè®¸å¤å¼æºçï¼open sourceï¼è¿æ¥æ± ï¼ä½å¨æ们ä¾åä¸ä½¿ç¨Hibernateå
ç½®çè¿æ¥æ± ã注æï¼å¦æä½ å¸æ使ç¨ä¸ä¸ªäº§å级(production-quality)ç第ä¸æ¹è¿æ¥æ± 软件ï¼ä½ å¿
é¡»æ·è´æéçåºæ件å°ä½ çclasspathä¸ï¼å¹¶ä½¿ç¨ä¸åçè¿æ¥æ± 设置ã
+ </para>
+
+ <para>
+ 为äºä¿åHibernateçé
ç½®ï¼æ们å¯ä»¥ä½¿ç¨ä¸ä¸ªç®åç<literal>hibernate.properties</literal>æ件ï¼æè
ä¸ä¸ªç¨å¾®å¤æç<literal>hibernate.cfg.xml</literal>ï¼çè³å¯ä»¥å®å
¨ä½¿ç¨ç¨åºæ¥é
ç½®Hibernateãå¤æ°ç¨æ·æ´å欢使ç¨XMLé
ç½®æ件ï¼
+ </para>
+
+ <programlisting><![CDATA[<?xml version='1.0' encoding='utf-8'?>
+<!DOCTYPE hibernate-configuration PUBLIC
+ "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
+ "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
+
+<hibernate-configuration>
+
+ <session-factory>
+
+ <!-- Database connection settings -->
+ <property name="connection.driver_class">org.hsqldb.jdbcDriver</property>
+ <property name="connection.url">jdbc:hsqldb:hsql://localhost</property>
+ <property name="connection.username">sa</property>
+ <property name="connection.password"></property>
+
+ <!-- JDBC connection pool (use the built-in) -->
+ <property name="connection.pool_size">1</property>
+
+ <!-- SQL dialect -->
+ <property name="dialect">org.hibernate.dialect.HSQLDialect</property>
+
+ <!-- Enable Hibernate's automatic session context management -->
+ <property name="current_session_context_class">thread</property>
+
+ <!-- Disable the second-level cache -->
+ <property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property>
+
+ <!-- Echo all executed SQL to stdout -->
+ <property name="show_sql">true</property>
+
+ <!-- Drop and re-create the database schema on startup -->
+ <property name="hbm2ddl.auto">create</property>
+
+ <mapping resource="events/Event.hbm.xml"/>
+
+ </session-factory>
+
+</hibernate-configuration>]]></programlisting>
+
+ <para>
+ 注æè¿ä¸ªXMLé
置使ç¨äºä¸ä¸ªä¸åçDTDãå¨è¿éï¼æ们é
ç½®äºHibernateç<literal>SessionFactory</literal>ï¼ä¸ä¸ªå
³èäºç¹å®æ°æ®åºå
¨å±çå·¥åï¼factoryï¼ãå¦æä½ è¦ä½¿ç¨å¤ä¸ªæ°æ®åºï¼å°±è¦ç¨å¤ä¸ªç<literal><session-factory></literal>ï¼é常æå®ä»¬æ¾å¨å¤ä¸ªé
ç½®æ件ä¸ï¼ä¸ºäºæ´å®¹æå¯å¨ï¼ã
+ </para>
+
+ <para>
+ æå¼å§ç4个<literal>property</literal>å
ç´ å
å«å¿
è¦çJDBCè¿æ¥ä¿¡æ¯ãæ¹è¨ï¼dialectï¼ç<literal>property</literal>å
ç´ ææHibernate çæçç¹å®SQLåéãä½ å¾å¿«ä¼çå°ï¼Hibernate对æä¹
åä¸ä¸æçèªå¨session管çå°±ä¼æ´¾ä¸ç¨åºã æå¼<literal>hbm2ddl.auto</literal>é项å°èªå¨çææ°æ®åºæ¨¡å¼ï¼schemaï¼ï¼ ç´æ¥å å
¥æ°æ®åºä¸ãå½ç¶è¿ä¸ªé项ä¹å¯ä»¥è¢«å
³éï¼éè¿å»é¤è¿ä¸ªé
ç½®é项ï¼æè
éè¿Antä»»å¡<literal>SchemaExport</literal>ç帮å©æ¥ææ°æ®åºschemaéå®åå°æ件ä¸ãæåï¼å¨é
ç½®ä¸ä¸ºæä¹
åç±»å å
¥æ å°æ件ã
+ </para>
+
+ <para>
+ æè¿ä¸ªæ件æ·è´å°æºä»£ç ç®å½ä¸é¢ï¼è¿æ ·å®å°±ä½äºclasspathçæ ¹ç®å½çæåãHibernateå¨å¯å¨æ¶ä¼èªå¨å¨classpathçæ ¹ç®å½æ¥æ¾å为<literal>hibernate.cfg.xml</literal>çé
ç½®æ件ã
+ </para>
+
+ </sect2>
+
+ <sect2 id="tutorial-firstapp-ant" revision="1">
+ <title>
+ ç¨Antæ建
+ </title>
+
+ <para>
+ ç°å¨æ们ç¨Antæ¥æ建åºç¨ç¨åºãä½ å¿
é¡»å
å®è£
Antï¼å¯ä»¥ä»<ulink url="http://ant.apache.org/bindownload.cgi">Ant ä¸è½½é¡µé¢</ulink>å¾å°å®ãææ ·å®è£
Antå°±ä¸å¨è¿éä»ç»äºï¼è¯·åè<ulink url="http://ant.apache.org/manual/index.html">Ant ç¨æ·æå</ulink>ãå½ä½ å®è£
å®äºAntï¼å°±å¯ä»¥å¼å§å建<literal>build.xml</literal>æ件ï¼æå®ç´æ¥æ¾å¨å¼åç®å½ä¸é¢ã
+ </para>
+ <para>
+ ä¸ä¸ªç®åçbuildæ件çèµ·æ¥åè¿æ ·ï¼
+ </para>
+
+ <programlisting><![CDATA[<project name="hibernate-tutorial" default="compile">
+
+ <property name="sourcedir" value="${basedir}/src"/>
+ <property name="targetdir" value="${basedir}/bin"/>
+ <property name="librarydir" value="${basedir}/lib"/>
+
+ <path id="libraries">
+ <fileset dir="${librarydir}">
+ <include name="*.jar"/>
+ </fileset>
+ </path>
+
+ <target name="clean">
+ <delete dir="${targetdir}"/>
+ <mkdir dir="${targetdir}"/>
+ </target>
+
+ <target name="compile" depends="clean, copy-resources">
+ <javac srcdir="${sourcedir}"
+ destdir="${targetdir}"
+ classpathref="libraries"/>
+ </target>
+
+ <target name="copy-resources">
+ <copy todir="${targetdir}">
+ <fileset dir="${sourcedir}">
+ <exclude name="**/*.java"/>
+ </fileset>
+ </copy>
+ </target>
+
+</project>]]></programlisting>
+
+ <para>
+ è¿å°åè¯Antæææå¨libç®å½ä¸ä»¥<literal>.jar</literal>ç»å°¾çæ件æ·è´å°classpathä¸ä»¥ä¾ç¼è¯ä¹ç¨ãå®ä¹æææçéJavaæºä»£ç æ件ï¼ä¾å¦é
ç½®åHibernateæ å°æ件ï¼æ·è´å°ç®æ ç®å½ãå¦æä½ ç°å¨è¿è¡Antï¼ä¼å¾å°ä»¥ä¸è¾åºï¼
+ </para>
+
+ <programlisting><![CDATA[C:\hibernateTutorial\>ant
+Buildfile: build.xml
+
+copy-resources:
+ [copy] Copying 2 files to C:\hibernateTutorial\bin
+
+compile:
+ [javac] Compiling 1 source file to C:\hibernateTutorial\bin
+
+BUILD SUCCESSFUL
+Total time: 1 second ]]></programlisting>
+
+ </sect2>
+
+ <sect2 id="tutorial-firstapp-helpers" revision="3">
+ <title>
+ å¯å¨åè¾
å©ç±»
+ </title>
+
+
+ <para>
+ æ¯æ¶åæ¥å è½½åå¨åä¸äº<literal>Event</literal>对象äºï¼ä½é¦å
æ们å¾ç¼åä¸äºåºç¡ç代ç 以å®æ设置ãæ们å¿
é¡»å¯å¨Hibernateï¼æ¤è¿ç¨å
æ¬å建ä¸ä¸ªå
¨å±ç<literal>SessoinFactory</literal>ï¼å¹¶æå®å¨åå¨åºç¨ç¨åºä»£ç 容æ访é®çå°æ¹ã<literal>SessionFactory</literal>å¯ä»¥å建并æå¼æ°ç<literal>Session</literal>ãä¸ä¸ª<literal>Session</literal>代表ä¸ä¸ªå线ç¨çåå
æä½ï¼<literal>SessionFactory</literal>åæ¯ä¸ªçº¿ç¨å®å
¨çå
¨å±å¯¹è±¡ï¼åªéè¦è¢«å®ä¾åä¸æ¬¡ã
+ </para>
+
+ <para>
+ æ们å°å建ä¸ä¸ª<literal>HibernateUtil</literal>è¾
å©ç±»ï¼helper classï¼æ¥è´è´£å¯å¨Hibernateåæ´æ¹ä¾¿å°æä½<literal>SessionFactory</literal>ã让æ们æ¥çä¸ä¸å®çå®ç°ï¼
+ </para>
+
+ <programlisting><![CDATA[package util;
+
+import org.hibernate.*;
+import org.hibernate.cfg.*;
+
+public class HibernateUtil {
+
+ private static final SessionFactory sessionFactory;
+
+ static {
+ try {
+ // Create the SessionFactory from hibernate.cfg.xml
+ sessionFactory = new Configuration().configure().buildSessionFactory();
+ } catch (Throwable ex) {
+ // Make sure you log the exception, as it might be swallowed
+ System.err.println("Initial SessionFactory creation failed." + ex);
+ throw new ExceptionInInitializerError(ex);
+ }
+ }
+
+ public static SessionFactory getSessionFactory() {
+ return sessionFactory;
+ }
+
+}]]></programlisting>
+
+
+ <para>
+ è¿ä¸ªç±»ä¸ä½å¨å®çéæåå§åè¿ç¨ï¼ä»
å½å è½½è¿ä¸ªç±»çæ¶å被JVMæ§è¡ä¸æ¬¡ï¼ä¸äº§çå
¨å±ç<literal>SessionFactory</literal>ï¼èä¸éèäºå®ä½¿ç¨äºéæsingletonçäºå®ãå®ä¹å¯è½å¨åºç¨ç¨åºæå¡å¨ä¸çJNDIæ¥æ¾<literal>SessionFactory</literal>ã
+ </para>
+
+ <para>
+ å¦æä½ å¨é
ç½®æ件ä¸ç»<literal>SessionFactory</literal>ä¸ä¸ªååï¼å¨<literal>SessionFactory</literal>å建åï¼Hibernateä¼è¯çæå®ç»å®å°JNDIãè¦å®å
¨é¿å
è¿æ ·ç代ç ï¼ä½ ä¹å¯ä»¥ä½¿ç¨JMXé¨ç½²ï¼è®©å
·æJMXè½åç容å¨æ¥å®ä¾å<literal>HibernateService</literal>并æå®ç»å®å°JNDIãè¿äºé«çº§å¯é项å¨åé¢çç« èä¸ä¼è®¨è®ºå°ã
+ </para>
+
+ <para>
+ æ<literal>HibernateUtil.java</literal>æ¾å¨å¼åç®å½çæºä»£ç è·¯å¾ä¸ï¼ä¸æ¾<literal>events</literal>çå
并åï¼
+ </para>
+
+ <programlisting><![CDATA[.
++lib
+ <Hibernate and third-party libraries>
++src
+ +events
+ Event.java
+ Event.hbm.xml
+ +util
+ HibernateUtil.java
+ hibernate.cfg.xml
++data
+build.xml]]></programlisting>
+
+
+ <para>
+ å次ç¼è¯è¿ä¸ªåºç¨ç¨åºåºè¯¥ä¸ä¼æé®é¢ãæåæ们éè¦é
ç½®ä¸ä¸ªæ¥å¿ï¼logging)ç³»ç» ï¼ Hibernate使ç¨éç¨æ¥å¿æ¥å£ï¼å
è®¸ä½ å¨Log4jåJDK 1.4 æ¥å¿ä¹é´è¿è¡éæ©ãå¤æ°å¼åè
æ´å欢Log4jï¼ä»Hibernateçåå¸å
ä¸ï¼å®å¨<literal>etc/</literal>ç®å½ä¸ï¼æ·è´<literal>log4j.properties</literal>å°ä½ ç<literal>src</literal>ç®å½ï¼ä¸<literal>hibernate.cfg.xml</literal>.æ¾å¨ä¸èµ·ãçä¸ä¸é
置示ä¾ï¼å¦æä½ å¸æçå°æ´å 详ç»çè¾åºä¿¡æ¯ï¼ä½ å¯ä»¥ä¿®æ¹é
ç½®ãé»è®¤æ
åµä¸ï¼åªæHibernateçå¯å¨ä¿¡æ¯æä¼æ¾ç¤ºå¨æ åè¾åºä¸ã
+ </para>
+
+ <para>
+ 示ä¾çåºæ¬æ¡æ¶å®æäº ï¼ ç°å¨æ们å¯ä»¥ç¨Hibernateæ¥åäºçæ£çå·¥ä½ã
+ </para>
+
+ </sect2>
+
+ <sect2 id="tutorial-firstapp-workingpersistence" revision="5">
+ <title>
+ å 载并åå¨å¯¹è±¡
+ </title>
+
+ <para>
+ æ们ç»äºå¯ä»¥ä½¿ç¨Hibernateæ¥å è½½ååå¨å¯¹è±¡äºï¼ç¼åä¸ä¸ªå¸¦æ<literal>main()</literal>æ¹æ³ç<literal>EventManager</literal>ç±»ï¼
+
+ </para>
+
+ <programlisting><![CDATA[package events;
+import org.hibernate.Session;
+
+import java.util.Date;
+
+import util.HibernateUtil;
+
+public class EventManager {
+
+ public static void main(String[] args) {
+ EventManager mgr = new EventManager();
+
+ if (args[0].equals("store")) {
+ mgr.createAndStoreEvent("My Event", new Date());
+ }
+
+ HibernateUtil.getSessionFactory().close();
+ }
+
+ private void createAndStoreEvent(String title, Date theDate) {
+
+ Session session = HibernateUtil.getSessionFactory().getCurrentSession();
+
+ session.beginTransaction();
+
+ Event theEvent = new Event();
+ theEvent.setTitle(title);
+ theEvent.setDate(theDate);
+
+ session.save(theEvent);
+
+ session.getTransaction().commit();
+ }
+
+}]]></programlisting>
+
+
+ <para>
+ æ们å建äºä¸ªæ°ç<literal>Event</literal>对象并æå®ä¼ éç»Hibernateãç°å¨Hibernateè´è´£ä¸SQLæ交éï¼å¹¶æ<literal>INSERT</literal>å½ä»¤ä¼ ç»æ°æ®åºãå¨è¿è¡ä¹åï¼è®©æ们çä¸ä¸å¤ç<literal>Session</literal>å<literal>Transaction</literal>ç代ç ã
+
+ </para>
+ <para>
+ ä¸ä¸ª<literal>Session</literal>å°±æ¯ä¸ªåä¸çå·¥ä½åå
ãæ们ææ¶è®©äºæ
ç®åä¸äºï¼å¹¶å设Hibernate<literal>Session</literal>åæ°æ®åºäºå¡æ¯ä¸ä¸å¯¹åºçã为äºè®©æ们ç代ç ä»åºå±çäºå¡ç³»ç»ä¸è±ç¦»åºæ¥ï¼æ¤ä¾ä¸æ¯JDBCï¼ä½ä¹å¯è½æ¯JTAï¼ï¼æ们使ç¨Hibernate <literal>Session</literal>ä¸ç<literal>Transaction</literal> APIã
+ </para>
+
+ <para>
+ <literal>sessionFactory.getCurrentSession()</literal>æ¯å¹²ä»ä¹çå¢ï¼é¦å
ï¼åªè¦ä½ ææ<literal>SessionFactory</literal>ï¼å¹¸äºæ们æ<literal>HibernateUtil</literal>ï¼å¯ä»¥éæ¶è·å¾ï¼ï¼å¤§å¯å¨ä»»ä½æ¶åãä»»ä½å°ç¹è°ç¨è¿ä¸ªæ¹æ³ã<literal>getCurrentSession()</literal>æ¹æ³æ»ä¼è¿åâå½åçâå·¥ä½åå
ãè®°å¾æ们å¨<literal>hibernate.cfg.xml</literal>ä¸æè¿ä¸é
ç½®é项è°æ´ä¸º"thread"äºåï¼å æ¤ï¼å æ¤ï¼å½åå·¥ä½åå
被ç»å®å°å½åæ§è¡æ们åºç¨ç¨åºçJava线ç¨ãä½æ¯ï¼è¿å¹¶éæ¯å®å
¨åç¡®ç,ä½ è¿å¾èèå·¥ä½åå
ççå½å¨æèå´ (scope),å®ä½æ¶å¼å§,åä½æ¶ç»æ.
+ </para>
+
+ <para>
+ <literal>Session</literal>å¨ç¬¬ä¸æ¬¡è¢«ä½¿ç¨çæ¶å,å³ç¬¬ä¸æ¬¡è°ç¨<literal>getCurrentSession()</literal>çæ¶å,å
¶çå½å¨æå°±å¼å§ãç¶åå®è¢«Hibernateç»å®å°å½å线ç¨ãå½äºå¡ç»æçæ¶åï¼ä¸ç®¡æ¯æ交è¿æ¯åæ»ï¼Hibernateä¼èªå¨æ<literal>Session</literal>ä»å½å线ç¨å¥ç¦»ï¼å¹¶ä¸å
³éå®ãåè¥ä½ å次è°ç¨<literal>getCurrentSession()</literal>ï¼ä½ ä¼å¾å°ä¸ä¸ªæ°ç<literal>Session</literal>ï¼å¹¶ä¸å¼å§ä¸ä¸ªæ°çå·¥ä½åå
ãè¿ç§<emphasis>线ç¨ç»å®(thread-bound)</emphasis>çç¼ç¨æ¨¡åï¼modelï¼æ¯ä½¿ç¨Hibernateçæ广æ³çæ¹å¼,å 为å®æ¯æå¯¹ä½ ç代ç çµæ´»åå±(äºå¡ååå¯ä»¥åä½ çæ°æ®è®¿é®ä»£ç å离å¼æ¥,å¨æ¬æç¨çåé¢é¨åå°±ä¼è¿ä¹å)ã
+
+ </para>
+
+ <para>
+
+ åå·¥ä½åå
ççå½å¨æè¿ä¸ªè¯é¢ç¸å
³ï¼Hibernate <literal>Session</literal>æ¯å¦è¢«åºè¯¥ç¨æ¥æ§è¡å¤æ¬¡æ°æ®åºæä½ï¼ä¸é¢çä¾å对æ¯ä¸æ¬¡æä½ä½¿ç¨äºä¸ä¸ª<literal>Session</literal>ï¼è¿å®å
¨æ¯å·§åï¼è¿ä¸ªä¾åä¸æ¯å¾å¤æï¼æ æ³å±ç¤ºå
¶ä»æ¹å¼ãHibernate <literal>Session</literal>ççå½å¨æå¯ä»¥å¾çµæ´»ï¼ä½æ¯ä½ ç»ä¸è¦æä½ çåºç¨ç¨åºè®¾è®¡æ为<emphasis>æ¯ä¸æ¬¡</emphasis>æ°æ®åºæä½é½ç¨ä¸ä¸ªæ°çHibernate <literal>Session</literal>ãå æ¤å°±ç®ä¸é¢çä¾åï¼å®ä»¬é½å¾ç®åï¼ä¸ä½ å¯ä»¥çå°è¿ç§ç¨æ³ï¼è®°ä½<emphasis>æ¯æ¬¡æä½ä¸ä¸ªsession</emphasis>æ¯ä¸ä¸ªå模å¼ãå¨æ¬æç¨çåé¢ä¼å±ç¤ºä¸ä¸ªçæ£ç(web)ç¨åºã
+ </para>
+
+
+
+ <para>
+ å
³äºäºå¡å¤çåäºå¡è¾¹ççå®ç详ç»ä¿¡æ¯ï¼è¯·åç<xref linkend="transactions"/>ãå¨ä¸é¢çä¾åä¸ï¼æ们ä¹å¿½ç¥äºææçé误ä¸åæ»çå¤çã
+ </para>
+
+ <para>
+ 为第ä¸æ¬¡è¿è¡æ们çç¨åºï¼æ们å¾å¨Antçbuildæ件ä¸å¢å ä¸ä¸ªå¯ä»¥è°ç¨å¾å°çtargetã
+ </para>
+
+ <programlisting><![CDATA[<target name="run" depends="compile">
+ <java fork="true" classname="events.EventManager" classpathref="libraries">
+ <classpath path="${targetdir}"/>
+ <arg value="${action}"/>
+ </java>
+</target>]]></programlisting>
+
+ <para>
+ <literal>action</literal>åæ°ï¼argumentï¼çå¼æ¯éè¿å½ä»¤è¡è°ç¨è¿ä¸ªtargetçæ¶å设置çï¼
+ </para>
+
+ <programlisting><![CDATA[C:\hibernateTutorial\>ant run -Daction=store]]></programlisting>
+
+ <para>
+ ä½ åºè¯¥ä¼çå°ï¼ç¼è¯ä»¥åï¼Hibernateæ ¹æ®ä½ çé
ç½®å¯å¨ï¼å¹¶äº§çä¸å¤§å çè¾åºæ¥å¿ãå¨æ¥å¿æåä½ ä¼çå°ä¸é¢è¿è¡ï¼
+ </para>
+
+ <programlisting><![CDATA[[java] Hibernate: insert into EVENTS (EVENT_DATE, title, EVENT_ID) values (?, ?, ?)]]></programlisting>
+
+ <para>
+ è¿æ¯Hibernateæ§è¡ç<literal>INSERT</literal>å½ä»¤ï¼é®å·ä»£è¡¨JDBCçç»å®åæ°ãå¦ææ³è¦çå°ç»å®åæ°çå¼æè
åå°æ¥å¿çé¿åº¦ï¼å°±è¦è°æ´ä½ å¨<literal>log4j.properties</literal>æ件éç设置ã
+ </para>
+
+ <para>
+ æ们æ³è¦ååºææå·²ç»è¢«åå¨çeventsï¼å°±è¦å¢å ä¸ä¸ªæ¡ä»¶åæ¯é项å°mainæ¹æ³ä¸å»ã
+ </para>
+
+ <programlisting><![CDATA[if (args[0].equals("store")) {
+ mgr.createAndStoreEvent("My Event", new Date());
+}
+else if (args[0].equals("list")) {
+ List events = mgr.listEvents();
+ for (int i = 0; i < events.size(); i++) {
+ Event theEvent = (Event) events.get(i);
+ System.out.println("Event: " + theEvent.getTitle() +
+ " Time: " + theEvent.getDate());
+ }
+}]]></programlisting>
+
+ <para>
+ æ们ä¹å¢å ä¸ä¸ªæ°ç<literal>listEvents()</literal>æ¹æ³:
+ </para>
+
+ <programlisting><![CDATA[private List listEvents() {
+
+ Session session = HibernateUtil.getSessionFactory().getCurrentSession();
+
+ session.beginTransaction();
+
+ List result = session.createQuery("from Event").list();
+
+ session.getTransaction().commit();
+
+ return result;
+}]]></programlisting>
+
+ <para>
+ æ们å¨è¿éæ¯ç¨ä¸ä¸ªHQLï¼Hibernate Query Languageï¼Hibernateæ¥è¯¢è¯è¨ï¼æ¥è¯¢è¯å¥æ¥ä»æ°æ®åºä¸å è½½ææåå¨ç<literal>Event</literal>对象ãHibernateä¼çæéå½çSQLï¼æå®åéå°æ°æ®åºï¼å¹¶æä½ä»æ¥è¯¢å¾å°æ°æ®ç<literal>Event</literal>对象ãå½ç¶ï¼ä½ å¯ä»¥ä½¿ç¨HQLæ¥å建æ´å å¤æçæ¥è¯¢ã
+ </para>
+
+ <para>
+ ç°å¨ï¼æ ¹æ®ä»¥ä¸æ¥éª¤æ¥æ§è¡å¹¶æµè¯ä»¥ä¸å项ï¼
+ </para>
+
+ <itemizedlist>
+ <listitem>
+ <para>
+ è¿è¡<literal>ant run -Daction=store</literal>æ¥ä¿åä¸äºå
容å°æ°æ®åºãå½ç¶ï¼å
å¾ç¨hbm2ddlæ¥çææ°æ®åºschemaã
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ ç°å¨æ<literal>hibernate.cfg.xml</literal>æ件ä¸hbm2ddlå±æ§æ³¨éæï¼è¿æ ·æ们就åæ¶äºå¨å¯å¨æ¶ç¨hbm2ddlæ¥çææ°æ®åºschemaãé常åªæå¨ä¸æéå¤è¿è¡åå
æµè¯çæ¶åæéè¦æå¼å®ï¼ä½å次è¿è¡hbm2ddlä¼æä½ ä¿åçä¸åé½å æï¼<emphasis>drop</emphasis>ï¼ââ<literal>create</literal>é
ç½®ççå®å«ä¹æ¯ï¼âå¨å建SessionFactoryçæ¶åï¼ä»schema ä¸drop æææç表ï¼åéæ°å建å®ä»¬âã
+ </para>
+ </listitem>
+ </itemizedlist>
+
+
+ <para>
+ å¦æä½ ç°å¨ä½¿ç¨å½ä»¤è¡åæ°<literal>-Daction=list</literal>è¿è¡Antï¼ä½ ä¼çå°é£äºè³ä»ä¸ºæ¢æ们æå¨åçeventsãå½ç¶ï¼ä½ ä¹å¯ä»¥å¤è°ç¨å 次<literal>store</literal>以ä¿åæ´å¤çenventsã
+ </para>
+
+ <para>
+ 注æï¼å¾å¤Hibernateæ°æå¨è¿ä¸æ¥ä¼å¤±è´¥ï¼æ们ä¸æ¶çå°å
³äº<emphasis>Table not found</emphasis>é误信æ¯çæé®ãä½æ¯ï¼åªè¦ä½ æ ¹æ®ä¸é¢æè¿°çæ¥éª¤æ¥æ§è¡ï¼å°±ä¸ä¼æè¿ä¸ªé®é¢ï¼å 为hbm2ddlä¼å¨ç¬¬ä¸æ¬¡è¿è¡çæ¶åå建æ°æ®åºschemaï¼å继çåºç¨ç¨åºéèµ·åè¿è½ç»§ç»ä½¿ç¨è¿ä¸ªschemaãåè¥ä½ ä¿®æ¹äºæ å°ï¼æè
ä¿®æ¹äºæ°æ®åºschemaï¼ä½ å¿
é¡»æhbm2ddléæ°æå¼ä¸æ¬¡ã
+ </para>
+
+ </sect2>
+
+ </sect1>
+ <sect1 id="tutorial-associations">
+ <title>
+ 第äºé¨å ï¼ å
³èæ å°
+ </title>
+
+ <para>
+ æ们已ç»æ å°äºä¸ä¸ªæä¹
åå®ä½ç±»å°è¡¨ä¸ã让æ们å¨è¿ä¸ªåºç¡ä¸å¢å ä¸äºç±»ä¹é´çå
³èãé¦å
æ们å¾åºç¨ç¨åºéå¢å 人ï¼peopleï¼çæ¦å¿µï¼å¹¶åå¨ä»ä»¬æåä¸çä¸ä¸ªEventå表ãï¼è¯è
注ï¼ä¸Eventä¸æ ·ï¼æ们å¨åé¢å°ç´æ¥ä½¿ç¨personæ¥è¡¨ç¤ºâ人âèä¸æ¯å®çä¸æç¿»è¯ï¼
+ </para>
+
+ <sect2 id="tutorial-associations-mappinguser" revision="1">
+ <title>
+ æ å°Personç±»
+ </title>
+
+ <para>
+ æåç®åç<literal>Person</literal>ç±»ï¼
+ </para>
+
+ <programlisting><![CDATA[package events;
+
+public class Person {
+
+ private Long id;
+ private int age;
+ private String firstname;
+ private String lastname;
+
+ public Person() {}
+
+ // Accessor methods for all properties, private setter for 'id'
+
+}]]></programlisting>
+
+ <para>
+ å建ä¸ä¸ªå为<literal>Person.hbm.xml</literal>çæ°æ å°æ件ï¼å«å¿äºæä¸é¢çDTDå¼ç¨ï¼ï¼
+ </para>
+
+ <programlisting><![CDATA[<hibernate-mapping>
+
+ <class name="events.Person" table="PERSON">
+ <id name="id" column="PERSON_ID">
+ <generator class="native"/>
+ </id>
+ <property name="age"/>
+ <property name="firstname"/>
+ <property name="lastname"/>
+ </class>
+
+</hibernate-mapping>]]></programlisting>
+
+ <para>
+ æåï¼ææ°çæ å°å å
¥å°Hibernateçé
ç½®ä¸ï¼
+ </para>
+
+ <programlisting><![CDATA[<mapping resource="events/Event.hbm.xml"/>
+<mapping resource="events/Person.hbm.xml"/>]]></programlisting>
+
+ <para>
+ ç°å¨æ们å¨è¿ä¸¤ä¸ªå®ä½ä¹é´å建ä¸ä¸ªå
³èãæ¾ç¶ï¼personså¯ä»¥åä¸ä¸ç³»åeventsï¼èeventsä¹æä¸åçåå è
ï¼personsï¼ãæ们éè¦å¤çç设计é®é¢æ¯å
³èæ¹åï¼directionalityï¼ï¼é¶æ°ï¼multiplicityï¼åéåï¼collectionï¼çè¡ä¸ºã
+ </para>
+
+ </sect2>
+
+ <sect2 id="tutorial-associations-unidirset" revision="3">
+ <title>
+ ååSet-basedçå
³è
+ </title>
+
+ <para>
+ æ们å°å<literal>Person</literal>ç±»å¢å ä¸è¿ä¸²çeventsãé£æ ·ï¼éè¿è°ç¨<literal>aPerson.getEvents()</literal>ï¼å°±å¯ä»¥è½»æ¾å°å¯¼èªå°ç¹å®personæåä¸çeventsï¼èä¸ç¨å»æ§è¡ä¸ä¸ªæ¾å¼çæ¥è¯¢ãæ们使ç¨Javaçéåç±»ï¼collectionï¼ï¼<literal>Set</literal>ï¼å 为set ä¸å
å«éå¤çå
ç´ åä¸æ们æ å
³çæåºã
+ </para>
+
+ <para>
+ æ们éè¦ç¨set å®ç°ä¸ä¸ªååå¤å¼å
³èã让æ们å¨Javaç±»é为è¿ä¸ªå
³èç¼ç ï¼æ¥çæ å°å®ï¼
+ </para>
+
+ <programlisting><![CDATA[public class Person {
+
+ private Set events = new HashSet();
+
+ public Set getEvents() {
+ return events;
+ }
+
+ public void setEvents(Set events) {
+ this.events = events;
+ }
+}]]></programlisting>
+
+ <para>
+ å¨æ å°è¿ä¸ªå
³èä¹åï¼å
èèä¸ä¸æ¤å
³èçå¦å¤ä¸ç«¯ãå¾æ¾ç¶ï¼æ们å¯ä»¥ä¿æè¿ä¸ªå
³èæ¯ååçãæè
ï¼æ们å¯ä»¥å¨<literal>Event</literal>éå建å¦å¤ä¸ä¸ªéåï¼å¦æå¸æè½å¤ååå°å¯¼èªï¼å¦ï¼<literal>anEvent.getParticipants()</literal>ãä»åè½çè§åº¦æ¥è¯´ï¼è¿å¹¶ä¸æ¯å¿
é¡»çãå ä¸ºä½ æ»å¯ä»¥æ¾å¼å°æ§è¡ä¸ä¸ªæ¥è¯¢ï¼ä»¥è·å¾æ个ç¹å®eventçææåä¸è
ãè¿æ¯ä¸ªå¨è®¾è®¡æ¶éè¦ååºçéæ©ï¼å®å
¨ç±ä½ æ¥å³å®ï¼ä½æ¤è®¨è®ºä¸å
³äºå
³èçé¶æ°æ¯æ¸
æ¥çï¼å³ä¸¤ç«¯é½æ¯âå¤âå¼çï¼æ们æå®å«å<emphasis>å¤å¯¹å¤(many-to-many)</emphasis>å
³èãå èï¼æ们使ç¨Hibernateçå¤å¯¹å¤æ å°ï¼
+ </para>
+
+ <programlisting><![CDATA[<class name="events.Person" table="PERSON">
+ <id name="id" column="PERSON_ID">
+ <generator class="native"/>
+ </id>
+ <property name="age"/>
+ <property name="firstname"/>
+ <property name="lastname"/>
+
+ <set name="events" table="PERSON_EVENT">
+ <key column="PERSON_ID"/>
+ <many-to-many column="EVENT_ID" class="events.Event"/>
+ </set>
+
+</class>]]></programlisting>
+
+ <para>
+ Hibernateæ¯æåç§åæ ·çéåæ å°ï¼<literal><set></literal>使ç¨çæ为æ®éã对äºå¤å¯¹å¤å
³èï¼æå«<emphasis>n:m</emphasis>å®ä½å
³ç³»ï¼, éè¦ä¸ä¸ªå
³è表ï¼association tableï¼ã<literal>表</literal>éé¢çæ¯ä¸è¡ä»£è¡¨ä»personå°eventçä¸ä¸ªå
³èã表åæ¯ç±<literal>set</literal>å
ç´ ç<literal>table</literal>å±æ§é
ç½®çãå
³èéé¢çæ è¯ç¬¦å段åï¼å¯¹äºpersonçä¸ç«¯ï¼æ¯ç±<literal><key></literal>å
ç´ å®ä¹ï¼èeventä¸ç«¯çå段åæ¯ç±<literal><many-to-many></literal>å
ç´ ç<literal>column</literal>å±æ§å®ä¹ãä½ ä¹å¿
é¡»åè¯Hibernateéåä¸å¯¹è±¡çç±»ï¼ä¹å°±æ¯ä½äºè¿ä¸ªéåæ代表çå
³èå¦å¤ä¸ç«¯çç±»ï¼ã
+ </para>
+
+ <para>
+ å èè¿ä¸ªæ å°çæ°æ®åºschemaæ¯ï¼
+ </para>
+
+ <programlisting><![CDATA[
+ _____________ __________________
+ | | | | _____________
+ | EVENTS | | PERSON_EVENT | | |
+ |_____________| |__________________| | PERSON |
+ | | | | |_____________|
+ | *EVENT_ID | <--> | *EVENT_ID | | |
+ | EVENT_DATE | | *PERSON_ID | <--> | *PERSON_ID |
+ | TITLE | |__________________| | AGE |
+ |_____________| | FIRSTNAME |
+ | LASTNAME |
+ |_____________|
+ ]]></programlisting>
+
+ </sect2>
+
+ <sect2 id="tutorial-associations-working" revision="2">
+ <title>
+ 使å
³èå·¥ä½
+ </title>
+
+ <para>
+ æ们æä¸äºpeopleåevents ä¸èµ·æ¾å°<literal>EventManager</literal>çæ°æ¹æ³ä¸ï¼
+ </para>
+
+ <programlisting><![CDATA[private void addPersonToEvent(Long personId, Long eventId) {
+
+ Session session = HibernateUtil.getSessionFactory().getCurrentSession();
+ session.beginTransaction();
+
+ Person aPerson = (Person) session.load(Person.class, personId);
+ Event anEvent = (Event) session.load(Event.class, eventId);
+
+ aPerson.getEvents().add(anEvent);
+
+ session.getTransaction().commit();
+}]]></programlisting>
+
+ <para>
+ å¨å è½½ä¸<literal>Person</literal>å<literal>Event</literal>åï¼ä½¿ç¨æ®éçéåæ¹æ³å°±å¯å®¹æå°ä¿®æ¹æ们å®ä¹çéåãå¦ä½ æè§ï¼æ²¡ææ¾å¼ç<literal>update()</literal>æ<literal>save()</literal>ï¼Hibernateä¼èªå¨æ£æµå°éåå·²ç»è¢«ä¿®æ¹å¹¶éè¦æ´æ°åæ°æ®åºãè¿å«åèªå¨èæ£æ¥ï¼<emphasis>automatic dirty checking</emphasis>ï¼ï¼ä½ ä¹å¯ä»¥å°è¯ä¿®æ¹ä»»ä½å¯¹è±¡çnameæè
dateå±æ§ï¼åªè¦ä»ä»¬å¤äº<emphasis>æä¹
å</emphasis>ç¶æï¼ä¹å°±æ¯è¢«ç»å®å°æ个Hibernate ç<literal>Session</literal>ä¸ï¼å¦ï¼ä»ä»¬ååå¨ä¸ä¸ªåå
æä½è¢«å è½½æè
ä¿åï¼ï¼Hibernateçè§ä»»ä½æ¹å并å¨åå°éå¼åçæ¹å¼æ§è¡SQLãåæ¥å
åç¶æåæ°æ®åºçè¿ç¨ï¼é常åªå¨åå
æä½ç»æçæ¶ååçï¼ç§°æ¤è¿ç¨ä¸ºæ¸
çç¼å<emphasis>ï¼flushingï¼</emphasis>ãå¨æ们ç代ç ä¸ï¼å·¥ä½åå
ç±æ°æ®åºäºå¡çæ交ï¼æè
åæ»ï¼æ¥ç»æââè¿æ¯ç±<literal>Curren!
tSessionContext</literal>ç±»ç<literal>thread</literal>é
ç½®é项å®ä¹çã
+ </para>
+
+ <para>
+ å½ç¶ï¼ä½ ä¹å¯ä»¥å¨ä¸åçåå
æä½éé¢å è½½personåeventãæå¨<literal>Session</literal>以å¤ä¿®æ¹ä¸æ¯å¤å¨æä¹
åï¼persistentï¼ç¶æä¸ç对象ï¼å¦æ该对象以åæ¾ç»è¢«æä¹
åï¼é£ä¹æ们称è¿ä¸ªç¶æ为<emphasis>è±ç®¡ï¼detachedï¼</emphasis>ï¼ãä½ çè³å¯ä»¥å¨ä¸ä¸ªéå被è±ç®¡æ¶ä¿®æ¹å®ï¼
+ </para>
+
+ <programlisting><![CDATA[private void addPersonToEvent(Long personId, Long eventId) {
+
+ Session session = HibernateUtil.getSessionFactory().getCurrentSession();
+ session.beginTransaction();
+
+ Person aPerson = (Person) session
+ .createQuery("select p from Person p left join fetch p.events where p.id = :pid")
+ .setParameter("pid", personId)
+ .uniqueResult(); // Eager fetch the collection so we can use it detached
+
+ Event anEvent = (Event) session.load(Event.class, eventId);
+
+ session.getTransaction().commit();
+
+ // End of first unit of work
+
+ aPerson.getEvents().add(anEvent); // aPerson (and its collection) is detached
+
+ // Begin second unit of work
+
+ Session session2 = HibernateUtil.getSessionFactory().getCurrentSession();
+ session2.beginTransaction();
+
+ session2.update(aPerson); // Reattachment of aPerson
+
+ session2.getTransaction().commit();
+}]]></programlisting>
+
+ <para>
+ 对<literal>update</literal>çè°ç¨ä½¿ä¸ä¸ªè±ç®¡å¯¹è±¡éæ°æä¹
åï¼ä½ å¯ä»¥è¯´å®è¢«ç»å®å°ä¸ä¸ªæ°çåå
æä½ä¸ï¼æ以å¨è±ç®¡ç¶æä¸å¯¹å®æåçä»»ä½ä¿®æ¹é½ä¼è¢«ä¿åå°æ°æ®åºéãè¿ä¹å
æ¬ä½ 对è¿ä¸ªå®ä½å¯¹è±¡çéåæä½çä»»ä½æ¹å¨ï¼å¢å /å é¤ï¼ã
+ </para>
+
+ <para>
+ è¿å¯¹æ们å½åçæ
å½¢ä¸æ¯å¾æç¨ï¼ä½å®æ¯é常éè¦çæ¦å¿µï¼ä½ å¯ä»¥æå®èå
¥å°ä½ èªå·±çåºç¨ç¨åºè®¾è®¡ä¸ãå¨<literal>EventManager</literal>çmainæ¹æ³ä¸æ·»å ä¸ä¸ªæ°çå¨ä½ï¼å¹¶ä»å½ä»¤è¡è¿è¡å®æ¥å®ææ们æåçç»ä¹ ãå¦æä½ éè¦personåeventçæ è¯ç¬¦ â é£å°±ç¨<literal>save()</literal>æ¹æ³è¿åå®ï¼ä½ å¯è½éè¦ä¿®æ¹åé¢çä¸äºæ¹æ³æ¥è¿åé£ä¸ªæ è¯ç¬¦ï¼ï¼
+ </para>
+
+ <programlisting><![CDATA[else if (args[0].equals("addpersontoevent")) {
+ Long eventId = mgr.createAndStoreEvent("My Event", new Date());
+ Long personId = mgr.createAndStorePerson("Foo", "Bar");
+ mgr.addPersonToEvent(personId, eventId);
+ System.out.println("Added person " + personId + " to event " + eventId);
+}]]></programlisting>
+
+ <para>
+ ä¸é¢æ¯ä¸ªå
³äºä¸¤ä¸ªåçéè¦çå®ä½ç±»é´å
³èçä¾åãååé¢ææå°çé£æ ·ï¼å¨ç¹å®ç模åä¸ä¹åå¨å
¶å®çç±»åç±»åï¼è¿äºç±»åç±»åé常æ¯â次è¦çâãä½ å·²çå°è¿å
¶ä¸çä¸äºï¼å<literal>int</literal>æ<literal>String</literal>ãæ们称è¿äºç±»ä¸º<emphasis>å¼ç±»åï¼value typeï¼</emphasis>ï¼å®ä»¬çå®ä¾<emphasis>ä¾èµï¼dependï¼</emphasis>å¨æ个ç¹å®çå®ä½ä¸ãè¿äºç±»åçå®ä¾æ²¡æå®ä»¬èªå·±çæ è¯ï¼identityï¼ï¼ä¹ä¸è½å¨å®ä½é´è¢«å
±äº«ï¼æ¯å¦ï¼ä¸¤ä¸ªpersonä¸è½å¼ç¨åä¸ä¸ª<literal>firstname</literal>对象ï¼å³ä½¿ä»ä»¬æç¸åçfirst nameï¼ãå½ç¶ï¼å¼ç±»å并ä¸ä»
ä»
å¨JDKä¸åå¨ï¼äºå®ä¸ï¼å¨ä¸ä¸ªHibernateåºç¨ç¨åºä¸ï¼ææçJDKç±»é½è¢«è§ä¸ºå¼ç±»åï¼ï¼èä¸ä½ ä¹å¯ä»¥ç¼åä½ èªå·±çä¾èµç±»ï¼ä¾å¦<literal>Address</literal>ï¼<literal>MonetaryAmount</literal>ã
+ </para>
+
+ <para>
+ ä½ ä¹å¯ä»¥è®¾è®¡ä¸ä¸ªå¼ç±»åçéåï¼è¿å¨æ¦å¿µä¸ä¸å¼ç¨å
¶å®å®ä½çéåæå¾å¤§çä¸åï¼ä½æ¯å¨Javaéé¢çèµ·æ¥å ä¹æ¯ä¸æ ·çã
+ </para>
+
+ </sect2>
+
+ <sect2 id="tutorial-associations-valuecollections">
+ <title>
+ å¼ç±»åçéå
+ </title>
+
+ <para>
+ æ们æä¸ä¸ªå¼ç±»å对象çéåå å
¥<literal>Person</literal>å®ä½ä¸ãæ们å¸æä¿åemailå°åï¼æ以使ç¨<literal>String</literal>ç±»åï¼èä¸è¿æ¬¡çéåç±»ååæ¯<literal>Set</literal>ï¼
+ </para>
+ <programlisting><![CDATA[private Set emailAddresses = new HashSet();
+
+public Set getEmailAddresses() {
+ return emailAddresses;
+}
+
+public void setEmailAddresses(Set emailAddresses) {
+ this.emailAddresses = emailAddresses;
+}]]></programlisting>
+
+ <para>
+ è¿ä¸ª<literal>Set</literal>çæ å°
+ </para>
+
+ <programlisting><![CDATA[<set name="emailAddresses" table="PERSON_EMAIL_ADDR">
+ <key column="PERSON_ID"/>
+ <element type="string" column="EMAIL_ADDR"/>
+</set>]]></programlisting>
+
+ <para>
+ æ¯è¾è¿æ¬¡åæ¤åæ å°çå·®å«ï¼ä¸»è¦å¨äº<literal>element</literal>é¨åï¼è¿æ¬¡å¹¶æ²¡æå
å«å¯¹å
¶å®å®ä½å¼ç¨çéåï¼èæ¯å
ç´ ç±»å为<literal>String</literal>çéåï¼å¨æ å°ä¸ä½¿ç¨å°åçååâstringâæ¯åä½ è¡¨æå®æ¯ä¸ä¸ªHibernateçæ å°ç±»åæè
ç±»å转æ¢å¨ï¼ãåä¹åä¸æ ·ï¼<literal>set</literal>å
ç´ ç<literal>table</literal>å±æ§å³å®äºç¨äºéåç表åã<literal>key</literal>å
ç´ å®ä¹äºå¨éå表ä¸å¤é®çå段åã<literal>element</literal>å
ç´ ç<literal>column</literal>å±æ§å®ä¹ç¨äºå®é
ä¿å<literal>String</literal>å¼çå段åã
+ </para>
+
+ <para>
+ çä¸ä¸ä¿®æ¹åçæ°æ®åºschemaã
+ </para>
+
+ <programlisting><![CDATA[
+ _____________ __________________
+ | | | | _____________
+ | EVENTS | | PERSON_EVENT | | | ___________________
+ |_____________| |__________________| | PERSON | | |
+ | | | | |_____________| | PERSON_EMAIL_ADDR |
+ | *EVENT_ID | <--> | *EVENT_ID | | | |___________________|
+ | EVENT_DATE | | *PERSON_ID | <--> | *PERSON_ID | <--> | *PERSON_ID |
+ | TITLE | |__________________| | AGE | | *EMAIL_ADDR |
+ |_____________| | FIRSTNAME | |___________________|
+ | LASTNAME |
+ |_____________|
+ ]]></programlisting>
+
+ <para>
+ ä½ å¯ä»¥çå°éå表ç主é®å®é
ä¸æ¯ä¸ªå¤å主é®ï¼åæ¶ä½¿ç¨äº2个å段ãè¿ä¹æ示äºå¯¹äºåä¸ä¸ªpersonä¸è½æéå¤çemailå°åï¼è¿æ£æ¯Javaéé¢ä½¿ç¨Setæ¶åæéè¦çè¯ä¹ï¼Setéå
ç´ ä¸è½éå¤ï¼ã
+ </para>
+
+ <para>
+ ä½ ç°å¨å¯ä»¥è¯çæå
ç´ å å
¥å°è¿ä¸ªéåï¼å°±åæ们å¨ä¹åå
³èpersonåeventçé£æ ·ãå
¶å®ç°çJava代ç æ¯ç¸åçï¼
+ </para>
+ <programlisting><![CDATA[private void addEmailToPerson(Long personId, String emailAddress) {
+
+ Session session = HibernateUtil.getSessionFactory().getCurrentSession();
+ session.beginTransaction();
+
+ Person aPerson = (Person) session.load(Person.class, personId);
+
+ // The getEmailAddresses() might trigger a lazy load of the collection
+ aPerson.getEmailAddresses().add(emailAddress);
+
+ session.getTransaction().commit();
+}]]></programlisting>
+
+ <para>
+ è¿æ¬¡æ们没æ使ç¨<emphasis>fetch</emphasis>æ¥è¯¢æ¥åå§åéåãå æ¤ï¼è°ç¨å
¶getteræ¹æ³ä¼è§¦åå¦ä¸éå çselectæ¥åå§åéåï¼è¿æ ·æ们æè½æå
ç´ æ·»å è¿å»ãæ£æ¥SQL logï¼è¯çéè¿é¢å
æåæ¥ä¼åå®ã
+ </para>
+
+
+ </sect2>
+
+ <sect2 id="tutorial-associations-bidirectional" revision="1">
+ <title>
+ ååå
³è
+ </title>
+
+ <para>
+ æ¥ä¸æ¥æ们å°æ å°ååå
³èï¼bi-directional associationï¼ï¼ å¨Javaé让personåeventå¯ä»¥ä»å
³èçä»»ä½ä¸ç«¯è®¿é®å¦ä¸ç«¯ãå½ç¶ï¼æ°æ®åºschema没ææ¹åï¼æ们ä»ç¶éè¦å¤å¯¹å¤çé¶æ°ãä¸ä¸ªå
³ç³»åæ°æ®åºè¦æ¯ç½ç»ç¼ç¨è¯è¨ æ´å çµæ´»ï¼æ以å®å¹¶ä¸éè¦ä»»ä½å导èªæ¹åï¼navigation directionï¼çä¸è¥¿ ï¼ æ°æ®å¯ä»¥ç¨ä»»ä½å¯è½çæ¹å¼è¿è¡æ¥çåè·åã
+ </para>
+
+ <para>
+ é¦å
ï¼æä¸ä¸ªåä¸è
ï¼personï¼çéåå å
¥<literal>Event</literal>ç±»ä¸ï¼
+ </para>
+
+ <programlisting><![CDATA[private Set participants = new HashSet();
+
+public Set getParticipants() {
+ return participants;
+}
+
+public void setParticipants(Set participants) {
+ this.participants = participants;
+}]]></programlisting>
+
+ <para>
+ å¨<literal>Event.hbm.xml</literal>éé¢ä¹æ å°è¿ä¸ªå
³èã
+ </para>
+
+ <programlisting><![CDATA[<set name="participants" table="PERSON_EVENT" inverse="true">
+ <key column="EVENT_ID"/>
+ <many-to-many column="PERSON_ID" class="events.Person"/>
+</set>]]></programlisting>
+ <para>
+ å¦ä½ æè§ï¼ä¸¤ä¸ªæ å°æ件éé½ææ®éç<literal>set</literal>æ å°ã注æå¨ä¸¤ä¸ªæ å°æ件ä¸ï¼äºæ¢äº<literal>key</literal>å<literal>many-to-many</literal>çå段åãè¿éæéè¦çæ¯<literal>Event</literal>æ å°æ件éå¢å äº<literal>set</literal>å
ç´ ç<literal>inverse="true"</literal>å±æ§ã
+ </para>
+
+ <para>
+ è¿æå³çå¨éè¦çæ¶åï¼Hibernateè½å¨å
³èçå¦ä¸ç«¯ ï¼ <literal>Person</literal>ç±»å¾å°ä¸¤ä¸ªå®ä½é´å
³èçä¿¡æ¯ãè¿å°ä¼æ大å°å¸®å©ä½ ç解ååå
³èæ¯å¦ä½å¨ä¸¤ä¸ªå®ä½é´è¢«å建çã
+ </para>
+
+ </sect2>
+
+ <sect2 id="tutorial-associations-usingbidir">
+ <title>
+ 使ååè¿èµ·æ¥
+ </title>
+
+ <para>
+ é¦å
请记ä½ï¼Hibernate并ä¸å½±åé常çJavaè¯ä¹ã å¨ååå
³èçä¾åä¸ï¼æ们æ¯ææ ·å¨<literal>Person</literal>å<literal>Event</literal>ä¹é´å建èç³»çï¼æ们æ<literal>Event</literal>å®ä¾æ·»å å°<literal>Person</literal>å®ä¾å
çeventå¼ç¨éåéãå æ¤å¾æ¾ç¶ï¼å¦ææ们è¦è®©è¿ä¸ªå
³èå¯ä»¥ååå°å·¥ä½ï¼æ们éè¦å¨å¦å¤ä¸ç«¯ååæ ·çäºæ
ï¼ æ<literal>Person</literal>å®ä¾å å
¥<literal>Event</literal>ç±»å
çPersonå¼ç¨éåãè¿âå¨å
³èç两端设置èç³»âæ¯å®å
¨å¿
è¦çèä¸ä½ é½å¾è¿ä¹åã
+ </para>
+
+ <para>
+ 许å¤å¼å人åé²å¾¡å¼å°ç¼ç¨ï¼å建管çå
³èçæ¹æ³æ¥ä¿è¯æ£ç¡®ç设置äºå
³èç两端ï¼æ¯å¦å¨<literal>Person</literal>éï¼
+ </para>
+
+ <programlisting><![CDATA[protected Set getEvents() {
+ return events;
+}
+
+protected void setEvents(Set events) {
+ this.events = events;
+}
+
+public void addToEvent(Event event) {
+ this.getEvents().add(event);
+ event.getParticipants().add(this);
+}
+
+public void removeFromEvent(Event event) {
+ this.getEvents().remove(event);
+ event.getParticipants().remove(this);
+}]]></programlisting>
+
+ <para>
+ 注æç°å¨å¯¹äºéåçgetåsetæ¹æ³ç访é®çº§å«æ¯protected - è¿å
许å¨ä½äºåä¸ä¸ªå
ï¼packageï¼ä¸ç类以å继æ¿èªè¿ä¸ªç±»çåç±»å¯ä»¥è®¿é®è¿äºæ¹æ³ï¼ä½ç¦æ¢å
¶ä»ä»»ä½äººçç´æ¥è®¿é®ï¼é¿å
äºéåå
容çæ··ä¹±ãä½ åºå°½å¯è½å°å¨å¦ä¸ç«¯ä¹æéåç访é®çº§å«è®¾æprotectedã
+ </para>
+
+ <para>
+ <literal>inverse</literal>æ å°å±æ§ç©¶ç«è¡¨ç¤ºä»ä¹å¢ï¼å¯¹äºä½ åJavaæ¥è¯´ï¼ä¸ä¸ªååå
³èä»
ä»
æ¯å¨ä¸¤ç«¯ç®åå°æ£ç¡®è®¾ç½®å¼ç¨ãç¶èï¼Hibernate并没æ足å¤çä¿¡æ¯å»æ£ç¡®å°æ§è¡<literal>INSERT</literal>å<literal>UPDATE</literal>è¯å¥ï¼ä»¥é¿å
è¿åæ°æ®åºçº¦æï¼ï¼æ以å®éè¦ä¸äºå¸®å©æ¥æ£ç¡®çå¤çååå
³èãæå
³èçä¸ç«¯è®¾ç½®ä¸º<literal>inverse</literal>å°åè¯Hibernate忽ç¥å
³èçè¿ä¸ç«¯ï¼æè¿ç«¯çææ¯å¦å¤ä¸ç«¯çä¸ä¸ª<emphasis>é象ï¼mirrorï¼</emphasis>ãè¿å°±æ¯æéçå
¨é¨ä¿¡æ¯ï¼Hibernateå©ç¨è¿äºä¿¡æ¯æ¥å¤çæä¸ä¸ªæå导èªæ¨¡å转移å°æ°æ®åºschemaæ¶çææé®é¢ãä½ åªéè¦è®°ä½è¿ä¸ªç´è§çè§åï¼ææçååå
³èéè¦æä¸ç«¯è¢«è®¾ç½®ä¸º<literal>inverse</literal>ãå¨ä¸å¯¹å¤å
³èä¸å®å¿
é¡»æ¯ä»£è¡¨å¤ï¼manyï¼çé£ç«¯ãèå¨å¤å¯¹å¤ï¼many-to-manyï¼å
³èä¸ï¼ä½ å¯ä»¥ä»»æéåä¸ç«¯ï¼å 为两端ä¹é´å¹¶æ²¡æå·®å«ã
+ </para>
+ </sect2>
+ <para>
+ 让æ们æè¿å
¥ä¸ä¸ªå°åçwebåºç¨ç¨åºã
+ </para>
+
+ </sect1>
+
+ <sect1 id="tutorial-webapp">
+ <title>第ä¸é¨å - EventManager webåºç¨ç¨åº</title>
+
+ <para>
+ Hibernate webåºç¨ç¨åºä½¿ç¨<literal>Session</literal> å<literal>Transaction</literal>çæ¹å¼å ä¹åç¬ç«åºç¨ç¨åºæ¯ä¸æ ·çãä½æ¯ï¼æä¸äºå¸¸è§ç模å¼ï¼patternï¼é常æç¨ãç°å¨æ们ç¼åä¸ä¸ª<literal>EventManagerServlet</literal>ãè¿ä¸ªservletå¯ä»¥ååºæ°æ®åºä¸ä¿åçææçeventsï¼è¿æä¾ä¸ä¸ªHTML表åæ¥å¢å æ°çeventsã
+ </para>
+
+ <sect2 id="tutorial-webapp-servlet" revision="2">
+ <title>ç¼ååºæ¬çservlet</title>
+
+ <para>
+ å¨ä½ çæºä»£ç ç®å½ç<literal>events</literal>å
ä¸å建ä¸ä¸ªæ°çç±»ï¼
+ </para>
+
+ <programlisting><![CDATA[package events;
+
+// Imports
+
+public class EventManagerServlet extends HttpServlet {
+
+ // Servlet code
+}]]></programlisting>
+
+ <para>
+ æ们åé¢ä¼ç¨å°<literal>dateFormatter</literal> çå·¥å
·ï¼ å®æ<literal>Date</literal>对象转æ¢ä¸ºå符串ãåªè¦ä¸ä¸ªformatterä½ä¸ºservletçæåå°±å¯ä»¥äºã
+ </para>
+
+ <para>
+ è¿ä¸ªservletåªå¤ç HTTP <literal>GET</literal> 请æ±ï¼å æ¤ï¼æ们è¦å®ç°çæ¯<literal>doGet()</literal>æ¹æ³ï¼
+ </para>
+
+ <programlisting><![CDATA[protected void doGet(HttpServletRequest request,
+ HttpServletResponse response)
+ throws ServletException, IOException {
+
+ SimpleDateFormat dateFormatter = new SimpleDateFormat("dd.MM.yyyy");
+
+ try {
+ // Begin unit of work
+ HibernateUtil.getSessionFactory()
+ .getCurrentSession().beginTransaction();
+
+ // Process request and render page...
+
+ // End unit of work
+ HibernateUtil.getSessionFactory()
+ .getCurrentSession().getTransaction().commit();
+
+ } catch (Exception ex) {
+ HibernateUtil.getSessionFactory()
+ .getCurrentSession().getTransaction().rollback();
+ throw new ServletException(ex);
+ }
+
+}]]></programlisting>
+ <para>
+æ们称è¿éåºç¨ç模å¼ä¸ºæ¯æ¬¡è¯·æ±ä¸ä¸ªsession<emphasis>(session-per-request)</emphasis>ãå½æ请æ±å°è¾¾è¿ä¸ªservletçæ¶åï¼éè¿å¯¹<literal>SessionFactory</literal>ç第ä¸æ¬¡è°ç¨ï¼æå¼ä¸ä¸ªæ°çHibernate <literal>Session</literal>ãç¶åå¯å¨ä¸ä¸ªæ°æ®åºäºå¡—ææçæ°æ®è®¿é®é½æ¯å¨äºå¡ä¸è¿è¡ï¼ä¸ç®¡æ¯è¯»è¿æ¯åï¼æ们å¨åºç¨ç¨åºä¸ä¸ä½¿ç¨auto-commit模å¼ï¼ã
+ </para>
+
+ <para>
+
+ <emphasis>ä¸è¦</emphasis>为æ¯æ¬¡æ°æ®åºæä½é½ä½¿ç¨ä¸ä¸ªæ°çHibernate <literal>Session</literal>ãå°Hibernate <literal>Session</literal>çèå´è®¾ç½®ä¸ºæ´ä¸ªè¯·æ±ãè¦ç¨<literal>getCurrentSession()</literal>ï¼è¿æ ·å®èªå¨ä¼ç»å®å°å½åJava线ç¨ã
+ </para>
+
+ <para>
+ ä¸ä¸æ¥ï¼å¯¹è¯·æ±çå¯è½å¨ä½è¿è¡å¤çï¼æ¸²æåºåé¦çHTMLãæ们å¾å¿«å°±ä¼æ¶åå°é£é¨åã
+ </para>
+
+ <para>
+ æåï¼å½å¤çä¸æ¸²æé½ç»æçæ¶åï¼è¿ä¸ªå·¥ä½åå
å°±ç»æäºãåè¥å¨å¤çæ渲æçæ¶åæä»»ä½é误åçï¼ä¼æåºä¸ä¸ªå¼å¸¸ï¼åæ»æ°æ®åºäºå¡ãè¿æ ·ï¼<literal>session-per-request</literal>模å¼å°±å®æäºã为äºé¿å
å¨æ¯ä¸ªservletä¸é½ç¼åäºå¡è¾¹ççå®ç代ç ï¼å¯ä»¥èèåä¸ä¸ªservlet è¿æ»¤å¨ï¼filterï¼æ¥æ´å¥½å°è§£å³ãå
³äºè¿ä¸æ¨¡å¼çæ´å¤ä¿¡æ¯ï¼è¯·åé
Hibernateç½ç«åWikiï¼è¿ä¸æ¨¡å¼å«å<emphasis>Open Session in View</emphasis>—åªè¦ä½ èèç¨JSPæ¥æ¸²æä½ çè§å¾ï¼viewï¼ï¼èä¸æ¯å¨servletä¸ï¼ä½ å°±ä¼å¾å¿«ç¨å°å®ã
+ </para>
+
+ </sect2>
+
+ <sect2 id="tutorial-webapp-processing" revision="1">
+ <title>å¤çä¸æ¸²æ</title>
+
+ <para>
+ æ们æ¥å®ç°å¤ç请æ±ä»¥å渲æ页é¢çå·¥ä½ã
+ </para>
+
+<programlisting><![CDATA[// Write HTML header
+PrintWriter out = response.getWriter();
+out.println("<html><head><title>Event Manager</title></head><body>");
+
+// Handle actions
+if ( "store".equals(request.getParameter("action")) ) {
+
+ String eventTitle = request.getParameter("eventTitle");
+ String eventDate = request.getParameter("eventDate");
+
+ if ( "".equals(eventTitle) || "".equals(eventDate) ) {
+ out.println("<b><i>Please enter event title and date.</i></b>");
+ } else {
+ createAndStoreEvent(eventTitle, dateFormatter.parse(eventDate));
+ out.println("<b><i>Added event.</i></b>");
+ }
+}
+
+// Print page
+printEventForm(out);
+listEvents(out, dateFormatter);
+
+// Write HTML footer
+out.println("</body></html>");
+out.flush();
+out.close();]]></programlisting>
+ <para>
+ <literal>listEvents()</literal>æ¹æ³ä½¿ç¨ç»å®å°å½å线ç¨çHibernate <literal>Session</literal>æ¥æ§è¡æ¥è¯¢ï¼
+ </para>
+
+ <programlisting><![CDATA[private void listEvents(PrintWriter out, SimpleDateFormat dateFormatter) {
+
+ List result = HibernateUtil.getSessionFactory()
+ .getCurrentSession().createCriteria(Event.class).list();
+ if (result.size() > 0) {
+ out.println("<h2>Events in database:</h2>");
+ out.println("<table border='1'>");
+ out.println("<tr>");
+ out.println("<th>Event title</th>");
+ out.println("<th>Event date</th>");
+ out.println("</tr>");
+ for (Iterator it = result.iterator(); it.hasNext();) {
+ Event event = (Event) it.next();
+ out.println("<tr>");
+ out.println("<td>" + event.getTitle() + "</td>");
+ out.println("<td>" + dateFormatter.format(event.getDate()) + "</td>");
+ out.println("</tr>");
+ }
+ out.println("</table>");
+ }
+}]]></programlisting>
+
+ <para>
+ æåï¼<literal>store</literal>å¨ä½ä¼è¢«å¯¼åå°<literal>createAndStoreEvent()</literal>æ¹æ³ï¼å®ä¹ä½¿ç¨å½å线ç¨ç<literal>Session</literal>:
+ </para>
+
+ <programlisting><![CDATA[protected void createAndStoreEvent(String title, Date theDate) {
+ Event theEvent = new Event();
+ theEvent.setTitle(title);
+ theEvent.setDate(theDate);
+
+ HibernateUtil.getSessionFactory()
+ .getCurrentSession().save(theEvent);
+}]]></programlisting>
+
+ <para>
+ 大ååæï¼è¿ä¸ªservletåå®äºãHibernateä¼å¨åä¸ç<literal>Session</literal> å<literal>Transaction</literal>ä¸å¤çå°è¾¾çservlet请æ±ãå¦åå¨åé¢çç¬ç«åºç¨ç¨åºä¸é£æ ·ï¼Hibernateå¯ä»¥èªå¨çæè¿äºå¯¹è±¡ç»å®å°å½åè¿è¡ç线ç¨ä¸ãè¿ç»äºä½ ç¨ä»»ä½ä½ å欢çæ¹å¼æ¥å¯¹ä»£ç åå±å访é®<literal>SessionFactory</literal>çèªç±ãé常ï¼ä½ ä¼ç¨æ´å å®å¤ç设计ï¼ææ°æ®è®¿é®ä»£ç 转移å°æ°æ®è®¿é®å¯¹è±¡ä¸(DAO模å¼ï¼ã请åè§Hibernate Wikiï¼é£éææ´å¤çä¾åã
+ </para>
+
+ </sect2>
+
+ <sect2 id="tutorial-webapp-deploy">
+ <title>é¨ç½²ä¸æµè¯</title>
+
+ <para>
+ è¦åå¸è¿ä¸ªç¨åºï¼ä½ å¾æå®ææwebåå¸å
ï¼WARæ件ãæä¸é¢çèæ¬å å
¥å°ä½ ç<literal>build.xml</literal>ä¸ï¼
+ </para>
+
+<programlisting><![CDATA[<target name="war" depends="compile">
+ <war destfile="hibernate-tutorial.war" webxml="web.xml">
+ <lib dir="${librarydir}">
+ <exclude name="jsdk*.jar"/>
+ </lib>
+
+ <classes dir="${targetdir}"/>
+ </war>
+</target>]]></programlisting>
+
+ <para>
+ è¿æ®µä»£ç å¨ä½ çå¼åç®å½ä¸å建ä¸ä¸ª<literal>hibernate-tutorial.war</literal>çæ件ãå®æææçç±»åºå<literal>web.xml</literal>æè¿°æ件é½æå
è¿å»ï¼web.xml æ件åºè¯¥ä½äºä½ çå¼åæ ¹ç®å½ä¸ï¼
+ </para>
+
+<programlisting><![CDATA[<?xml version="1.0" encoding="UTF-8"?>
+<web-app version="2.4"
+ xmlns="http://java.sun.com/xml/ns/j2ee"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
+
+ <servlet>
+ <servlet-name>Event Manager</servlet-name>
+ <servlet-class>events.EventManagerServlet</servlet-class>
+ </servlet>
+
+ <servlet-mapping>
+ <servlet-name>Event Manager</servlet-name>
+ <url-pattern>/eventmanager</url-pattern>
+ </servlet-mapping>
+</web-app>]]></programlisting>
+
+ <para>
+ 请注æå¨ä½ ç¼è¯åé¨ç½²webåºç¨ç¨ä¹åï¼éè¦ä¸ä¸ªéå çç±»åºï¼<literal>jsdk.jar</literal>ãè¿æ¯Java Servletå¼åå
ï¼åè¥ä½ è¿æ²¡æï¼å¯ä»¥ä»Sunç½ç«ä¸ä¸è½½ï¼æå®copyå°ä½ çlibç®å½ãä½æ¯ï¼å®ä»
ä»
æ¯å¨ç¼è¯æ¶éè¦ï¼ä¸ä¼è¢«æå
¥WARå
ã
+ </para>
+
+ <para>
+ å¨ä½ çå¼åç®å½ä¸ï¼è°ç¨<literal>ant war</literal>æ¥æ建ãæå
ï¼ç¶åæ<literal>hibernate-tutorial.war</literal>æ件æ·è´å°ä½ çtomcatç<literal>webapps</literal>ç®å½ä¸ãåè¥ä½ è¿æ²¡å®è£
Tomcatï¼å°±å»ä¸è½½ä¸ä¸ªï¼æç
§æåæ¥å®è£
ã对æ¤åºç¨çåå¸ï¼ä½ ä¸éè¦ä¿®æ¹ä»»ä½Tomcatçé
ç½®ã
+ </para>
+
+ <para>
+ å¨é¨ç½²å®ï¼å¯å¨Tomcatä¹åï¼éè¿<literal>http://localhost:8080/hibernate-tutorial/eventmanager</literal>è¿è¡è®¿é®ä½ çåºç¨ï¼å¨ç¬¬ä¸æ¬¡servlet 请æ±åçæ¶ï¼è¯·å¨Tomcat logä¸ç¡®è®¤ä½ çå°Hibernate被åå§åäºï¼<literal>HibernateUtil</literal>çéæåå§åå¨è¢«è°ç¨ï¼ï¼åè¥æä»»ä½å¼å¸¸æåºï¼ä¹å¯ä»¥çå°è¯¦ç»çè¾åºã
+ </para>
+
+ </sect2>
+
+ </sect1>
+ <sect1 id="tutorial-summary">
+ <title>
+ æ»ç»
+ </title>
+
+ <para>
+ æ¬ç« è¦çäºå¦ä½ç¼åä¸ä¸ªç®åç¬ç«çHibernateå½ä»¤è¡åºç¨ç¨åºåå°åçHibernate webåºç¨ç¨åºçåºæ¬è¦ç´ ã
+ </para>
+
+ <para>
+ å¦æä½ å·²ç»å¯¹Hibernateæå°èªä¿¡ï¼éè¿å¼åæåç®å½ï¼ç»§ç»æµè§ä½ æå
´è¶£çå
容ï¼é£äºä¼è¢«é®å°çé®é¢å¤§å¤æ¯äºå¡å¤ç (<xref linkend="transactions"/>)ï¼æåï¼fetchï¼çæç (<xref linkend="performance"/>)ï¼æè
APIçä½¿ç¨ (<xref linkend="objectstate"/>)åæ¥è¯¢çç¹æ§(<xref linkend="objectstate-querying"/>)ã
+ </para>
+
+ <para>
+ å«å¿äºå»Hibernateçç½ç«æ¥çæ´å¤ï¼æé对æ§çï¼ç¤ºä¾ã
+ </para>
+
+ </sect1>
+</chapter>
Copied: core/trunk/documentation/manual/zh-CN/src/main/docbook/content/xml.xml (from rev 14080, core/trunk/documentation/manual/zh-CN/src/main/docbook/modules/xml.xml)
===================================================================
--- core/trunk/documentation/manual/zh-CN/src/main/docbook/content/xml.xml (rev 0)
+++ core/trunk/documentation/manual/zh-CN/src/main/docbook/content/xml.xml 2007-10-09 20:10:34 UTC (rev 14081)
@@ -0,0 +1,285 @@
+<!--
+ ~ Copyright (c) 2007, Red Hat Middleware, LLC. All rights reserved.
+ ~
+ ~ This copyrighted material is made available to anyone wishing to use, modify,
+ ~ copy, or redistribute it subject to the terms and conditions of the GNU
+ ~ Lesser General Public License, v. 2.1. This program is distributed in the
+ ~ hope that it will be useful, but WITHOUT A WARRANTY; without even the implied
+ ~ warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ ~ Lesser General Public License for more details. You should have received a
+ ~ copy of the GNU Lesser General Public License, v.2.1 along with this
+ ~ distribution; if not, write to the Free Software Foundation, Inc.,
+ ~ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ ~
+ ~ Red Hat Author(s): Steve Ebersole
+ -->
+<chapter id="xml">
+ <title>XMLæ å°</title>
+ <para><emphasis>
+ 注æè¿æ¯Hibernate 3.0çä¸ä¸ªå®éªæ§çç¹æ§ãè¿ä¸ç¹æ§ä»å¨ç§¯æå¼åä¸ã
+ </emphasis></para>
+
+ <sect1 id="xml-intro" revision="1">
+ <title>ç¨XMLæ°æ®è¿è¡å·¥ä½</title>
+
+ <para>
+ Hibernate使å¾ä½ å¯ä»¥ç¨XMLæ°æ®æ¥è¿è¡å·¥ä½ï¼æ°å¦ä½ ç¨æä¹
åçPOJOè¿è¡å·¥ä½é£æ ·ã解æè¿çXMLæ
+ å¯ä»¥è¢«è®¤ä¸ºæ¯ä»£æ¿POJOçå¦å¤ä¸ç§å¨å¯¹è±¡å±é¢ä¸è¡¨ç¤ºå
³ç³»åæ°æ®çéå¾.
+ </para>
+
+ <para>
+ Hibernateæ¯æéç¨dom4jä½ä¸ºæä½XMLæ çAPIãä½ å¯ä»¥åä¸äºæ¥è¯¢ä»æ°æ®åºä¸æ£ç´¢åº
+ dom4jæ ï¼éåä½ å¯¹è¿é¢æ åçä»»ä½ä¿®æ¹é½å°èªå¨åæ¥åæ°æ®åºãä½ çè³å¯ä»¥ç¨dom4j解æ
+ ä¸ç¯XMLææ¡£ï¼ç¶å使ç¨Hibernateçä»»ä¸åºæ¬æä½å°å®åå
¥æ°æ®åºï¼
+ <literal>persist(), saveOrUpdate(), merge(), delete(), replicate()</literal>
+ (å并æä½merge()ç®åè¿ä¸æ¯æ)ã
+ </para>
+
+ <para>
+ è¿ä¸ç¹æ§å¯ä»¥åºç¨å¨å¾å¤åºåï¼å
æ¬æ°æ®å¯¼å
¥å¯¼åºï¼éè¿JMSæSOAPå
·ä½åå®ä½æ°æ®ä»¥å
+ åºäºXSLTçæ¥è¡¨ã
+ </para>
+
+ <para>
+ ä¸ä¸ªåä¸çæ å°å°±å¯ä»¥å°ç±»çå±æ§åXMLææ¡£çèç¹åæ¶æ å°å°æ°æ®åºãå¦æä¸éè¦æ å°ç±»ï¼
+ å®ä¹å¯ä»¥ç¨æ¥åªæ å°XMLææ¡£ã
+ </para>
+
+ <sect2 id="xml-intro-mapping">
+ <title>æå®åæ¶æ å°XMLåç±»</title>
+
+ <para>
+ è¿æ¯ä¸ä¸ªåæ¶æ å°POJOåXMLçä¾åï¼
+ </para>
+
+ <programlisting><![CDATA[<class name="Account"
+ table="ACCOUNTS"
+ node="account">
+
+ <id name="accountId"
+ column="ACCOUNT_ID"
+ node="@id"/>
+
+ <many-to-one name="customer"
+ column="CUSTOMER_ID"
+ node="customer/@id"
+ embed-xml="false"/>
+
+ <property name="balance"
+ column="BALANCE"
+ node="balance"/>
+
+ ...
+
+</class>]]></programlisting>
+ </sect2>
+
+ <sect2 id="xml-onlyxml">
+ <title>åªå®ä¹XMLæ å°</title>
+
+ <para>
+ è¿æ¯ä¸ä¸ªä¸æ å°POJOçä¾åï¼
+ </para>
+
+ <programlisting><![CDATA[<class entity-name="Account"
+ table="ACCOUNTS"
+ node="account">
+
+ <id name="id"
+ column="ACCOUNT_ID"
+ node="@id"
+ type="string"/>
+
+ <many-to-one name="customerId"
+ column="CUSTOMER_ID"
+ node="customer/@id"
+ embed-xml="false"
+ entity-name="Customer"/>
+
+ <property name="balance"
+ column="BALANCE"
+ node="balance"
+ type="big_decimal"/>
+
+ ...
+
+</class>]]></programlisting>
+
+ <para>
+ è¿ä¸ªæ å°ä½¿å¾ä½ æ¢å¯ä»¥ææ°æ®ä½ä¸ºä¸æ£µdom4jæ é£æ ·è®¿é®ï¼åå¯ä»¥ä½ä¸ºç±å±æ§é®å¼å¯¹(java <literal>Map</literal>s)
+ ç»æçå¾é£æ ·è®¿é®ãå±æ§åå纯粹æ¯é»è¾ä¸çç»æï¼ä½ å¯ä»¥å¨HQLæ¥è¯¢ä¸å¼ç¨å®ã
+ </para>
+
+ </sect2>
+
+ </sect1>
+
+ <sect1 id="xml-mapping" revision="1">
+ <title>XMLæ å°å
æ°æ®</title>
+
+ <para>
+ 许å¤Hibernateæ å°å
ç´ å
·æ<literal>node</literal>å±æ§ãè¿ä½¿ä½ å¯ä»¥æå®ç¨æ¥ä¿å
+ å±æ§æå®ä½æ°æ®çXMLå±æ§æå
ç´ ã<literal>node</literal>å±æ§å¿
é¡»æ¯ä¸åæ ¼å¼ä¹ä¸ï¼
+ </para>
+
+ <itemizedlist spacing="compact">
+ <listitem>
+ <para><literal>"element-name"</literal> - æ å°ä¸ºæå®çXMLå
ç´ </para>
+ </listitem>
+ <listitem>
+ <para><literal>"@attribute-name"</literal> - æ å°ä¸ºæå®çXMLå±æ§</para>
+ </listitem>
+ <listitem>
+ <para><literal>"."</literal> - æ å°ä¸ºç¶å
ç´ </para>
+ </listitem>
+ <listitem>
+ <para>
+ <literal>"element-name/@attribute-name"</literal> -
+ æ å°ä¸ºæå®å
ç´ çæå®å±æ§
+ </para>
+ </listitem>
+ </itemizedlist>
+
+ <para>
+ 对äºéåååå¼çå
³èï¼æä¸ä¸ªé¢å¤ç<literal>embed-xml</literal>å±æ§å¯ç¨ã
+ è¿ä¸ªå±æ§ç缺çå¼æ¯ç(<literal>embed-xml="true"</literal>)ãå¦æ<literal>embed-xml="true"</literal>ï¼
+ å对åºäºè¢«å
³èå®ä½æå¼ç±»åçéåçXMLæ å°ç´æ¥åµå
¥æ¥æè¿äºå
³èçå®ä½çXMLæ ä¸ã
+ å¦åï¼å¦æ<literal>embed-xml="false"</literal>ï¼é£ä¹å¯¹äºåå¼çå
³èï¼ä»
被å¼ç¨çå®ä½çæ è¯ç¬¦åºç°å¨
+ XMLæ ä¸(被å¼ç¨å®ä½æ¬èº«ä¸åºç°)ï¼èéååæ ¹æ¬ä¸åºç°ã
+ </para>
+
+ <para>
+ ä½ åºè¯¥å°å¿ï¼ä¸è¦è®©å¤ªå¤å
³èçembed-xmlå±æ§ä¸ºç(<literal>embed-xml="true"</literal>)ï¼å 为XMLä¸è½å¾å¥½å°å¤ç
+ 循ç¯å¼ç¨!
+ </para>
+
+ <programlisting><![CDATA[<class name="Customer"
+ table="CUSTOMER"
+ node="customer">
+
+ <id name="id"
+ column="CUST_ID"
+ node="@id"/>
+
+ <map name="accounts"
+ node="."
+ embed-xml="true">
+ <key column="CUSTOMER_ID"
+ not-null="true"/>
+ <map-key column="SHORT_DESC"
+ node="@short-desc"
+ type="string"/>
+ <one-to-many entity-name="Account"
+ embed-xml="false"
+ node="account"/>
+ </map>
+
+ <component name="name"
+ node="name">
+ <property name="firstName"
+ node="first-name"/>
+ <property name="initial"
+ node="initial"/>
+ <property name="lastName"
+ node="last-name"/>
+ </component>
+
+ ...
+
+</class>]]></programlisting>
+
+ <para>
+ å¨è¿ä¸ªä¾åä¸ï¼æ们å³å®åµå
¥å¸ç®å·ç (account id)çéåï¼ä½ä¸åµå
¥å®é
çå¸ç®æ°æ®ãä¸é¢çHQLæ¥è¯¢ï¼
+ </para>
+
+ <programlisting><![CDATA[from Customer c left join fetch c.accounts where c.lastName like :lastName]]></programlisting>
+
+ <para>
+ è¿åçæ°æ®éå°æ¯è¿æ ·ï¼
+ </para>
+
+ <programlisting><![CDATA[<customer id="123456789">
+ <account id="987632567" short-desc="Savings"/>
+ <account id="985612323" short-desc="Credit Card"/>
+ <name>
+ <first-name>Gavin</first-name>
+ <initial>A</initial>
+ <last-name>King</last-name>
+ </name>
+ ...
+</customer>]]></programlisting>
+
+ <para>
+ å¦æä½ æä¸å¯¹å¤æ å°<literal><one-to-many></literal>çembed-xmlå±æ§ç½®ä¸ºç(<literal>embed-xml="true"</literal>)ï¼
+ åæ°æ®çä¸å»å°±åè¿æ ·ï¼
+ </para>
+
+ <programlisting><![CDATA[<customer id="123456789">
+ <account id="987632567" short-desc="Savings">
+ <customer id="123456789"/>
+ <balance>100.29</balance>
+ </account>
+ <account id="985612323" short-desc="Credit Card">
+ <customer id="123456789"/>
+ <balance>-2370.34</balance>
+ </account>
+ <name>
+ <first-name>Gavin</first-name>
+ <initial>A</initial>
+ <last-name>King</last-name>
+ </name>
+ ...
+</customer>]]></programlisting>
+
+ </sect1>
+
+
+ <sect1 id="xml-manipulation" revision="1">
+ <title>æä½XMLæ°æ®</title>
+
+ <para>
+ 让æ们æ¥è¯»å
¥åæ´æ°åºç¨ç¨åºä¸çXMLææ¡£ãéè¿è·åä¸ä¸ªdom4jä¼è¯å¯ä»¥åå°è¿ä¸ç¹ï¼
+ </para>
+
+ <programlisting><![CDATA[Document doc = ....;
+
+Session session = factory.openSession();
+Session dom4jSession = session.getSession(EntityMode.DOM4J);
+Transaction tx = session.beginTransaction();
+
+List results = dom4jSession
+ .createQuery("from Customer c left join fetch c.accounts where c.lastName like :lastName")
+ .list();
+for ( int i=0; i<results.size(); i++ ) {
+ //add the customer data to the XML document
+ Element customer = (Element) results.get(i);
+ doc.getRootElement().add(customer);
+}
+
+tx.commit();
+session.close();]]></programlisting>
+
+ <programlisting><![CDATA[Session session = factory.openSession();
+Session dom4jSession = session.getSession(EntityMode.DOM4J);
+Transaction tx = session.beginTransaction();
+
+Element cust = (Element) dom4jSession.get("Customer", customerId);
+for ( int i=0; i<results.size(); i++ ) {
+ Element customer = (Element) results.get(i);
+ //change the customer name in the XML and database
+ Element name = customer.element("name");
+ name.element("first-name").setText(firstName);
+ name.element("initial").setText(initial);
+ name.element("last-name").setText(lastName);
+}
+
+tx.commit();
+session.close();]]></programlisting>
+
+ <para>
+ å°è¿ä¸ç¹è²ä¸Hibernateç<literal>replicate()</literal>æä½ç»åèµ·æ¥å¯¹äºå®ç°çåºäºXMLçæ°æ®å¯¼å
¥/导åºå°é常æç¨.
+ </para>
+
+ </sect1>
+
+</chapter>
Deleted: core/trunk/documentation/manual/zh-CN/src/main/docbook/glossary.txt
===================================================================
--- core/trunk/documentation/manual/zh-CN/src/main/docbook/glossary.txt 2007-10-09 19:32:35 UTC (rev 14080)
+++ core/trunk/documentation/manual/zh-CN/src/main/docbook/glossary.txt 2007-10-09 20:10:34 UTC (rev 14081)
@@ -1,27 +0,0 @@
-O/R Mapping 对象/å
³ç³»æ°æ®åºæ å°
-identifier property: æ è¯å±æ§
-discriminator: 辨å«æ å¿(ä¸ä½¿ç¨"é´å«å¨")
-
-join-subclass,union-subclass,join: ä¸ç¿»è¯
-
-fine-grained ç»ç²åº¦
-domain model é¢å模å
-business object ä¸å¡å¯¹è±¡(v2çæ¶åç¿»è¯ä¸º"åä¸å¯¹è±¡",被æ æ°äººçéª....)
-annotations 注解(è¿ä¸ªè¯è¿æ¯è¾æ°,ä¹è§å°æç¿»è¯ä¸º"ç¹æ®æ³¨é"/"æ 注"ç)
-
-Aggregate functions ç»è®¡å½æ° (èéå½æ°?èåå½æ°? è¿æ¯ç¿»è¯ä¸ºç»è®¡å½æ°æè½è®©äººçæ)
-Criteria Queries æ¡ä»¶æ¥è¯¢(æ åæ¥è¯¢?è¿éCriteriaæ¯"å¤æ®"çå«ä¹,èé"æ å",æè¯ä¸ºæ¡ä»¶æ¥è¯¢æ´å æç½)
-
-session flush sessionæ¸
æ´
-lazy fetching 延è¿å è½½(æå è½½,ç¿»è¯å¾ç´ç½,ä½æ¯å´ä¸æç解)
-
-对象ç¶æï¼
- persistent class æä¹
åç±»
- persistent object æä¹
对象 (ä½ç°è¿æ¯ä¸æ个æä¹
å设å¤èç³»ç,æçµä¹åä¸æ¶å¤±)
- transient object ç¬æ¶å¯¹è±¡ (å
¶å«ä¹æ¯ä»
å¨å
åä¸åå¨ç,æçµä¹åæ¶å¤±,ç¿»è¯ä¸ºç¬æ¶å¯¹è±¡æ¯è¾å¥½)
- detached object è±ç®¡å¯¹è±¡(ä¸sessionè±ç¦»ç对象)
-
-outer-join fetching å¤è¿æ¥æå (fetchä¸è¬ç¿»è¯ä¸º"è·å",v2ç¿»è¯çæ¶å,为äºçªåºå
¶ä¸»å¨è·åçç¹ç¹,ç¿»è¯ä¸º"æå")
-
-class hierarchy ç±»åå±ç»æ http://www.umlchina.com/xprogrammer/glossary1.htm
-inheritance hierarchy 继æ¿å±æ¬¡ http://www-128.ibm.com/developerworks/cn/java/j-aopwork4/?ca=dwcn-newsletter-java
Copied: core/trunk/documentation/manual/zh-CN/src/main/docbook/images/AuthorWork.png (from rev 14073, core/trunk/documentation/manual/en-US/src/main/docbook/images/AuthorWork.png)
===================================================================
(Binary files differ)
Copied: core/trunk/documentation/manual/zh-CN/src/main/docbook/images/AuthorWork.zargo (from rev 14073, core/trunk/documentation/manual/en-US/src/main/docbook/images/AuthorWork.zargo)
===================================================================
(Binary files differ)
Copied: core/trunk/documentation/manual/zh-CN/src/main/docbook/images/CustomerOrderProduct.png (from rev 14073, core/trunk/documentation/manual/en-US/src/main/docbook/images/CustomerOrderProduct.png)
===================================================================
(Binary files differ)
Copied: core/trunk/documentation/manual/zh-CN/src/main/docbook/images/CustomerOrderProduct.zargo (from rev 14073, core/trunk/documentation/manual/en-US/src/main/docbook/images/CustomerOrderProduct.zargo)
===================================================================
(Binary files differ)
Copied: core/trunk/documentation/manual/zh-CN/src/main/docbook/images/EmployerEmployee.png (from rev 14073, core/trunk/documentation/manual/en-US/src/main/docbook/images/EmployerEmployee.png)
===================================================================
(Binary files differ)
Copied: core/trunk/documentation/manual/zh-CN/src/main/docbook/images/EmployerEmployee.zargo (from rev 14073, core/trunk/documentation/manual/en-US/src/main/docbook/images/EmployerEmployee.zargo)
===================================================================
(Binary files differ)
Copied: core/trunk/documentation/manual/zh-CN/src/main/docbook/images/full_cream.png (from rev 14073, core/trunk/documentation/manual/en-US/src/main/docbook/images/full_cream.png)
===================================================================
(Binary files differ)
Copied: core/trunk/documentation/manual/zh-CN/src/main/docbook/images/full_cream.svg (from rev 14073, core/trunk/documentation/manual/en-US/src/main/docbook/images/full_cream.svg)
===================================================================
--- core/trunk/documentation/manual/zh-CN/src/main/docbook/images/full_cream.svg (rev 0)
+++ core/trunk/documentation/manual/zh-CN/src/main/docbook/images/full_cream.svg 2007-10-09 20:10:34 UTC (rev 14081)
@@ -0,0 +1,429 @@
+<?xml version="1.0" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20010904//EN"
+"http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd"
+[
+ <!ATTLIST svg
+ xmlns:xlink CDATA #FIXED "http://www.w3.org/1999/xlink">
+]>
+<!-- Created with Sodipodi ("http://www.sodipodi.com/") -->
+<svg
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ width="354.331"
+ height="336.614"
+ id="svg1">
+ <defs
+ id="defs3">
+ <linearGradient
+ x1="0"
+ y1="0"
+ x2="1"
+ y2="0"
+ id="linearGradient127"
+ gradientUnits="objectBoundingBox"
+ spreadMethod="pad">
+ <stop
+ style="stop-color:#000000;stop-opacity:1;"
+ offset="0"
+ id="stop128" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="1"
+ id="stop129" />
+ </linearGradient>
+ <linearGradient
+ x1="0"
+ y1="0"
+ x2="1"
+ y2="0"
+ id="linearGradient130"
+ xlink:href="#linearGradient127"
+ gradientUnits="objectBoundingBox"
+ spreadMethod="pad" />
+ <radialGradient
+ cx="0.5"
+ cy="0.5"
+ fx="0.5"
+ fy="0.5"
+ r="0.5"
+ id="radialGradient131"
+ xlink:href="#linearGradient127"
+ gradientUnits="objectBoundingBox"
+ spreadMethod="pad" />
+ </defs>
+ <g
+ transform="matrix(0.823795,0,0,0.823795,0.120302,5.25349)"
+ style="font-size:12;"
+ id="g659">
+ <rect
+ width="212.257"
+ height="57.2441"
+ x="17.9576"
+ y="100.132"
+ style="fill:#757575;fill-rule:evenodd;stroke-width:1pt;"
+ id="rect137" />
+ <rect
+ width="285.502"
+ height="118.523"
+ x="13.4238"
+ y="95.9309"
+ transform="matrix(0.743454,0,0,0.482981,6.46949,52.2178)"
+ style="fill:#d2d2d2;fill-rule:evenodd;stroke-width:1pt;"
+ id="rect132" />
+ </g>
+ <rect
+ width="325.86"
+ height="63.6537"
+ x="17.4083"
+ y="15.194"
+ style="font-size:12;fill:#757575;fill-rule:evenodd;stroke-width:1pt;"
+ id="rect136" />
+ <rect
+ width="325.86"
+ height="63.6537"
+ x="13.6713"
+ y="12.4966"
+ style="font-size:12;fill:#d2d2d2;fill-rule:evenodd;stroke-width:1pt;"
+ id="rect126" />
+ <g
+ transform="matrix(1.14345,0,0,0.729078,-1.67818,105.325)"
+ style="font-size:12;"
+ id="g164">
+ <rect
+ width="285.502"
+ height="77.2688"
+ x="16.6979"
+ y="222.966"
+ style="fill:#757575;fill-rule:evenodd;stroke-width:1pt;"
+ id="rect138" />
+ <rect
+ width="285.502"
+ height="77.2688"
+ x="14.7335"
+ y="221.002"
+ transform="translate(-1.30962,-1.30992)"
+ style="fill:#d2d2d2;fill-rule:evenodd;stroke-width:1pt;"
+ id="rect133" />
+ </g>
+ <text
+ x="170.824753"
+ y="58.402939"
+ transform="scale(0.823795,0.823795)"
+ style="font-size:18;font-weight:normal;stroke-width:1pt;font-family:Helvetica;"
+ id="text183">
+ <tspan
+ x="170.824997"
+ y="58.402901"
+ id="tspan360">
+Application</tspan>
+ </text>
+ <text
+ x="178.076340"
+ y="364.281433"
+ transform="scale(0.823795,0.823795)"
+ style="font-size:18;font-weight:normal;stroke-width:1pt;font-family:Helvetica;"
+ id="text197">
+ <tspan
+ x="178.076004"
+ y="364.281006"
+ id="tspan421">
+Database</tspan>
+ </text>
+ <text
+ x="68.605331"
+ y="138.524582"
+ transform="scale(0.823795,0.823795)"
+ style="font-size:16;font-weight:normal;stroke-width:1pt;font-family:Helvetica;"
+ id="text216">
+ <tspan
+ x="68.605301"
+ y="138.524994"
+ id="tspan384">
+SessionFactory</tspan>
+ </text>
+ <rect
+ width="67.0014"
+ height="101.35"
+ x="196.927"
+ y="89.2389"
+ style="font-size:12;fill:#757575;fill-rule:evenodd;stroke-width:1pt;"
+ id="rect387" />
+ <rect
+ width="67.0014"
+ height="101.35"
+ x="194.633"
+ y="86.4389"
+ style="font-size:12;fill:#d2d2d2;fill-rule:evenodd;stroke-width:1pt;"
+ id="rect388" />
+ <text
+ x="249.108841"
+ y="173.885559"
+ transform="scale(0.823795,0.823795)"
+ style="font-size:16;font-weight:normal;stroke-width:1pt;font-family:Helvetica;"
+ id="text389">
+ <tspan
+ x="249.108994"
+ y="173.886002"
+ id="tspan392">
+Session</tspan>
+ </text>
+ <rect
+ width="73.0355"
+ height="101.35"
+ x="270.995"
+ y="90.0018"
+ style="font-size:12;fill:#757575;fill-rule:evenodd;stroke-width:1pt;"
+ id="rect395" />
+ <rect
+ width="73.0355"
+ height="101.35"
+ x="267.869"
+ y="87.2018"
+ style="font-size:12;fill:#d2d2d2;fill-rule:evenodd;stroke-width:1pt;"
+ id="rect396" />
+ <text
+ x="328.593658"
+ y="174.715622"
+ transform="scale(0.823795,0.823795)"
+ style="font-size:16;font-weight:normal;stroke-width:1pt;font-family:Helvetica;"
+ id="text397">
+ <tspan
+ x="328.593994"
+ y="174.716003"
+ id="tspan563">
+Transaction</tspan>
+ </text>
+ <g
+ transform="matrix(0.29544,0,0,0.397877,9.70533,103.96)"
+ style="font-size:12;"
+ id="g565">
+ <rect
+ width="285.502"
+ height="118.523"
+ x="16.6979"
+ y="99.2053"
+ style="fill:#757575;fill-rule:evenodd;stroke-width:1pt;"
+ id="rect566" />
+ <rect
+ width="285.502"
+ height="118.523"
+ x="13.4238"
+ y="95.9309"
+ style="fill:#d2d2d2;fill-rule:evenodd;stroke-width:1pt;"
+ id="rect567" />
+ </g>
+ <text
+ x="25.592752"
+ y="204.497803"
+ transform="scale(0.823795,0.823795)"
+ style="font-size:10;font-weight:normal;stroke-width:1pt;font-family:Helvetica;"
+ id="text568">
+ <tspan
+ x="25.592800"
+ y="204.498001"
+ id="tspan662">
+TransactionFactory</tspan>
+ </text>
+ <g
+ transform="matrix(0.298082,0,0,0.397877,99.6898,103.96)"
+ style="font-size:12;"
+ id="g573">
+ <rect
+ width="285.502"
+ height="118.523"
+ x="16.6979"
+ y="99.2053"
+ style="fill:#757575;fill-rule:evenodd;stroke-width:1pt;"
+ id="rect574" />
+ <rect
+ width="285.502"
+ height="118.523"
+ x="13.4238"
+ y="95.9309"
+ style="fill:#d2d2d2;fill-rule:evenodd;stroke-width:1pt;"
+ id="rect575" />
+ </g>
+ <text
+ x="134.030670"
+ y="205.532791"
+ transform="scale(0.823795,0.823795)"
+ style="font-size:10;font-weight:normal;stroke-width:1pt;font-family:Helvetica;"
+ id="text576">
+ <tspan
+ x="134.031006"
+ y="205.533005"
+ id="tspan664">
+ConnectionProvider</tspan>
+ </text>
+ <g
+ transform="matrix(1.14345,0,0,0.729078,-1.67818,38.9539)"
+ style="font-size:12;"
+ id="g587">
+ <rect
+ width="285.502"
+ height="77.2688"
+ x="16.6979"
+ y="222.966"
+ style="fill:#757575;fill-rule:evenodd;stroke-width:1pt;"
+ id="rect588" />
+ <rect
+ width="285.502"
+ height="77.2688"
+ x="14.7335"
+ y="221.002"
+ transform="translate(-1.30962,-1.30992)"
+ style="fill:#d2d2d2;fill-rule:evenodd;stroke-width:1pt;"
+ id="rect589" />
+ </g>
+ <rect
+ width="90.951"
+ height="44.4829"
+ x="25.6196"
+ y="206.028"
+ style="font-size:12;fill:#757575;fill-rule:evenodd;stroke-width:1pt;"
+ id="rect594" />
+ <rect
+ width="90.951"
+ height="44.4829"
+ x="24.4229"
+ y="204.135"
+ style="font-size:12;fill:#b3b3b3;fill-rule:evenodd;stroke-width:1pt;"
+ id="rect595" />
+ <text
+ x="85.575645"
+ y="282.300354"
+ transform="scale(0.823795,0.823795)"
+ style="font-size:18;font-weight:normal;stroke-width:1pt;font-family:Helvetica;text-anchor:middle;"
+ id="text596">
+ <tspan
+ x="85.575600"
+ y="282.299988"
+ id="tspan607">
+JNDI</tspan>
+ </text>
+ <rect
+ width="90.951"
+ height="44.4829"
+ x="236.937"
+ y="206.791"
+ style="font-size:12;fill:#757575;fill-rule:evenodd;stroke-width:1pt;"
+ id="rect610" />
+ <rect
+ width="90.951"
+ height="44.4829"
+ x="235.741"
+ y="204.898"
+ style="font-size:12;fill:#b3b3b3;fill-rule:evenodd;stroke-width:1pt;"
+ id="rect611" />
+ <text
+ x="342.093201"
+ y="283.226410"
+ transform="scale(0.823795,0.823795)"
+ style="font-size:18;font-weight:normal;stroke-width:1pt;font-family:Helvetica;text-anchor:middle;"
+ id="text612">
+ <tspan
+ x="342.092987"
+ y="283.226013"
+ id="tspan621">
+JTA</tspan>
+ </text>
+ <rect
+ width="90.951"
+ height="44.4829"
+ x="130.134"
+ y="206.791"
+ style="font-size:12;fill:#757575;fill-rule:evenodd;stroke-width:1pt;"
+ id="rect616" />
+ <rect
+ width="90.951"
+ height="44.4829"
+ x="128.937"
+ y="204.898"
+ style="font-size:12;fill:#b3b3b3;fill-rule:evenodd;stroke-width:1pt;"
+ id="rect617" />
+ <text
+ x="212.445343"
+ y="283.226410"
+ transform="scale(0.823795,0.823795)"
+ style="font-size:18;font-weight:normal;stroke-width:1pt;font-family:Helvetica;text-anchor:middle;"
+ id="text618">
+ <tspan
+ x="212.445007"
+ y="283.226013"
+ id="tspan623">
+JDBC</tspan>
+ </text>
+ <g
+ transform="matrix(0.823795,0,0,0.823795,0.120302,6.19341)"
+ style="font-size:12;"
+ id="g637">
+ <g
+ transform="matrix(0.499515,0,0,0.415467,-0.237339,5.61339)"
+ id="g167">
+ <rect
+ width="199.065"
+ height="61.5532"
+ x="61.8805"
+ y="68.4288"
+ style="fill:#757575;fill-rule:evenodd;stroke-width:1pt;"
+ id="rect134" />
+ <rect
+ width="199.065"
+ height="61.5532"
+ x="59.2613"
+ y="65.8095"
+ style="fill:#e0e0e0;fill-rule:evenodd;stroke-width:1pt;"
+ id="rect135" />
+ </g>
+ <text
+ x="33.749969"
+ y="50.589706"
+ style="font-size:11;font-weight:normal;stroke-width:1pt;font-family:Helvetica;"
+ id="text188">
+ <tspan
+ x="33.750000"
+ y="50.589699"
+ id="tspan635">
+Transient Objects</tspan>
+ </text>
+ </g>
+ <g
+ transform="matrix(0.823795,0,0,0.823795,0.120302,5.25349)"
+ style="font-size:12;"
+ id="g644">
+ <g
+ transform="matrix(0.297486,0,0,0.516482,230.251,36.9178)"
+ id="g364">
+ <rect
+ width="199.065"
+ height="61.5532"
+ x="61.8805"
+ y="68.4288"
+ style="fill:#757575;fill-rule:evenodd;stroke-width:1pt;"
+ id="rect365" />
+ <rect
+ width="199.065"
+ height="61.5532"
+ x="59.2613"
+ y="65.8095"
+ style="fill:#e0e0e0;fill-rule:evenodd;stroke-width:1pt;"
+ id="rect366" />
+ </g>
+ <text
+ x="277.123230"
+ y="85.155571"
+ style="font-size:11;font-weight:normal;stroke-width:1pt;font-family:Helvetica;text-anchor:middle;"
+ id="text367">
+ <tspan
+ x="277.122986"
+ y="85.155602"
+ id="tspan631">
+Persistent</tspan>
+ <tspan
+ x="277.122986"
+ y="96.155602"
+ id="tspan633">
+Objects</tspan>
+ </text>
+ </g>
+</svg>
Copied: core/trunk/documentation/manual/zh-CN/src/main/docbook/images/hibernate_logo_a.png (from rev 14073, core/trunk/documentation/manual/en-US/src/main/docbook/images/hibernate_logo_a.png)
===================================================================
(Binary files differ)
Copied: core/trunk/documentation/manual/zh-CN/src/main/docbook/images/lite.png (from rev 14073, core/trunk/documentation/manual/en-US/src/main/docbook/images/lite.png)
===================================================================
(Binary files differ)
Copied: core/trunk/documentation/manual/zh-CN/src/main/docbook/images/lite.svg (from rev 14073, core/trunk/documentation/manual/en-US/src/main/docbook/images/lite.svg)
===================================================================
--- core/trunk/documentation/manual/zh-CN/src/main/docbook/images/lite.svg (rev 0)
+++ core/trunk/documentation/manual/zh-CN/src/main/docbook/images/lite.svg 2007-10-09 20:10:34 UTC (rev 14081)
@@ -0,0 +1,334 @@
+<?xml version="1.0" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20010904//EN"
+"http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd"
+[
+ <!ATTLIST svg
+ xmlns:xlink CDATA #FIXED "http://www.w3.org/1999/xlink">
+]>
+<!-- Created with Sodipodi ("http://www.sodipodi.com/") -->
+<svg
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ width="318.898"
+ height="248.031"
+ id="svg1">
+ <defs
+ id="defs3">
+ <linearGradient
+ x1="0"
+ y1="0"
+ x2="1"
+ y2="0"
+ id="linearGradient127"
+ gradientUnits="objectBoundingBox"
+ spreadMethod="pad">
+ <stop
+ style="stop-color:#000000;stop-opacity:1;"
+ offset="0"
+ id="stop128" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="1"
+ id="stop129" />
+ </linearGradient>
+ <linearGradient
+ x1="0"
+ y1="0"
+ x2="1"
+ y2="0"
+ id="linearGradient130"
+ xlink:href="#linearGradient127"
+ gradientUnits="objectBoundingBox"
+ spreadMethod="pad" />
+ <radialGradient
+ cx="0.5"
+ cy="0.5"
+ fx="0.5"
+ fy="0.5"
+ r="0.5"
+ id="radialGradient131"
+ xlink:href="#linearGradient127"
+ gradientUnits="objectBoundingBox"
+ spreadMethod="pad" />
+ </defs>
+ <rect
+ width="291.837"
+ height="57.0074"
+ x="17.3169"
+ y="18.646"
+ style="font-size:12;fill:#757575;fill-rule:evenodd;stroke-width:1pt;"
+ id="rect136" />
+ <rect
+ width="291.837"
+ height="57.0074"
+ x="13.9703"
+ y="16.2302"
+ style="font-size:12;fill:#d2d2d2;fill-rule:evenodd;stroke-width:1pt;"
+ id="rect126" />
+ <g
+ transform="matrix(0.326107,0,0,0.765831,9.59261,8.98517)"
+ style="font-size:12;"
+ id="g161">
+ <rect
+ width="285.502"
+ height="118.523"
+ x="16.6979"
+ y="99.2053"
+ style="fill:#757575;fill-rule:evenodd;stroke-width:1pt;"
+ id="rect137" />
+ <rect
+ width="285.502"
+ height="118.523"
+ x="13.4238"
+ y="95.9309"
+ style="fill:#d2d2d2;fill-rule:evenodd;stroke-width:1pt;"
+ id="rect132" />
+ </g>
+ <g
+ transform="matrix(1.02406,0,0,0.652953,0.223384,39.9254)"
+ style="font-size:12;"
+ id="g164">
+ <rect
+ width="285.502"
+ height="77.2688"
+ x="16.6979"
+ y="222.966"
+ style="fill:#757575;fill-rule:evenodd;stroke-width:1pt;"
+ id="rect138" />
+ <rect
+ width="285.502"
+ height="77.2688"
+ x="14.7335"
+ y="221.002"
+ transform="translate(-1.30962,-1.30992)"
+ style="fill:#d2d2d2;fill-rule:evenodd;stroke-width:1pt;"
+ id="rect133" />
+ </g>
+ <g
+ transform="matrix(0.449834,0,0,0.338463,-3.15909,9.73319)"
+ style="font-size:12;"
+ id="g167">
+ <rect
+ width="199.065"
+ height="61.5532"
+ x="61.8805"
+ y="68.4288"
+ style="fill:#757575;fill-rule:evenodd;stroke-width:1pt;"
+ id="rect134" />
+ <rect
+ width="199.065"
+ height="61.5532"
+ x="59.2613"
+ y="65.8095"
+ style="fill:#e0e0e0;fill-rule:evenodd;stroke-width:1pt;"
+ id="rect135" />
+ </g>
+ <text
+ x="302.277679"
+ y="65.943230"
+ transform="scale(0.73778,0.73778)"
+ style="font-size:18;font-weight:normal;stroke-width:1pt;font-family:Helvetica;"
+ id="text183">
+ <tspan
+ x="302.277954"
+ y="65.943184"
+ id="tspan360">
+Application</tspan>
+ </text>
+ <text
+ x="36.235924"
+ y="63.796055"
+ transform="scale(0.73778,0.73778)"
+ style="font-size:14;font-weight:normal;stroke-width:1pt;font-family:Helvetica;"
+ id="text188">
+ <tspan
+ x="36.235950"
+ y="63.796051"
+ id="tspan427">
+Transient Objects</tspan>
+ </text>
+ <text
+ x="180.416245"
+ y="290.543701"
+ transform="scale(0.73778,0.73778)"
+ style="font-size:18;font-weight:normal;stroke-width:1pt;font-family:Helvetica;"
+ id="text197">
+ <tspan
+ x="180.415939"
+ y="290.543549"
+ id="tspan421">
+Database</tspan>
+ </text>
+ <text
+ x="25.037701"
+ y="179.154755"
+ transform="scale(0.73778,0.73778)"
+ style="font-size:16;font-weight:normal;stroke-width:1pt;font-family:Helvetica;"
+ id="text216">
+ <tspan
+ x="25.037655"
+ y="179.154648"
+ id="tspan384">
+SessionFactory</tspan>
+ </text>
+ <g
+ transform="matrix(0.252763,0,0,0.765831,109.104,8.98517)"
+ style="font-size:12;"
+ id="g386">
+ <rect
+ width="285.502"
+ height="118.523"
+ x="16.6979"
+ y="99.2053"
+ style="fill:#757575;fill-rule:evenodd;stroke-width:1pt;"
+ id="rect387" />
+ <rect
+ width="285.502"
+ height="118.523"
+ x="13.4238"
+ y="95.9309"
+ style="fill:#d2d2d2;fill-rule:evenodd;stroke-width:1pt;"
+ id="rect388" />
+ </g>
+ <g
+ transform="matrix(0.297394,0,0,0.572692,101.502,21.6359)"
+ style="font-size:12;"
+ id="g364">
+ <rect
+ width="199.065"
+ height="61.5532"
+ x="61.8805"
+ y="68.4288"
+ style="fill:#757575;fill-rule:evenodd;stroke-width:1pt;"
+ id="rect365" />
+ <rect
+ width="199.065"
+ height="61.5532"
+ x="59.2613"
+ y="65.8095"
+ style="fill:#e0e0e0;fill-rule:evenodd;stroke-width:1pt;"
+ id="rect366" />
+ </g>
+ <text
+ x="202.746506"
+ y="102.992203"
+ transform="scale(0.73778,0.73778)"
+ style="font-size:14;font-weight:normal;stroke-width:1pt;font-family:Helvetica;text-anchor:middle;"
+ id="text367">
+ <tspan
+ x="202.746948"
+ y="102.992249"
+ id="tspan423">
+Persistent</tspan>
+ <tspan
+ x="202.746948"
+ y="116.992355"
+ id="tspan425">
+Objects</tspan>
+ </text>
+ <text
+ x="174.458496"
+ y="180.080795"
+ transform="scale(0.73778,0.73778)"
+ style="font-size:16;font-weight:normal;stroke-width:1pt;font-family:Helvetica;"
+ id="text389">
+ <tspan
+ x="174.458618"
+ y="180.080338"
+ id="tspan392">
+Session</tspan>
+ </text>
+ <g
+ transform="matrix(0.127369,0,0,0.765831,188.675,8.98517)"
+ style="font-size:12;"
+ id="g394">
+ <rect
+ width="285.502"
+ height="118.523"
+ x="16.6979"
+ y="99.2053"
+ style="fill:#757575;fill-rule:evenodd;stroke-width:1pt;"
+ id="rect395" />
+ <rect
+ width="285.502"
+ height="118.523"
+ x="13.4238"
+ y="95.9309"
+ style="fill:#d2d2d2;fill-rule:evenodd;stroke-width:1pt;"
+ id="rect396" />
+ </g>
+ <text
+ x="260.413269"
+ y="179.154739"
+ transform="scale(0.73778,0.73778)"
+ style="font-size:16;font-weight:normal;stroke-width:1pt;font-family:Helvetica;"
+ id="text397">
+ <tspan
+ x="260.412964"
+ y="179.154343"
+ id="tspan400">
+JDBC</tspan>
+ </text>
+ <g
+ transform="matrix(0.127369,0,0,0.765831,229.156,8.98517)"
+ style="font-size:12;"
+ id="g405">
+ <rect
+ width="285.502"
+ height="118.523"
+ x="16.6979"
+ y="99.2053"
+ style="fill:#757575;fill-rule:evenodd;stroke-width:1pt;"
+ id="rect406" />
+ <rect
+ width="285.502"
+ height="118.523"
+ x="13.4238"
+ y="95.9309"
+ style="fill:#d2d2d2;fill-rule:evenodd;stroke-width:1pt;"
+ id="rect407" />
+ </g>
+ <text
+ x="320.606903"
+ y="179.154739"
+ transform="scale(0.73778,0.73778)"
+ style="font-size:16;font-weight:normal;stroke-width:1pt;font-family:Helvetica;"
+ id="text408">
+ <tspan
+ x="320.606964"
+ y="179.154343"
+ id="tspan417">
+JNDI</tspan>
+ </text>
+ <g
+ transform="matrix(0.127369,0,0,0.765831,269.281,8.98517)"
+ style="font-size:12;"
+ id="g411">
+ <rect
+ width="285.502"
+ height="118.523"
+ x="16.6979"
+ y="99.2053"
+ style="fill:#757575;fill-rule:evenodd;stroke-width:1pt;"
+ id="rect412" />
+ <rect
+ width="285.502"
+ height="118.523"
+ x="13.4238"
+ y="95.9309"
+ style="fill:#d2d2d2;fill-rule:evenodd;stroke-width:1pt;"
+ id="rect413" />
+ </g>
+ <text
+ x="377.096313"
+ y="179.154739"
+ transform="scale(0.73778,0.73778)"
+ style="font-size:16;font-weight:normal;stroke-width:1pt;font-family:Helvetica;"
+ id="text414">
+ <tspan
+ x="377.096008"
+ y="179.154999"
+ id="tspan145">
+JTA</tspan>
+ </text>
+</svg>
Copied: core/trunk/documentation/manual/zh-CN/src/main/docbook/images/overview.png (from rev 14073, core/trunk/documentation/manual/en-US/src/main/docbook/images/overview.png)
===================================================================
(Binary files differ)
Copied: core/trunk/documentation/manual/zh-CN/src/main/docbook/images/overview.svg (from rev 14073, core/trunk/documentation/manual/en-US/src/main/docbook/images/overview.svg)
===================================================================
--- core/trunk/documentation/manual/zh-CN/src/main/docbook/images/overview.svg (rev 0)
+++ core/trunk/documentation/manual/zh-CN/src/main/docbook/images/overview.svg 2007-10-09 20:10:34 UTC (rev 14081)
@@ -0,0 +1,250 @@
+<?xml version="1.0" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20010904//EN"
+"http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd"
+[
+ <!ATTLIST svg
+ xmlns:xlink CDATA #FIXED "http://www.w3.org/1999/xlink">
+]>
+<!-- Created with Sodipodi ("http://www.sodipodi.com/") -->
+<svg
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ width="248.031"
+ height="248.031"
+ id="svg1">
+ <defs
+ id="defs3">
+ <linearGradient
+ x1="0"
+ y1="0"
+ x2="1"
+ y2="0"
+ id="linearGradient127"
+ gradientUnits="objectBoundingBox"
+ spreadMethod="pad">
+ <stop
+ style="stop-color:#000000;stop-opacity:1;"
+ offset="0"
+ id="stop128" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="1"
+ id="stop129" />
+ </linearGradient>
+ <linearGradient
+ x1="0"
+ y1="0"
+ x2="1"
+ y2="0"
+ id="linearGradient130"
+ xlink:href="#linearGradient127"
+ gradientUnits="objectBoundingBox"
+ spreadMethod="pad" />
+ <radialGradient
+ cx="0.5"
+ cy="0.5"
+ fx="0.5"
+ fy="0.5"
+ r="0.5"
+ id="radialGradient131"
+ xlink:href="#linearGradient127"
+ gradientUnits="objectBoundingBox"
+ spreadMethod="pad" />
+ </defs>
+ <g
+ transform="matrix(0.771934,0,0,0.771934,4.36019,-3.02123)"
+ style="font-size:12;"
+ id="g158">
+ <rect
+ width="285.502"
+ height="77.2688"
+ x="16.6979"
+ y="17.3527"
+ style="fill:#757575;fill-rule:evenodd;stroke-width:1pt;"
+ id="rect136" />
+ <rect
+ width="285.502"
+ height="77.2688"
+ x="14.7335"
+ y="15.3883"
+ transform="translate(-1.30962,-1.30992)"
+ style="fill:#d2d2d2;fill-rule:evenodd;stroke-width:1pt;"
+ id="rect126" />
+ </g>
+ <g
+ transform="matrix(0.771934,0,0,0.771934,4.36019,3.04452)"
+ style="font-size:12;"
+ id="g161">
+ <rect
+ width="285.502"
+ height="118.523"
+ x="16.6979"
+ y="99.2053"
+ style="fill:#757575;fill-rule:evenodd;stroke-width:1pt;"
+ id="rect137" />
+ <rect
+ width="285.502"
+ height="118.523"
+ x="13.4238"
+ y="95.9309"
+ style="fill:#d2d2d2;fill-rule:evenodd;stroke-width:1pt;"
+ id="rect132" />
+ </g>
+ <g
+ transform="matrix(0.771934,0,0,0.771934,4.36019,8.0993)"
+ style="font-size:12;"
+ id="g164">
+ <rect
+ width="285.502"
+ height="77.2688"
+ x="16.6979"
+ y="222.966"
+ style="fill:#757575;fill-rule:evenodd;stroke-width:1pt;"
+ id="rect138" />
+ <rect
+ width="285.502"
+ height="77.2688"
+ x="14.7335"
+ y="221.002"
+ transform="translate(-1.30962,-1.30992)"
+ style="fill:#d2d2d2;fill-rule:evenodd;stroke-width:1pt;"
+ id="rect133" />
+ </g>
+ <g
+ transform="matrix(0.771934,0,0,0.543505,2.59104,21.1103)"
+ style="font-size:12;"
+ id="g167">
+ <rect
+ width="199.065"
+ height="61.5532"
+ x="61.8805"
+ y="68.4288"
+ style="fill:#757575;fill-rule:evenodd;stroke-width:1pt;"
+ id="rect134" />
+ <rect
+ width="199.065"
+ height="61.5532"
+ x="59.2613"
+ y="65.8095"
+ style="fill:#e0e0e0;fill-rule:evenodd;stroke-width:1pt;"
+ id="rect135" />
+ </g>
+ <text
+ x="105.392174"
+ y="56.568123"
+ transform="scale(0.771934,0.771934)"
+ style="font-size:24;font-weight:normal;stroke-width:1pt;font-family:Helvetica;"
+ id="text183">
+ <tspan
+ x="105.392273"
+ y="56.568146"
+ id="tspan186">
+Application</tspan>
+ </text>
+ <text
+ x="81.820183"
+ y="103.149330"
+ transform="scale(0.771934,0.771934)"
+ style="font-size:20;font-weight:normal;stroke-width:1pt;font-family:Helvetica;"
+ id="text188">
+ <tspan
+ x="81.820213"
+ y="103.149727"
+ id="tspan206">
+Persistent Objects</tspan>
+ </text>
+ <text
+ x="111.548180"
+ y="278.927887"
+ transform="scale(0.771934,0.771934)"
+ style="font-size:24;font-weight:normal;stroke-width:1pt;font-family:Helvetica;"
+ id="text197">
+ <tspan
+ x="111.547874"
+ y="278.927551"
+ id="tspan200">
+Database</tspan>
+ </text>
+ <text
+ x="94.436180"
+ y="153.805740"
+ transform="scale(0.771934,0.771934)"
+ style="font-size:24;font-weight:normal;stroke-width:1pt;font-family:Helvetica;"
+ id="text216">
+ <tspan
+ x="94.436180"
+ y="153.805740"
+ id="tspan221">
+HIBERNATE</tspan>
+ </text>
+ <g
+ transform="matrix(0.771934,0,0,0.771934,2.59083,1.02261)"
+ style="font-size:12;"
+ id="g254">
+ <g
+ transform="translate(4.58374,2.61928)"
+ id="g176">
+ <g
+ transform="matrix(0.571429,0,0,0.67347,-10.6174,117.093)"
+ id="g170">
+ <rect
+ width="199.065"
+ height="61.5532"
+ x="61.8805"
+ y="68.4288"
+ style="fill:#757575;fill-rule:evenodd;stroke-width:1pt;"
+ id="rect171" />
+ <rect
+ width="199.065"
+ height="61.5532"
+ x="59.2613"
+ y="65.8095"
+ style="fill:#e0e0e0;fill-rule:evenodd;stroke-width:1pt;"
+ id="rect172" />
+ </g>
+ <g
+ transform="matrix(0.571429,0,0,0.67347,138.682,117.093)"
+ id="g173">
+ <rect
+ width="199.065"
+ height="61.5532"
+ x="61.8805"
+ y="68.4288"
+ style="fill:#757575;fill-rule:evenodd;stroke-width:1pt;"
+ id="rect174" />
+ <rect
+ width="199.065"
+ height="61.5532"
+ x="59.2613"
+ y="65.8095"
+ style="fill:#e0e0e0;fill-rule:evenodd;stroke-width:1pt;"
+ id="rect175" />
+ </g>
+ </g>
+ <text
+ x="47.259438"
+ y="182.367538"
+ style="font-weight:bold;stroke-width:1pt;font-family:Courier;"
+ id="text191">
+ <tspan
+ x="47.259399"
+ y="182.367996"
+ id="tspan212">
+hibernate.</tspan>
+ <tspan
+ x="47.259399"
+ y="194.367996"
+ id="tspan214">
+properties</tspan>
+ </text>
+ <text
+ x="198.523010"
+ y="188.260941"
+ style="font-weight:normal;stroke-width:1pt;font-family:helvetica;"
+ id="text194">
+ <tspan
+ id="tspan195">
+XML Mapping</tspan>
+ </text>
+ </g>
+</svg>
Copied: core/trunk/documentation/manual/zh-CN/src/main/docbook/legal_notice.xml (from rev 14073, core/trunk/documentation/manual/en-US/src/main/docbook/legal_notice.xml)
===================================================================
--- core/trunk/documentation/manual/zh-CN/src/main/docbook/legal_notice.xml (rev 0)
+++ core/trunk/documentation/manual/zh-CN/src/main/docbook/legal_notice.xml 2007-10-09 20:10:34 UTC (rev 14081)
@@ -0,0 +1,52 @@
+<?xml version='1.0' encoding="UTF-8"?>
+<!DOCTYPE legalnotice PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd">
+
+<!--
+ ~ Copyright (c) 2007, Red Hat Middleware, LLC. All rights reserved.
+ ~
+ ~ This copyrighted material is made available to anyone wishing to use, modify,
+ ~ copy, or redistribute it subject to the terms and conditions of the GNU
+ ~ Lesser General Public License, v. 2.1. This program is distributed in the
+ ~ hope that it will be useful, but WITHOUT A WARRANTY; without even the implied
+ ~ warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ ~ Lesser General Public License for more details. You should have received a
+ ~ copy of the GNU Lesser General Public License, v.2.1 along with this
+ ~ distribution; if not, write to the Free Software Foundation, Inc.,
+ ~ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ ~
+ ~ Red Hat Author(s): Steve Ebersole
+ -->
+<legalnotice id="Legal_Notice">
+ <title>Legal Notice</title>
+ <para>
+ <address>
+ <street>1801 Varsity Drive</street>
+ <city>Raleigh</city>, <state>NC</state><postcode>27606-2072</postcode><country>USA</country>
+ <phone>Phone: +1 919 754 3700</phone>
+ <phone>Phone: 888 733 4281</phone>
+ <fax>Fax: +1 919 754 3701</fax>
+ <pob>PO Box 13588</pob><city>Research Triangle Park</city>, <state>NC</state><postcode>27709</postcode><country>USA</country>
+ </address>
+ </para>
+ <para>
+ Copyright <trademark class="copyright"></trademark> 2007 by Red Hat, Inc. This material may be distributed only subject to the terms and conditions set forth in the Open Publication License, V1.0 or later (the latest version is presently available at <ulink url="http://www.opencontent.org/openpub/">http://www.opencontent.org/openpub/</ulink>).
+ </para>
+ <para>
+ Distribution of substantively modified versions of this document is prohibited without the explicit permission of the copyright holder.
+ </para>
+ <para>
+ Distribution of the work or derivative of the work in any standard (paper) book form for commercial purposes is prohibited unless prior permission is obtained from the copyright holder.
+ </para>
+ <para>
+ Red Hat and the Red Hat "Shadow Man" logo are registered trademarks of Red Hat, Inc. in the United States and other countries.
+ </para>
+ <para>
+ All other trademarks referenced herein are the property of their respective owners.
+ </para>
+ <para>
+ The GPG fingerprint of the security at redhat.com key is:
+ </para>
+ <para>
+ CA 20 86 86 2B D6 9D FC 65 F6 EC C4 21 91 80 CD DB 42 A6 0E
+ </para>
+</legalnotice>
\ No newline at end of file
Deleted: core/trunk/documentation/manual/zh-CN/src/main/docbook/master.xml
===================================================================
--- core/trunk/documentation/manual/zh-CN/src/main/docbook/master.xml 2007-10-09 19:32:35 UTC (rev 14080)
+++ core/trunk/documentation/manual/zh-CN/src/main/docbook/master.xml 2007-10-09 20:10:34 UTC (rev 14081)
@@ -1,474 +0,0 @@
-<?xml version='1.0' encoding="UTF-8"?>
-<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.3CR3//EN"
- "../support/docbook-dtd/docbookx.dtd"
-[
-<!ENTITY tutorial SYSTEM "modules/tutorial.xml">
-<!ENTITY architecture SYSTEM "modules/architecture.xml">
-<!ENTITY configuration SYSTEM "modules/configuration.xml">
-<!ENTITY persistent-classes SYSTEM "modules/persistent_classes.xml">
-<!ENTITY basic-mapping SYSTEM "modules/basic_mapping.xml">
-<!ENTITY collection-mapping SYSTEM "modules/collection_mapping.xml">
-<!ENTITY association-mapping SYSTEM "modules/association_mapping.xml">
-<!ENTITY component-mapping SYSTEM "modules/component_mapping.xml">
-<!ENTITY inheritance-mapping SYSTEM "modules/inheritance_mapping.xml">
-<!ENTITY session-api SYSTEM "modules/session_api.xml">
-<!ENTITY transactions SYSTEM "modules/transactions.xml">
-<!ENTITY events SYSTEM "modules/events.xml">
-<!ENTITY batch SYSTEM "modules/batch.xml">
-<!ENTITY query-hql SYSTEM "modules/query_hql.xml">
-<!ENTITY query-criteria SYSTEM "modules/query_criteria.xml">
-<!ENTITY query-sql SYSTEM "modules/query_sql.xml">
-<!ENTITY filters SYSTEM "modules/filters.xml">
-<!ENTITY xml SYSTEM "modules/xml.xml">
-<!ENTITY performance SYSTEM "modules/performance.xml">
-<!ENTITY toolset-guide SYSTEM "modules/toolset_guide.xml">
-<!ENTITY example-parentchild SYSTEM "modules/example_parentchild.xml">
-<!ENTITY example-weblog SYSTEM "modules/example_weblog.xml">
-<!ENTITY example-mappings SYSTEM "modules/example_mappings.xml">
-<!ENTITY best-practices SYSTEM "modules/best_practices.xml">
-]>
-
-
-<book lang="zh-cn">
-
- <bookinfo>
- <title>HIBERNATE - 符åJavaä¹ æ¯çå
³ç³»æ°æ®åºæä¹
å</title>
-
- <subtitle>Hibernateåèææ¡£</subtitle>
- <releaseinfo>3.2</releaseinfo>
- </bookinfo>
-
- <toc/>
-
- <preface id="preface" revision="2">
- <title>åè¨</title>
-
- <para>
- WARNING! This is a translated version of the English Hibernate reference
- documentation. The translated version might not be up to date! However, the
- differences should only be very minor. Consult the English reference
- documentation if you are missing information or encounter a translation
- error. If you like to contribute to a particular translation, contact us
- on the Hibernate developer mailing list.
- </para>
-
- <para>
- Translator(s): RedSaga Translate Team 满æ±çº¢ç¿»è¯å¢é <caoxg at yahoo.com>
- </para>
-
- <para>
- å¨ä»æ¥çä¼ä¸ç¯å¢ä¸ï¼æé¢å对象ç软件åå
³ç³»æ°æ®åºä¸èµ·ä½¿ç¨å¯è½æ¯ç¸å½éº»ç¦ã浪费æ¶é´çãHibernateæ¯ä¸ä¸ªé¢åJavaç¯å¢ç对象/å
³ç³»æ°æ®åºæ å°å·¥å
·ã对象/å
³ç³»æ°æ®åºæ å°(object/relational mapping (ORM))è¿ä¸ªæ¯è¯è¡¨ç¤ºä¸ç§ææ¯ï¼ç¨æ¥æ对象模å表示ç对象æ å°å°åºäºSQLçå
³ç³»æ¨¡åæ°æ®ç»æä¸å»ã
- </para>
-
- <para>
- Hibernateä¸ä»
ä»
管çJavaç±»å°æ°æ®åºè¡¨çæ å°ï¼å
æ¬Javaæ°æ®ç±»åå°SQLæ°æ®ç±»åçæ å°ï¼ï¼è¿æä¾æ°æ®æ¥è¯¢åè·åæ°æ®çæ¹æ³ï¼å¯ä»¥å¤§å¹
度åå°å¼åæ¶äººå·¥ä½¿ç¨SQLåJDBCå¤çæ°æ®çæ¶é´ã
- </para>
-
- <para>
- Hibernateçç®æ æ¯å¯¹äºå¼åè
é常çæ°æ®æä¹
åç¸å
³çç¼ç¨ä»»å¡ï¼è§£æ¾å
¶ä¸ç95%ã对äºä»¥æ°æ®ä¸ºä¸å¿çç¨åºæ¥è¯´,å®ä»¬å¾å¾åªå¨æ°æ®åºä¸ä½¿ç¨åå¨è¿ç¨æ¥å®ç°åä¸é»è¾,Hibernateå¯è½ä¸æ¯æ好ç解å³æ¹æ¡;对äºé£äºå¨åºäºJavaçä¸é´å±åºç¨ä¸ï¼å®ä»¬å®ç°é¢å对象çä¸å¡æ¨¡åååä¸é»è¾çåºç¨ï¼Hibernateæ¯ææç¨çãä¸ç®¡ææ ·ï¼Hibernateä¸å®å¯ä»¥å¸®å©ä½ æ¶é¤æè
å
è£
é£äºé对ç¹å®ååçSQL代ç ï¼å¹¶ä¸å¸®ä½ æç»æéä»è¡¨æ ¼å¼ç表示形å¼è½¬æ¢å°ä¸ç³»åç对象å»ã
- </para>
-
- <para>
- å¦æä½ å¯¹Hibernateå对象/å
³ç³»æ°æ®åºæ å°è¿æ¯ä¸ªæ°æï¼æè
çè³å¯¹Javaä¹ä¸çæï¼è¯·æç
§ä¸é¢çæ¥éª¤æ¥å¦ä¹ ã
- </para>
-
- <orderedlist>
- <listitem>
- <para>
- é
读<xref linkend="tutorial"/>ï¼è¿æ¯ä¸ç¯å
å«è¯¦ç»çéæ¥æ导çæåãæ¬æåçæºä»£ç å
å«å¨åè¡å
ä¸ï¼ä½ å¯ä»¥å¨<literal>doc/reference/tutorial/</literal>ç®å½ä¸æ¾å°ã </para>
- </listitem>
- <listitem>
- <para>
- é
读<xref linkend="architecture"/>æ¥ç解Hibernateå¯ä»¥ä½¿ç¨çç¯å¢ã
- </para>
- </listitem>
- <listitem>
- <para>
- æ¥çHibernateåè¡å
ä¸ç<literal>eg/</literal>ç®å½ï¼éé¢æä¸ä¸ªç®åçç¬ç«è¿è¡çç¨åºãæä½ çJDBC驱å¨æ·è´å°<literal>lib/</literal>ç®å½ä¸ï¼ä¿®æ¹ä¸ä¸<literal>src/hibernate.properties</literal>,æå®å
¶ä¸ä½ çæ°æ®åºçä¿¡æ¯ãè¿å
¥å½ä»¤è¡ï¼åæ¢å°ä½ çåè¡å
çç®å½ï¼è¾å
¥<literal>ant eg</literal>(使ç¨äºAntï¼ï¼æè
å¨Windowsæä½ç³»ç»ä¸ä½¿ç¨<literal>build eg</literal>ã
- </para>
- </listitem>
- <listitem>
- <para>
- æè¿ä»½åèææ¡£ä½ä¸ºä½ å¦ä¹ ç主è¦ä¿¡æ¯æ¥æºã
- </para>
- </listitem>
- <listitem>
- <para>
- å¨Hibernate çç½ç«ä¸å¯ä»¥æ¾å°ç»å¸¸æé®çé®é¢ä¸è§£ç(FAQ)ã
- </para>
- </listitem>
- <listitem>
- <para>
- å¨Hibernateç½ç«ä¸è¿æ第ä¸æ¹çæ¼ç¤ºã示ä¾åæç¨çé¾æ¥ã
- </para>
- </listitem>
- <listitem>
- <para>
- Hibernateç½ç«çâ社åº(Community Area)âæ¯è®¨è®ºå
³äºè®¾è®¡æ¨¡å¼ä»¥åå¾å¤æ´åæ¹æ¡(Tomcat, JBoss AS, Struts, EJB,çç)ç好å°æ¹ã
- </para>
- </listitem>
- </orderedlist>
-
- <para>
- å¦æä½ æé®é¢ï¼è¯·ä½¿ç¨Hibernateç½ç«ä¸é¾æ¥çç¨æ·è®ºåãæ们ä¹æä¾ä¸ä¸ªJIRAé®é¢è¿½è¸ªç³»ç»ï¼æ¥æébugæ¥ååæ°åè½è¯·æ±ãå¦æä½ å¯¹å¼åHibernateæå
´è¶£ï¼è¯·å å
¥å¼åè
çé®ä»¶å表ãï¼Hibernateç½ç«ä¸çç¨æ·è®ºåæä¸ä¸ªä¸æçé¢ï¼JavaEyeä¹æHibernateä¸æçé¢,æ¨å¯ä»¥å¨é£é交æµé®é¢ä¸ç»éªãï¼
- </para>
-
- <para>
- åä¸å¼åã产åæ¯æåHibernateå¹è®å¯ä»¥éè¿JBoss Inc.è·å¾ãï¼è¯·æ¥é
ï¼http://www.hibernate.org/SupportTraining/ï¼ã
- Hibernateæ¯ä¸ä¸ªä¸ä¸çå¼æ¾æºä»£ç 项ç®(Professional Open Source project)ï¼ä¹æ¯JBoss Enterprise Middleware System(JEMS),JBossä¼ä¸çº§ä¸é´ä»¶ç³»ç»çä¸ä¸ªæ ¸å¿ç»ä»¶ã
- </para>
-
- <sect1 id="preface-translate-comments-zh-cn">
- <title>ç¿»è¯è¯´æ</title>
-
- <para>
- æ¬ææ¡£çç¿»è¯æ¯å¨ç½ç»ä¸åä½è¿è¡çï¼ä¹ä¼ä¸ææ ¹æ®Hibernateçå级è¿è¡æ´æ°ãæä¾æ¤ææ¡£çç®çæ¯ä¸ºäºåç¼å¦ä¹ Hibernateçå¡åº¦ï¼èé代æ¿åææ¡£ãæ们建议æææè½åç读è
é½ç´æ¥é
读è±æåæãè¥æ¨å¯¹ç¿»è¯æå¼è®®ï¼æåç°ç¿»è¯é误ï¼æ¬è¯·ä¸åèµæï¼æ¥åå°å¦ä¸emailå°åï¼cao at redsaga.com
- </para>
-
- <para>
- Hibernateçæ¬3çç¿»è¯ç±æ»¡æ±çº¢ç¿»è¯å¢é(RedSaga Translate Team)éä½è¿è¡ï¼è¿ä¹æ¯ä¸æ¬¡å¤§è§æ¨¡ç½ç»ç¿»è¯çè¯éªãå¨ä¸å°20天çæ¶é´å
ï¼æ们å®æäºä¸¤ç¾å¤é¡µææ¡£çç¿»è¯ï¼è¿ä¸æææ¯éè¿åå ä½ç½åéä½åªåå®æçãéè¿è¿æ¬¡ç¿»è¯ï¼æ们ä¹æäºä¸å¥å®æ´çæµç¨ï¼ä»åè¯ãææ¯å®¡æ ¸ä¸ç´å°æåå®¡æ ¸ãåå¸ãæ们çç¿»è¯å¢éè¿ä¼ç»§ç»å®åæ们çç¿»è¯æµç¨ï¼å¹¶ç¿»è¯å
¶ä»ä¼ç§çJavaå¼æºèµæï¼æ¬è¯·æå¾
ã
- </para>
-
- <table frame="topbot" id="redsaga-translate-team">
- <title>
- Hibernate v3ç¿»è¯å¢é
- </title>
- <tgroup cols="5" rowsep="1" colsep="1">
- <colspec colname="c1" colwidth="1*"/>
- <colspec colname="c2" colwidth="2*"/>
- <colspec colname="c3" colwidth="2*"/>
- <colspec colname="c4" colwidth="2*"/>
- <colspec colname="c5" colwidth="2*"/>
- <thead>
- <row>
- <entry align="center">
- åºå·
- </entry>
- <entry align="center">
- æ é¢
- </entry>
- <entry align="center">
- ä¸ææ é¢
- </entry>
- <entry align="center">
- v3ç¿»è¯
- </entry>
- <entry align="center">
- v3å®¡æ ¡
- </entry>
- <entry align="center">
- v3.1å®¡æ ¡
- </entry>
- </row>
- </thead>
- <tbody>
- <row>
- <entry>--</entry>
- <entry>Quickstart with Tomcat</entry>
- <entry>å¨Tomcatä¸å¿«éä¸æ(3.1çæ¬ä¸åæ¶ï¼</entry>
- <entry>æ¹æé¢</entry>
- <entry>zoujm</entry>
- <entry>--</entry>
- </row>
- <row>
- <entry>#1</entry>
- <entry>Turtotial</entry>
- <entry>Hibernateå
¥é¨</entry>
- <entry>Zheng Shuai</entry>
- <entry>-</entry>
- <entry>Sean Chan</entry>
- </row>
- <row>
- <entry>#2</entry>
- <entry>Architecture</entry>
- <entry>ä½ç³»ç»æ</entry>
- <entry>Hilton(BJUG)</entry>
- <entry>åå¦åå</entry>
- <entry>Sean Chan</entry>
- </row>
- <row>
- <entry>#3</entry>
- <entry>Configuration</entry>
- <entry>é
ç½®</entry>
- <entry>Goncha</entry>
- <entry>mochow</entry>
- <entry>zcgly</entry>
- </row>
- <row>
- <entry>#4</entry>
- <entry>Persistent Classes</entry>
- <entry>æä¹
åç±»</entry>
- <entry>æ¹æé¢</entry>
- <entry>mochow</entry>
- <entry>DigitalSonic</entry>
- </row>
- <row>
- <entry>#5</entry>
- <entry>Basic O/R Mapping</entry>
- <entry>对象/å
³ç³»æ°æ®åºæ å°åºç¡(ä¸)</entry>
- <entry>moxie</entry>
- <entry>Kingfish</entry>
- <entry>å¼ æé¢</entry>
- </row>
- <row>
- <entry></entry>
- <entry></entry>
- <entry>对象/å
³ç³»æ°æ®åºæ å°åºç¡(ä¸)</entry>
- <entry>inter_dudu</entry>
- <entry>åå½é(vincent)</entry>
- <entry>å¼ æé¢</entry>
- </row>
- <row>
- <entry>#6</entry>
- <entry>Collection Mapping</entry>
- <entry>éåç±»æ å°</entry>
- <entry>æ¹æé¢</entry>
- <entry>robbin</entry>
- <entry>--</entry>
- </row>
- <row>
- <entry>#7</entry>
- <entry>Association Mappings</entry>
- <entry>å
³èå
³ç³»æ å°</entry>
- <entry>Robbin</entry>
- <entry>devils.advocate</entry>
- <entry>--</entry>
- </row>
- <row>
- <entry>#8</entry>
- <entry>Component Mapping</entry>
- <entry>ç»ä»¶æ å°</entry>
- <entry>æ¹æé¢</entry>
- <entry>Robbin</entry>
- <entry>Song guo qiang</entry>
- </row>
- <row>
- <entry>#9</entry>
- <entry>Inheritance Mappings</entry>
- <entry>继æ¿æ å°</entry>
- <entry>morning(BJUG)</entry>
- <entry>mochow</entry>
- <entry>Liang cheng</entry>
- </row>
- <row>
- <entry>#10</entry>
- <entry>Working with objects</entry>
- <entry>ä¸å¯¹è±¡å
±äº</entry>
- <entry>ç¨å¹¿æ¥ </entry>
- <entry>åå¦åå</entry>
- <entry>--</entry>
- </row>
- <row>
- <entry>#11</entry>
- <entry>Transactions And Concurrency</entry>
- <entry>äºå¡å并å</entry>
- <entry>Robbin</entry>
- <entry>mochow</entry>
- <entry>--</entry>
- </row>
- <row>
- <entry>#12</entry>
- <entry>Interceptors and events</entry>
- <entry>继æ¿æ å°</entry>
- <entry>ä¸å½©ç¼(BJUG)</entry>
- <entry>åå¦åå</entry>
- <entry>--</entry>
- </row>
- <row>
- <entry>#13</entry>
- <entry>Batch processing</entry>
- <entry>æ¹éå¤ç</entry>
- <entry>Kingfish(BJUG)</entry>
- <entry>åå¦åå</entry>
- <entry>--</entry>
- </row>
- <row>
- <entry>#14</entry>
- <entry>HQL: The Hibernate Query Language</entry>
- <entry>HQL: Hibernateæ¥è¯¢è¯è¨</entry>
- <entry>é浩(BJUG)</entry>
- <entry>Zheng Shuai</entry>
- <entry>--</entry>
- </row>
- <row>
- <entry>#15</entry>
- <entry>Criteria Queries</entry>
- <entry>æ¡ä»¶æ¥è¯¢</entry>
- <entry>nemo(BJUG)</entry>
- <entry>Zheng Shuai</entry>
- <entry>--</entry>
- </row>
- <row>
- <entry>#16</entry>
- <entry>Native SQL</entry>
- <entry>Native SQLæ¥è¯¢</entry>
- <entry>似水æµå¹´</entry>
- <entry>zoujm</entry>
- <entry>--</entry>
- </row>
- <row>
- <entry>#17</entry>
- <entry>Filters</entry>
- <entry>è¿æ»¤æ°æ®</entry>
- <entry>å°äº(BJUG)</entry>
- <entry>Goncha</entry>
- <entry>--</entry>
- </row>
- <row>
- <entry>#18</entry>
- <entry>XML Mapping</entry>
- <entry>XMLæ å°</entry>
- <entry>edward(BJUG)</entry>
- <entry>Goncha</entry>
- <entry>huxb</entry>
- </row>
- <row>
- <entry>#19</entry>
- <entry>Improving performance</entry>
- <entry>æ§è½æå</entry>
- <entry>Wangjinfeng</entry>
- <entry>Robbin</entry>
- <entry>--</entry>
- </row>
- <row>
- <entry>#20</entry>
- <entry>Toolset Guide</entry>
- <entry>å·¥å
·ç®±æå</entry>
- <entry>æ¹æé¢</entry>
- <entry>Robbin</entry>
- <entry>--</entry>
- </row>
- <row>
- <entry>#21</entry>
- <entry>Example: Parent/Child</entry>
- <entry>示ä¾ï¼ç¶åå
³ç³»</entry>
- <entry>æ¹æé¢</entry>
- <entry>devils.advocate</entry>
- <entry>--</entry>
- </row>
- <row>
- <entry>#22</entry>
- <entry>Example: Weblog Application</entry>
- <entry>示ä¾ï¼Weblog åºç¨ç¨åº</entry>
- <entry>æ¹æé¢</entry>
- <entry>devils.advocate</entry>
- <entry>--</entry>
- </row>
- <row>
- <entry>#23</entry>
- <entry>Example: Various Mappings</entry>
- <entry>示ä¾ï¼å¤ç§æ å°</entry>
- <entry>shidu(BJUG)</entry>
- <entry>å°äº</entry>
- <entry>--</entry>
- </row>
- <row>
- <entry>#24</entry>
- <entry>Best Practices</entry>
- <entry>æä½³å®è·µ</entry>
- <entry>æ¹æé¢</entry>
- <entry>å°äº</entry>
- <entry>--</entry>
- </row>
- </tbody>
- </tgroup>
- </table>
-
- <para>
- v3.2çæ¬å¨2006å¹´11æ份ç±æ¹æé¢æ´æ°ã
- </para>
-
- <para>
- å
³äºæ们
- </para>
-
-
- <variablelist spacing="compact">
- <varlistentry>
- <term>满æ±çº¢.å¼æº, http://www.redsaga.com</term>
- <listitem>
- <para>
- ä»æç«ä¹åå°±è´åäºJavaå¼æ¾æºä»£ç å¨ä¸å½çä¼ æä¸åå±,ä¸å½å
å¤ä¸ªJavaå¢ä½ååºç社ææ·±å
¥äº¤æµãåæå°è¯´å¤åçååï¼ç®åæ两个å¢éï¼âOpenDocå¢éâä¸âç¿»è¯å¢éâï¼æ¬ç¿»è¯ææ¡£å³ä¸ºç¿»è¯å¢éä½åãOpenDocå¢éå·²ç»æ¨åºå
æ¬HibernateãiBatisãSpringãWebWorkçå¤ä»½å¼æ¾ææ¡£ï¼å¹¶äº2005å¹´5æå¨Hibernateå¼æ¾ææ¡£åºç¡ä¸æ©å
æ书ï¼åºçäºåå书ç±ï¼ãæ·±å
¥æµ
åºHibernateãï¼æ¬ä¹¦400ä½é¡µï¼éåå个å±æ¬¡çHibernateç¨æ·ã(http://www.redsaga.com/hibernate_book.html)æ¬è¯·æ¯æã
- </para>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term>å京Javaç¨æ·ç», http://www.bjug.org</term>
- <listitem>
- <para>
- Beiing Java User Groupï¼æ°é´ææ¯äº¤æµç»ç»ï¼æç«äº2004å¹´6æã以交æµä¸å
±äº«ä¸ºå®æ¨ï¼æ¯ä¸¤å¨ä¸¾è¡ä¸æ¬¡ææ¯èä¼æ´»å¨ãBJUGçç®æ æ¯ï¼éè¿å°é¨å人çåªåï¼å½¢æä¸ä¸ªææ¯ç¤¾ç¾¤ï¼å建è¯å¥½ç交æµæ°å´ï¼å¹¶å°æ°çææ¯åææ³æ¨å¹¿å°æ´ä¸ªITçï¼è®©æ们å
±åè¿æ¥ã
-
- </para>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term>Javaè§çº¿, http://www.javaeye.com</term>
- <listitem>
- <para>
- Javaè§çº¿å¨æ¯Hibernateä¸æ论åï¼http://www.hibernate.org.cnï¼Hibernateä¸æ论åæ¯ä¸å½ææ©çHibernateä¸ä¸ç¨æ·è®ºåï¼ä¸ºHibernateå¨ä¸å½çæ¨å¹¿ååºäºå·¨å¤§çè´¡ç®ï¼åºç¡ä¸åå±èµ·æ¥çJava深度ææ¯ç½ç«ï¼ç®æ æ¯æ为ä¸ä¸ªé«åè´¨çï¼æææ³æ·±åº¦çãååç²¾ç¥çJavaææ¯äº¤æµç½ç«ï¼ä¸ºè½¯ä»¶ä»ä¸äººåæä¾ä¸ä¸ªèªç±ç交æµææ¯ï¼äº¤æµææ³å交æµä¿¡æ¯çå¹³å°ã
-
- </para>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term>è´è°¢</term>
- <listitem>
- <para>è¿æä¸äºæåç»æ们åæ¥äºå误ï¼å¨æ¤è´è°¢ï¼Kurapicaï¼ææ¯
ï¼ææµ·æã
- </para>
- </listitem>
- </varlistentry>
- </variablelist>
-
- </sect1>
-
- <sect1 id="preface-translate-licence-zh-cn">
- <title>çæ声æ</title>
-
- <para>
- Hibernateè±æææ¡£å±äºHibernateåè¡å
çä¸é¨åï¼éµå¾ªLGPLåè®®ãæ¬ç¿»è¯çæ¬åæ ·éµå¾ªLGPLåè®®ãåä¸ç¿»è¯çè¯è
ä¸è´åææ¾å¼é¤ç½²åæå¤å¯¹æ¬ç¿»è¯çæ¬çå
¶å®æå©è¦æ±ã
- </para>
-
- <para>
- æ¨å¯ä»¥èªç±é¾æ¥ãä¸è½½ãä¼ ææ¤ææ¡£ï¼æè
æ¾ç½®å¨æ¨çç½ç«ä¸ï¼çè³ä½ä¸ºäº§åçä¸é¨ååè¡ãä½åææ¯å¿
é¡»ä¿è¯å
¨æå®æ´è½¬è½½ï¼å
æ¬å®æ´ççæä¿¡æ¯åä½è¯è
声æï¼å¹¶ä¸è½è¿åLGPLåè®®ãè¿éâå®æ´âçå«ä¹æ¯ï¼ä¸è½è¿è¡ä»»ä½å é¤/å¢æ·»/注解ãè¥æå é¤/å¢æ·»/注解ï¼å¿
é¡»é段æ确声æé£äºé¨å并éæ¬ææ¡£çä¸é¨åã
- </para>
- </sect1>
-
- </preface>
-
- &tutorial;
-
- &architecture;
-
- &configuration;
-
- &persistent-classes;
-
- &basic-mapping;
- &collection-mapping;
- &association-mapping;
- &component-mapping;
- &inheritance-mapping;
-
- &session-api;
- &transactions;
- &events;
- &batch;
-
- &query-hql;
- &query-criteria;
- &query-sql;
- &filters;
- &xml;
-
- &performance;
-
- &toolset-guide;
-
- &example-parentchild;
- &example-weblog;
- &example-mappings;
-
- &best-practices;
-
-</book>
-
Added: core/trunk/documentation/manual/zh-CN/src/main/docbook/translators.xml
===================================================================
--- core/trunk/documentation/manual/zh-CN/src/main/docbook/translators.xml (rev 0)
+++ core/trunk/documentation/manual/zh-CN/src/main/docbook/translators.xml 2007-10-09 20:10:34 UTC (rev 14081)
@@ -0,0 +1,17 @@
+<?xml version='1.0' encoding="UTF-8"?>
+
+<!DOCTYPE authorgroup PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd">
+
+<authorgroup id="translators">
+
+ <othercredit class="translator">
+ <firstname>Cao</firstname>
+ <surname>Xiaogang</surname>
+ <affiliation>
+ <orgname>RedSaga</orgname>
+ </affiliation>
+ <contrib>Translation Lead</contrib>
+ <email>caoxg at yahoo.com</email>
+ </othercredit>
+
+</authorgroup>
More information about the hibernate-commits
mailing list