From: <hib...@li...> - 2006-08-03 14:01:48
|
Author: jdkim528 Date: 2006-08-03 10:01:28 -0400 (Thu, 03 Aug 2006) New Revision: 10198 Modified: trunk/Hibernate3/doc/reference/ko/README-KO.txt trunk/Hibernate3/doc/reference/ko/master.xml trunk/Hibernate3/doc/reference/ko/modules/architecture.xml trunk/Hibernate3/doc/reference/ko/modules/association_mapping.xml trunk/Hibernate3/doc/reference/ko/modules/basic_mapping.xml trunk/Hibernate3/doc/reference/ko/modules/batch.xml trunk/Hibernate3/doc/reference/ko/modules/collection_mapping.xml trunk/Hibernate3/doc/reference/ko/modules/component_mapping.xml trunk/Hibernate3/doc/reference/ko/modules/configuration.xml trunk/Hibernate3/doc/reference/ko/modules/events.xml trunk/Hibernate3/doc/reference/ko/modules/example_mappings.xml trunk/Hibernate3/doc/reference/ko/modules/inheritance_mapping.xml trunk/Hibernate3/doc/reference/ko/modules/performance.xml trunk/Hibernate3/doc/reference/ko/modules/persistent_classes.xml trunk/Hibernate3/doc/reference/ko/modules/query_criteria.xml trunk/Hibernate3/doc/reference/ko/modules/query_hql.xml trunk/Hibernate3/doc/reference/ko/modules/query_sql.xml trunk/Hibernate3/doc/reference/ko/modules/session_api.xml trunk/Hibernate3/doc/reference/ko/modules/transactions.xml trunk/Hibernate3/doc/reference/ko/modules/tutorial.xml Log: 3.2 cr3 Modified: trunk/Hibernate3/doc/reference/ko/README-KO.txt =================================================================== --- trunk/Hibernate3/doc/reference/ko/README-KO.txt 2006-08-03 09:00:25 UTC (rev 10197) +++ trunk/Hibernate3/doc/reference/ko/README-KO.txt 2006-08-03 14:01:28 UTC (rev 10198) @@ -9,28 +9,34 @@ Blog : http://blog.naver.com/jdkim528/ [Down/Config/Build] - cvs Ŭ ִٸ - 1) : pserve/extssh ϴ- 2) : anonymous - 3)ȣƮ : cvs.sourceforge.net - 4)Ʈ : ⺻ - 5)Ұ : /cvsroot/hibernate - 6) : Hibernate3/doc/reference - REFERENCE ü ŵ - ôٸŵ ˴ϴ - []. ޱ 6) Hibernate3/doc/reference/supportð- ǻ 丮 []/reference/ ϴ- []. ۺ ޱ 6) Hibernate3/doc/reference/ko- ǻ 丮 []/reference/ ϴ - [. ޱ /doc/reference/build.xml + * CVS SVNٲ ű 䰡 + . + + TortoiseSVN ǷTortoiseSVN + մϴ(ȣsvn Ŭ ٸش + ŵ Դϴ) + + TortoiseSVN Ŭ ġ̴ٸý ʽÿ + 1) ϴ(D:\repo) + 2) D:\repo 콺 Ŭ TortoiseSVN + "Create repository Here..." Ŭ˾ߴµ, + ý/DB K + 3)hibernate ޱ :\repo\Hibernate3) + 4)D:\repo\hibernate 콺 Ŭ , + TortoiseSVN CheckOut Ŭʽÿ + 5)URL repository + "http://anonhibernate.labs.jboss.com/trunk/Hibernate3" ϰ + OK Ŭʽÿ+ 6) D:\repo\Hibernate3\doc\referenceϴ + 7) Ͻø˴ϴ + + *) ôٸŵ ˴ϴ + /doc/reference/build.xml Ʒ κе óϴ - [ϱ []. ϱ []/reference/ ant all.docϽø˴ϴ ð 2 ҿϴ - []. []. 丮 []/reference/build/ko/ 丮 ñٶ. ſð Modified: trunk/Hibernate3/doc/reference/ko/master.xml =================================================================== --- trunk/Hibernate3/doc/reference/ko/master.xml 2006-08-03 09:00:25 UTC (rev 10197) +++ trunk/Hibernate3/doc/reference/ko/master.xml 2006-08-03 14:01:28 UTC (rev 10198) @@ -33,7 +33,7 @@ <bookinfo lang="ko"> <title>HIBERNATE - 개성있는 자바를 위한 관계 영속</title> <subtitle>하이버네이트 참조 문서</subtitle> - <releaseinfo lang="ko">3.1</releaseinfo> + <releaseinfo lang="ko">3.2 cr3</releaseinfo> </bookinfo> <toc lang="ko" /> Modified: trunk/Hibernate3/doc/reference/ko/modules/architecture.xml =================================================================== --- trunk/Hibernate3/doc/reference/ko/modules/architecture.xml 2006-08-03 09:00:25 UTC (rev 10197) +++ trunk/Hibernate3/doc/reference/ko/modules/architecture.xml 2006-08-03 14:01:28 UTC (rev 10198) @@ -236,7 +236,7 @@ </para> </sect1> - <sect1 id="architecture-current-session" revision="1"> + <sect1 id="architecture-current-session" revision="2"> <title>컨텍스트 상의 세션들</title> <para> Hibernate를 사용하는 대부분의 어플리케이션들은 어떤 양식의 "컨텍스트상의(contextual)" 세션들을 필요로 한다. 여기서 @@ -264,7 +264,7 @@ <para> 그것의 계약에 대한 상세한 논의는 <literal>org.hibernate.context.CurrentSessionContext</literal> 인터페이스에 관한 javadocs를 보라. 그것은 하나의 메소드, <literal>currentSession()</literal>를 정의하며, 그 구현은 - 현재의 컨텍스트 상의 세션을 추적할 책임이 있다. 비공식적으로, Hibernate는 이 인터페이스에 대한 구 개의 구현들을 부수적으로 + 현재의 컨텍스트 상의 세션을 추적할 책임이 있다. 비공식적으로, Hibernate는 이 인터페이스에 대한 세 개의 구현들을 부수적으로 포함하고 있다. </para> @@ -284,7 +284,7 @@ </listitem> </itemizedlist> <para> - 두 구현들은 <emphasis>session-per-request</emphasis>로 알려지고 사용되고 있는 + 처음의 두 구현들은 <emphasis>session-per-request</emphasis>로 알려지고 사용되고 있는 "하나의 세션 - 하나의 데이터베이스 트랜잭션" 프로그래밍 모형을 제공한다. 하나의 Hibernate 세션의 시작과 끝은 데이터베이스 트랜잭션의 존속 기간에 의해 정의된다. 만일 (예를 들면 순수 J2SE에서 또는 JTA/UserTransaction/BMT의 경우에) 당신이 프로그램 상의 트랜잭션 경계구분을 사용할 경우, 당신은 당신의 코드로부터 기본 트랜잭션 시스템을 은폐시키는데 Modified: trunk/Hibernate3/doc/reference/ko/modules/association_mapping.xml =================================================================== --- trunk/Hibernate3/doc/reference/ko/modules/association_mapping.xml 2006-08-03 09:00:25 UTC (rev 10197) +++ trunk/Hibernate3/doc/reference/ko/modules/association_mapping.xml 2006-08-03 14:01:28 UTC (rev 10198) @@ -48,8 +48,7 @@ </id> </class>]]></programlisting> <programlisting><![CDATA[ -create table Person ( personId bigint not null primary key, - addressId bigint not null ) +create table Person ( personId bigint not null primary key, addressId bigint not null ) create table Address ( addressId bigint not null primary key ) ]]></programlisting> @@ -79,8 +78,7 @@ </id> </class>]]></programlisting> <programlisting><![CDATA[ -create table Person ( personId bigint not null primary key, - addressId bigint not null unique ) +create table Person ( personId bigint not null primary key, addressId bigint not null unique ) create table Address ( addressId bigint not null primary key ) ]]></programlisting> @@ -135,8 +133,7 @@ </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 ) +create table Address ( addressId bigint not null primary key, personId bigint not null ) ]]></programlisting> <para> @@ -177,8 +174,7 @@ </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 PersonAddress ( personId not null, addressId bigint not null primary key ) create table Address ( addressId bigint not null primary key ) ]]></programlisting> @@ -211,8 +207,7 @@ </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 PersonAddress ( personId bigint not null primary key, addressId bigint not null ) create table Address ( addressId bigint not null primary key ) ]]></programlisting> @@ -247,8 +242,7 @@ </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 PersonAddress ( personId bigint not null primary key, addressId bigint not null unique ) create table Address ( addressId bigint not null primary key ) ]]></programlisting> @@ -279,9 +273,7 @@ </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 PersonAddress ( personId bigint not null, addressId bigint not null, primary key (personId, addressId) ) create table Address ( addressId bigint not null primary key ) ]]></programlisting> @@ -319,8 +311,7 @@ </class>]]></programlisting> <programlisting><![CDATA[ -create table Person ( personId bigint not null primary key, - addressId bigint not null ) +create table Person ( personId bigint not null primary key, addressId bigint not null ) create table Address ( addressId bigint not null primary key ) ]]></programlisting> @@ -386,8 +377,7 @@ property-ref="address"/> </class>]]></programlisting> <programlisting><![CDATA[ -create table Person ( personId bigint not null primary key, - addressId bigint not null unique ) +create table Person ( personId bigint not null primary key, addressId bigint not null unique ) create table Address ( addressId bigint not null primary key ) ]]></programlisting> @@ -459,8 +449,7 @@ </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 PersonAddress ( personId bigint not null, addressId bigint not null primary key ) create table Address ( addressId bigint not null primary key ) ]]></programlisting> @@ -505,8 +494,7 @@ </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 PersonAddress ( personId bigint not null primary key, addressId bigint not null unique ) create table Address ( addressId bigint not null primary key ) ]]></programlisting> @@ -543,9 +531,7 @@ <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 PersonAddress ( personId bigint not null, addressId bigint not null, primary key (personId, addressId) ) create table Address ( addressId bigint not null primary key ) ]]></programlisting> Modified: trunk/Hibernate3/doc/reference/ko/modules/basic_mapping.xml =================================================================== --- trunk/Hibernate3/doc/reference/ko/modules/basic_mapping.xml 2006-08-03 09:00:25 UTC (rev 10197) +++ trunk/Hibernate3/doc/reference/ko/modules/basic_mapping.xml 2006-08-03 14:01:28 UTC (rev 10198) @@ -92,7 +92,7 @@ - <sect2 id="mapping-declaration-doctype" revision="2"> + <sect2 id="mapping-declaration-doctype" revision="3"> <title>Doctype</title> <para> @@ -102,6 +102,56 @@ 당신이 인터넷 연결을 사용하는 DTD에 대한 룩업들을 겪게 될 경우, 당신의 classpath의 컨텐츠에 대해 당신의 DTD 선언을 체크하라. </para> + + <sect3 id="mapping-declaration-entity-resolution"> + <title>EntityResolver</title> + <para> + 앞서 언급했듯이, Hibernate는 먼저 그것의 classpath에서 DTD들을 해석하려고 시도할 것이다. + Hibernate가 이것을 행하는 방법은 그것이 xml 파일들을 읽어들이는데 사용하는 SAXReader에 맞춤형 + <literal>org.xml.sax.EntityResolver</literal> 구현을 등록하는 것이다. 이 맞춤형 + <literal>EntityResolver</literal>는 두 개의 다른 systemId namespace들을 인지해낸다. + </para> + <itemizedlist> + <listitem> + <para> + <literal>hibernate namespace</literal>는 resolver가 + <literal>http://hibernate.sourceforge.net/</literal>로 시작하는 하나의 + systemId와 만날때마다 인지된다; resolver는 Hibernate 클래스들을 로드시켰던 클래스로더를 통해 + 이들 엔티티들을 해석하려고 시도한다. + </para> + </listitem> + <listitem> + <para> + <literal>user namespace</literal>는 resolver가 <literal>classpath://</literal> + URL 프로토콜을 사용하는 systemId를 만날때마다 인지된다; resolver는 (1)현재 쓰레드 컨텍스트 + 클래스로더와 (2)Hibernate 클래스들을 로드시켰던 클래스로더를 통해 이들 엔티티들을 해석하려고 + 시도할 것이다. + </para> + </listitem> + </itemizedlist> + <para> + user namespacing을 활용하는 예제: + </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"> @@ -692,6 +742,17 @@ </para> </listitem> </varlistentry> + <varlistentry> + <term><literal>sequence-identity</literal></term> + <listitem> + <para> + 실제 값 생성을 위해 데이터베이스 시퀀스를 활용하지만, 생성된 식별자 값을 insert 문장 실행의 부분으로서 + 실제로 반환시키기 위해 이것을 JDBC3 getGeneratedKeys와 결합시킨 특화된 시퀀스 생성 방도. 이 방도는 + JDK 1.4에 대상화된 Oracle 10g 드라이버들 상에서만 지원되는 거승로 알려져 있다. 이들 insert 문장들에 + 대한 주석들은 Oracle 드라이버들 내에 있는 버그 때문에 사용불가능하게 되어 있음을 노트하라. + </para> + </listitem> + </varlistentry> </variablelist> </para> @@ -1082,7 +1143,7 @@ </para> </sect2> - <sect2 id="mapping-declaration-timestamp" revision="3" > + <sect2 id="mapping-declaration-timestamp" revision="4" > <title>timestamp (옵션)</title> <para> @@ -1090,7 +1151,7 @@ 버전화에 대한 대체물로서 고안되었다. Timestamp은 고유하게 optimistic 잠금에 대한 다소 안전한 구현이다. 하지만 때때로 어플리케이션은 다른 방법들로 timestamp들을 사용할 수도 있다. </para> - + <programlistingco> <areaspec> <area id="timestamp1" coords="2 70"/> @@ -1123,7 +1184,7 @@ 가진 자바빈즈 스타일의 프로퍼티 이름. </para> </callout> - <callout arearefs="timestamp3"> + <callout arearefs="timestamp3"> <para> <literal>access</literal> (옵션 - 디폴트는 <literal>property</literal>): Hibernate가 프로퍼티 값에 접근하는데 사용할 방도. @@ -1140,18 +1201,18 @@ <callout arearefs="timestamp5"> <para> <literal>source</literal> (옵션 - 디폴트는 <literal>vm</literal>): - Hibernate는 어느 장소로부터 timestamp 값을 검색할 것인가? 데이터베이스로부터인가 현재의 JVM으로부터인가? - Hibernate가 "다음 값"을 결정하기 위해 데이터베이스에 접속해야 하기 때문에 데이터베이스 기반의 - timestamp들은 오버헤드를 초래하지만, 클러스터링된 환경들의 용도로 더 안전할 것이다. 또한 모든 + Hibernate는 어디서 timestamp 값을 검색할 것인가? 데이터베이스로부터인가 현재의 JVM으로부터인가? + 데이터베이스 기반의 timestamp들은 Hibernate가 "다음 값"을 결정하기 위해 데이터베이스에 접속해야 + 하기 때문에 오버헤드를 초래하지만, 클러스터링된 환경들에서의 용도로 보다 더 안전할 것이다. 또한 모든 <literal>Dialect</literal>들이 데이터베이스의 현재의 timestamp에 대한 검색을 지원하는 것으로 알려져 - 있는 반면에, 다른 <literal>Dialect</literal>들은 정밀도 결핍 때문에 잠금에 있어 사용에 대해 안전하지 않을 + 있지 않지만, 다른 <literal>Dialect</literal>들은 정밀도 결핍 때문에 잠금에 있어 사용이 안전하지 않을 수 있음을 노트하라(예를 들면 오라클 8). </para> </callout> <callout arearefs="timestamp6"> <para> <literal>generated</literal> (옵션 - 디폴트는 <literal>never</literal>): - 이 timestamp 프로퍼티 값이 데이터베이스에 의해 실제로 산출되는지를 지정한다. + 이 timestamp 프로퍼티 값이 데이터베이스에 의해 실제로 생성됨을 지정한다. <xref linkend="mapping-generated">산출되는 프로퍼티들</xref>에 대한 논의들 보라. </para> </callout> Modified: trunk/Hibernate3/doc/reference/ko/modules/batch.xml =================================================================== --- trunk/Hibernate3/doc/reference/ko/modules/batch.xml 2006-08-03 09:00:25 UTC (rev 10197) +++ trunk/Hibernate3/doc/reference/ko/modules/batch.xml 2006-08-03 14:01:28 UTC (rev 10198) @@ -28,8 +28,6 @@ <para> 당신은 또한 second-level 캐시를 가진 상호작용이 완전하게 불가능한 프로세스 내에서 이런 종류의 작업을 행하고 싶어할 수도 있다: - You also might like to do this kind of work in a process where interaction with - the second-level cache is completely disabled: </para> <programlisting><![CDATA[hibernate.cache.use_second_level_cache false]]></programlisting> @@ -94,7 +92,6 @@ session.close();]]></programlisting> </sect1> - <sect1 id="batch-statelesssession"> <title>StatelessSession 인터페이스</title> @@ -140,7 +137,7 @@ </sect1> - <sect1 id="batch-direct" revision="2"> + <sect1 id="batch-direct" revision="3"> <title>DML-스타일 연산들</title> <para> @@ -151,9 +148,9 @@ (<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> + <literal>UPDATE</literal>와 <literal>DELETE</literal> 문장들에 대한 유사 구문은 다음과 같다: + <literal>( UPDATE | DELETE ) FROM? EntityName (WHERE where_conditions)?</literal>. 노트할 몇 가지: </para> <itemizedlist spacing="compact"> @@ -201,10 +198,34 @@ session.close();]]></programlisting> <para> - 한 개의 HQL <literal>DELETE</literal>를 실행하기 위해, 동일한 <literal>Query.executeUpdate()</literal> 메소드를 + HQL <literal>UPDATE</literal> 문장들은 디폴트로 영향받는 엔티티들에 대한 + <xref linkend="mapping-declaration-version">version</xref> 또는 + <xref linkend="mapping-declaration-timestamp">timestamp</xref> 프로퍼티 값들에 영향을 주지 않는다; + 이것은 EJB3 명세서에서 유지되고 있다. 하지만 당신은 하이버네이트로 하여금 <literal>versioned update</literal>의 + 사용을 통해 <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> + 맞춤형 version 타입들(<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(); Modified: trunk/Hibernate3/doc/reference/ko/modules/collection_mapping.xml =================================================================== --- trunk/Hibernate3/doc/reference/ko/modules/collection_mapping.xml 2006-08-03 09:00:25 UTC (rev 10197) +++ trunk/Hibernate3/doc/reference/ko/modules/collection_mapping.xml 2006-08-03 14:01:28 UTC (rev 10198) @@ -107,7 +107,7 @@ schema="schema_name" lazy="true|extra|false" inverse="true|false" - cascade="all|none|save-update|delete|all-delete-orphan" + 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" Modified: trunk/Hibernate3/doc/reference/ko/modules/component_mapping.xml =================================================================== --- trunk/Hibernate3/doc/reference/ko/modules/component_mapping.xml 2006-08-03 09:00:25 UTC (rev 10197) +++ trunk/Hibernate3/doc/reference/ko/modules/component_mapping.xml 2006-08-03 14:01:28 UTC (rev 10198) @@ -184,8 +184,7 @@ <property name="purchaseDate"/> <property name="price"/> <property name="quantity"/> - <many-to-one name="item" class="eg.Item"/> - <!-- class attribute is optional --> + <many-to-one name="item" class="eg.Item"/> <!-- class attribute is optional --> </composite-element> </set> </class>]]></programlisting> Modified: trunk/Hibernate3/doc/reference/ko/modules/configuration.xml =================================================================== --- trunk/Hibernate3/doc/reference/ko/modules/configuration.xml 2006-08-03 09:00:25 UTC (rev 10197) +++ trunk/Hibernate3/doc/reference/ko/modules/configuration.xml 2006-08-03 14:01:28 UTC (rev 10198) @@ -653,9 +653,16 @@ 선택할 것이다. <para> <emphasis role="strong">eg.</emphasis> - <literal>on_close</literal> (디폴트) | <literal>after_transaction</literal> | - <literal>after_statement</literal> | <literal>auto</literal> + <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> Modified: trunk/Hibernate3/doc/reference/ko/modules/events.xml =================================================================== --- trunk/Hibernate3/doc/reference/ko/modules/events.xml 2006-08-03 09:00:25 UTC (rev 10197) +++ trunk/Hibernate3/doc/reference/ko/modules/events.xml 2006-08-03 14:01:28 UTC (rev 10198) @@ -109,6 +109,12 @@ 세션이 생성될 때 인터셉터가 지정될 것이다. </para> + <para> + <literal>Session</literal>-영역의 인터셉터는 <literal>Interceptor</literal>를 수용하는 + 하나의 세션이 오버로드된 SessionFactory.openSession() 메소드들 중 하나를 사용하여 열릴 때 + 지정된다. + </para> + <programlisting><![CDATA[Session session = sf.openSession( new AuditInterceptor() );]]></programlisting> <para> Modified: trunk/Hibernate3/doc/reference/ko/modules/example_mappings.xml =================================================================== --- trunk/Hibernate3/doc/reference/ko/modules/example_mappings.xml 2006-08-03 09:00:25 UTC (rev 10197) +++ trunk/Hibernate3/doc/reference/ko/modules/example_mappings.xml 2006-08-03 14:01:28 UTC (rev 10198) @@ -538,7 +538,7 @@ </class> ]]></programlisting> </sect2> - + <sect2 id="example-mappings-content-discrimination"> <title>내용 기반 판별</title> <programlisting><![CDATA[<class name="Person" Modified: trunk/Hibernate3/doc/reference/ko/modules/inheritance_mapping.xml =================================================================== --- trunk/Hibernate3/doc/reference/ko/modules/inheritance_mapping.xml 2006-08-03 09:00:25 UTC (rev 10197) +++ trunk/Hibernate3/doc/reference/ko/modules/inheritance_mapping.xml 2006-08-03 14:01:28 UTC (rev 10198) @@ -63,6 +63,7 @@ </subclass> </hibernate-mapping>]]></programlisting> + <sect2 id="inheritance-tableperclass" > <title>Table per class hierarchy</title> Modified: trunk/Hibernate3/doc/reference/ko/modules/performance.xml =================================================================== --- trunk/Hibernate3/doc/reference/ko/modules/performance.xml 2006-08-03 09:00:25 UTC (rev 10197) +++ trunk/Hibernate3/doc/reference/ko/modules/performance.xml 2006-08-03 14:01:28 UTC (rev 10198) @@ -576,11 +576,24 @@ 만료되도록 구성되어 있을지라도) 또 다른 어플리케이션에 의해 영속 저장소에 대해 행해진 변경들을 결코 알지 못한다. </para> - <para> + <para revision="1"> 디폴트로, Hibernate는 JVM-레벨의 캐싱에 EHCache를 사용한다. (JCS 지원은 이제 진부하게 되었고 Hibernate의 장래 버전에서 제거될 것이다.) 당신은 <literal>hibernate.cache.provider_class</literal> 프로퍼티를 사용하여 <literal>org.hibernate.cache.CacheProvider</literal>를 구현하는 클래스의 이름을 지정함으로써 다른 구현을 선택할 수도 있다. + You have the option to tell Hibernate which caching implementation to use by + specifying the name of a class that implements <literal>org.hibernate.cache.CacheProvider</literal> + using the property <literal>hibernate.cache.provider_class</literal>. Hibernate + comes bundled with a number of built-in integrations with open-source cache providers + (listed below); additionally, you could implement your own and plug it in as + outlined above. Note that versions prior to 3.2 defaulted to use EhCache as the + default cache provider; that is no longer the case as of 3.2. + 당신은 <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"> Modified: trunk/Hibernate3/doc/reference/ko/modules/persistent_classes.xml =================================================================== --- trunk/Hibernate3/doc/reference/ko/modules/persistent_classes.xml 2006-08-03 09:00:25 UTC (rev 10197) +++ trunk/Hibernate3/doc/reference/ko/modules/persistent_classes.xml 2006-08-03 14:01:28 UTC (rev 10198) @@ -104,6 +104,7 @@ 준수할 네 개의 주요 규칙들이 다음에 있다: </para> + <sect2 id="persistent-classes-pojo-constructor" revision="1"> <title>아규먼트 없는 생성자를 구현하라 </title> @@ -228,7 +229,8 @@ <title><literal>equals()</literal>와 <literal>hashCode()</literal> 구현하기</title> <para> - 만일 당신이 + 만일 당신이 다음의 경우라면, 당신은 <literal>equals()</literal>와 <literal>hashCode()</literal> + 메소드들을 오버라이드 시켜야 한다. </para> <itemizedlist spacing="compact"> <listitem> @@ -244,11 +246,8 @@ </para> </listitem> </itemizedlist> + <para> - 경우에 당신은 <literal>equals()</literal>와 <literal>hashCode()</literal> 메소드들을 오버라이드 시켜야 한다. - </para> - - <para> Hibernate는 특정 session 범위 내에서만 persistent identity(데이터베이스 행)과 Java identity의 같음을 보장한다. 따라서 우리가 다른 세션들에서 검색된 인스턴스들을 혼합시키자마자, 우리가 <literal>Set</literal>들에 대해 유의미하게 만들고자 원할 경우, 우리는 <literal>equals()</literal>와 <literal>hashCode()</literal>를 구현해야 한다. @@ -432,7 +431,7 @@ </sect1> - <sect1 id="persistent-classes-tuplizers" revision="0"> + <sect1 id="persistent-classes-tuplizers" revision="1"> <title>Tuplizer들</title> <para> @@ -442,8 +441,8 @@ 그런 데이터 구조로부터 값들을 추출시키는 방법 그리고 그런 데이터구조 속으로 값들을 삽입시키는 방법을 알고 있는 것이다. 예를 들어, POJO 엔티티 모드의 경우, 대응하는 tuplizer는 그것의 생성자를 통해 POJO를 생성시키는 방법, 그리고 정의된 프로퍼티 접근자들을 사용하여 POJO 프로퍼티들에 접근하는 방법을 안다. - <literal>org.hibernate.tuple.EntityTuplizer</literal> 인터페이스와 - <literal>org.hibernate.tuple.ComponentTuplizer</literal> 인터페이스에 의해 표현되는 두 가지 고급 유형의 + <literal>org.hibernate.tuple.entity.EntityTuplizer</literal> 인터페이스와 + <literal>org.hibernate.tuple.component.ComponentTuplizer</literal> 인터페이스에 의해 표현되는 두 가지 고급 유형의 Tuplizer들이 존재한다. <literal>EntityTuplizer</literal>들은 엔티티들에 관해서는 위에 언급된 계약들을 매핑할 책임이 있는 반면에, <literal>ComponentTuplizer</literal>들은 컴포넌트들에 대해서도 동일한 것을 행한다. </para> @@ -476,7 +475,7 @@ public class CustomMapTuplizerImpl - extends org.hibernate.tuple.DynamicMapEntityTuplizer { + 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) { Modified: trunk/Hibernate3/doc/reference/ko/modules/query_criteria.xml =================================================================== --- trunk/Hibernate3/doc/reference/ko/modules/query_criteria.xml 2006-08-03 09:00:25 UTC (rev 10197) +++ trunk/Hibernate3/doc/reference/ko/modules/query_criteria.xml 2006-08-03 14:01:28 UTC (rev 10198) @@ -364,7 +364,6 @@ </sect1> - <!--TODO: ResultSetTransformer + aliasing. AliasToBeanTransformer는 -JDO2에서 setResultClass와 유사한- 임의적인 사용자 객체들을 반환하는 것을 허용한다. ResultTransformer에 대한 일반적인 사용이 또한 설명될 수 있다. --> Modified: trunk/Hibernate3/doc/reference/ko/modules/query_hql.xml =================================================================== --- trunk/Hibernate3/doc/reference/ko/modules/query_hql.xml 2006-08-03 09:00:25 UTC (rev 10197) +++ trunk/Hibernate3/doc/reference/ko/modules/query_hql.xml 2006-08-03 14:01:28 UTC (rev 10198) @@ -1,5 +1,5 @@ <chapter id="queryhql"> - <title>HQL: Hibernate Query Language</title> + <title>HQL: 하이버네이트 질의 언어(Hibernate Query Language)</title> <para> Hibernate는 (아주 의도적으로) SQL과 매우 흡사하게 보이는 극히 강력한 질의 언어를 구비하고 있다. 그러나 그 구문에 의해 우롱당하지 말라; @@ -126,7 +126,7 @@ <programlisting><![CDATA[from Cat as cat left join cat.kittens as kitten with kitten.bodyWeight > 10.0]]></programlisting> - + <para> 게다가, "fetch" join은 값들을 가진 콜렉션들이나 연관관계들이 한 개의 select를 사용하여, 그것들의 부모 객체들에 따라 초기화 되는 것을 허용해준다. 이것은 콜렉션의 경우에 특히 유용하다. 그것은 연관관계들과 콜렉션들에 대한 매핑 파일의 outer join과 lazy 선언들을 @@ -147,7 +147,7 @@ inner join fetch cat.mate left join fetch cat.kittens child left join fetch child.kittens]]></programlisting> - + <para> (비록 <literal>scroll()</literal>이 사용될 수 있을지라도) <literal>fetch</literal> 구조체는 <literal>iterate()</literal>를 사용하여 호출되는 질의들 내에 사용될 수 없음을 노트하라. 이들 오퍼레이션들이 결과 행들에 @@ -167,9 +167,9 @@ <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> @@ -566,39 +566,27 @@ </listitem> <listitem> <para> - 조인된 인덱싱된 콜렉션의 alias들에 적용되는, HQL <literal>index()</literal> 함수 - </para> - </listitem> - <listitem> - <para> - 콜렉션 값을 가진 경로 표현식들을 취하는 HQL 함수들 : <literal>some, all, exists, any, in</literal>을 - 사용하여 정량화 될 수 있는 특별한 <literal>elements()</literal>와 <literal>indices</literal> - 함수들과 함께 <literal>size(), minelement(), maxelement(), minindex(), maxindex()</literal>. - </para> - </listitem> - <listitem> - <para> <literal>cast(... as ...)</literal>, 여기서 두번 째 아규먼트는 Hibernate 타입의 이름이고, - ANSI <literal>cast()</literal>와 <literal>extract()</literal>가 기본 데이터베이스에 의해 지원될 경우에는 - <literal>extract(... from ...)</literal> + ANSI <literal>cast()</literal>와 <literal>extract()</literal>가 기반 데이터베이스에 의해 + 지원될 경우에는 <literal>extract(... from ...)</literal>. </para> </listitem> <listitem> <para> - 조인된 인덱싱된 콜렉션의 alias들을 적용하는 HQL <literal>index()</literal> 함수 + 조인된 인덱싱된 콜렉션의 alias들에 적용되는, HQL <literal>index()</literal> 함수 </para> </listitem> <listitem> <para> - 콜렉션 값 경로 표현식들을 취하는 HQL 함수들: <literal>some, all, exists, any, in</literal>을 사용하여 - 양이 한정될 수 있는 특별한 <literal>elements()</literal> 및 <literal>indices</literal> 함수들과 함께 - <literal>size(), minelement(), maxelement(), minindex(), maxindex()</literal> 함수들. + 콜렉션 값을 가진 경로 표현식들을 취하는 HQL 함수들 : <literal>some, all, exists, any, in</literal>을 + 사용하여 정량화 될 수 있는 특별한 <literal>elements()</literal>와 <literal>indices</literal> + 함수들과 함께 <literal>size(), minelement(), maxelement(), minindex(), maxindex()</literal>. </para> </listitem> <listitem> <para> <literal>sign()</literal>, <literal>trunc()</literal>, <literal>rtrim()</literal>, - <literal>sin()</literal>과 같이 임의의 데이터베이스-지원 SQL 스칼라 함수 + <literal>sin()</literal>과 같이 임의의 데이터베이스 지원 SQL 스칼라 함수 </para> </listitem> <listitem> @@ -867,6 +855,10 @@ <para> select 리스트 내에 있는 하나 이상의 표현식을 가진 서브질의들의 경우에 당신은 tuple 생성자를 사용할 수 있다: </para> + + <para> + select 목록 내에 하나 이상의 표현식을 가진 서브질의들의 경우, 당신은 튜플(tuple) 구조를 사용할 수 있다: + </para> <programlisting><![CDATA[from Cat as cat where not ( cat.name, cat.color ) in ( Modified: trunk/Hibernate3/doc/reference/ko/modules/query_sql.xml =================================================================== --- trunk/Hibernate3/doc/reference/ko/modules/query_sql.xml 2006-08-03 09:00:25 UTC (rev 10197) +++ trunk/Hibernate3/doc/reference/ko/modules/query_sql.xml 2006-08-03 14:01:28 UTC (rev 10198) @@ -1,216 +1,366 @@ <?xml version="1.0" encoding="UTF-8"?> <chapter id="querysql" revision="2"> - <title>Native SQL</title> + <title>Native SQL</title> - <para> - 당신은 또한 당신의 데이터베이스의 native SQL dialect로 질의들을 표현할 수도 있다. 당신이 오라클의 질의 힌트들 또는 - <literal>CONNECT</literal> 키워드와 같은 데이터베이스 지정적인 특징들을 활용하고자 원할 경우에 이것이 유용하다. - 그것은 또한 직접적인 SQL/JDBC 기반의 어플리케이션으로부터 Hibernate로의 보다 명료한 이전 경로를 제공한다. - </para> + <para>당신은 또한 당신의 데이터베이스의 native SQL dialect로 질의들을 표현할 수도 있다. + 당신이 오라클의 질의 힌트들 또는 <literal>CONNECT</literal> 키워드와 같은 + 데이터베이스 지정적인 특징들을 활용하고자 원할 경우에 이것이 유용하다. + 그것은 또한 직접적인 SQL/JDBC 기반의 어플리케이션으로부터 Hibernate로의 보다 명료한 + 이전 경로를 제공한다.</para> - <para> - Hibernate3은 또한 모든 create, update, delete, load 오퍼레이션들에 대해 (내장 프로시저들을 포함하여) 손으로 작성된 SQL을 - 지정하는 것을 당신에게 허용해준다. - </para> + <para>Hibernate3은 또한 모든 create, update, delete, load 오퍼레이션들에 대해 + (내장 프로시저들을 포함하여) 손으로 작성된 SQL을 지정하는 것을 당신에게 허용해준다.</para> - <sect1 id="querysql-creating" revision="3"> - <title><literal>SQLQuery</literal> 사용하기</title> + <sect1 id="querysql-creating" revision="4"> + <title><literal>SQLQuery</literal> 사용하기</title> - <para> - native SQL 질의들의 실행은 <literal>SQLQuery</literal> 인터페이스를 통해 제어되며, 그것은 - <literal>Session.createSQLQuery()</literal>을 호출하여 획득된다. 극히 간단한 경우들에서 , - 우리는 다음 형식을 사용할 수 있다: - </para> + <para>native SQL 질의들의 실행은 <literal>SQLQuery</literal> 인터페이스를 통해 + 제어되며, 그것은 <literal>Session.createSQLQuery()</literal>을 호출하여 + 획득된다. 다음은 이 API를 질의에 사용하는 방법을 설명한다.</para> - <programlisting><![CDATA[List cats = sess.createSQLQuery("select * from cats") - .addEntity(Cat.class) - .list();]]></programlisting> - - <para>이 질의는 다음을 지정했다:</para> + <sect2> + <title>스칼라 질의들</title> - <itemizedlist> + <para>가장 기본적인 SQL 질의는 스칼라들(값들)의 목록을 얻는 + 것이다.</para> + + <programlisting><![CDATA[sess.createSQLQuery("SELECT * FROM CATS").list(); +sess.createSQLQuery("SELECT ID, NAME, BIRTHDATE FROM CATS").list(); +]]></programlisting> + + <para>이것들은 둘다 CATS 테이블 내에 있는 각각의 컬럼에 대한 스칼라 값들을 가진 Object + 배열들의 List를 반환할 것이다. 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> + <para>SQL 질의 문자열</para> </listitem> + <listitem> - <para> - 그 질의에 의해 반환되는 엔티티 - </para> + <para>반환할 컬럼들과 타입들</para> </listitem> - </itemizedlist> + </itemizedlist> - <para> - 여기서, 결과 셋 컬럼 이름들은 매핑 문서 내에 지정된 컬럼 이름들과 동일한 것으로 가정된다. 이것은 조인 다중 테이블들을 가진 - SQL 질의들에 대해 문제가 될 수 있다. 왜냐하면 동일한 컬럼 이름들이 하나 이상의 테이블 들 내에 나타날 수도 있기 때문이다. - 다음 형식은 컬럼 이름 중복에 대해 취약하지 않다: - </para> + <para>이것은 여전히 Object 배열들을 반환할 것이지만, 이제 그것은 + <literal>ResultSetMetdata</literal>를 사용하지 않을 것이고 대신에 + 기반 결과셋으로부터 ID, NAME 그리고 BIRTHDATE 컬럼을 각각 Long, String + 그리고 Short 타입으로 반환할 것이다. 심지어 그 질의가 <literal>*</literal>를 + 사용하고 세 개의 열거된 컬럼들 보다 더 많은 것을 반환할 수 있을지라도, 이것은 + 또한 오직 이들 세 개의 컬럼들 만이 반환될 것임을 의미한다.</para> - <programlisting><![CDATA[List cats = sess.createSQLQuery("select {cat.*} from cats cat") - .addEntity("cat", Cat.class) - .list();]]></programlisting> + <para>스칼라들 중 몇몇 또는 전부에 대한 타입 정보를 남겨두는 것이 가능하다.</para> + <programlisting><![CDATA[sess.createSQLQuery("SELECT * FROM CATS") + .addScalar("ID", Hibernate.LONG) + .addScalar("NAME") + .addScalar("BIRTHDATE") +]]></programlisting> + + <para>이것은 본질적으로 앞의 것과 동일한 질의이지만, 이제 + <literal>ResultSetMetaData</literal>는 ID의 타입이 명시적으로 지정되어 있으므로 + NAME과 BIRTHDATE의 타입을 결정하는데 사용된다.</para> + + <para>java.sql.Types returned from ResultSetMetaData이 Hibernate + 타입들로 매핑되는 방법은 Dialect에 의해 제어된다. 만일 특정 타입이 매핑되지 않거나 + 예상되는 타입으로 귀결되지 않을 경우에 Dialect 내에 있는 + <literal>registerHibernateType</literal>에 대한 호출들을 통해 그것을 + 맞춤화 시키는 것이 가능하다.</para> + </sect2> + + <sect2> + <title>Entity 질의들</title> + + <para>위의 질의들은 스칼라 값들을 반환하는 것, 결과셋들로부터 "원래의" 값들을 + 기본적으로 반환하는 것에 대한 전부였다. 다음은 <literal>addEntity()</literal>를 + 통해 native sql 질의로부터 엔티티 객체들을 얻는 방법을 보여준다.</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> - Hibernate가 컬럼 alias들을 도입하기 위한, placeholder를 가진, SQL 질의 문자열 - </para> + <para>SQL 질의 문자열</para> </listitem> + <listitem> - <para> - 그 질의에 의해 반환된 엔티티와 그것의 SQL 테이블 alias - </para> + <para>그 질의에 의해 반환되는 엔티티</para> </listitem> - </itemizedlist> - - <para> - <literal>addEntity()</literal> 메소드는 SQL 테이블 alias를 반환된 엔티티 클래스와 연관지우고, - 질의 결과 셋의 형태를 결정한다. - </para> - - <para> - <literal>addJoin()</literal> 메소드는 다른 엔티티들과 콜렉션들에 대한 연관들을 로드시키는데 사용될 수 있다. - </para> - - <programlisting><![CDATA[List cats = sess.createSQLQuery( - "select {cat.*}, {kitten.*} from cats cat, cats kitten where kitten.mother = cat.id" - ) - .addEntity("cat", Cat.class) - .addJoin("kitten", "cat.kittens") - .list();]]></programlisting> - - <para> - native SQL 질의는 간단한 스칼라 값을 반환하거나 스칼라들과 엔티티들의 조합을 반환할 수도 있다. - </para> + </itemizedlist> - <programlisting><![CDATA[Double max = (Double) sess.createSQLQuery("select max(cat.weight) as maxWeight from cats cat") - .addScalar("maxWeight", Hibernate.DOUBLE); - .uniqueResult();]]></programlisting> - - <para>당신은 당신의 hbm 파일들 내에 결과셋 매핑 정보를 대안저긍로 설명활 수 있고 당신의 질의들을 위해 그것들을 - 사용할 수 있다.</para> + <para>Cat이 컬럼 ID, NAME 그리고 BIRTHDATE로서 매핑된다고 가정하면, + 위의 질의들은 둘다 각각의 요소가 하나의 Cat 엔티티인 하나의 List를 반환할 것이다.</para> - <programlisting><![CDATA[List cats = sess.createSQLQuery( - "select {cat.*}, {kitten.*} from cats cat, cats kitten where kitten.mother = cat.id" - ) - .setResultSetMapping("catAndKitten") - .list();]]></programlisting> + <para>만일 그 엔티티가 또 다른 엔티티에 대해 <literal>many-to-one</literal>로 + 매핑되어 있다면 또한 native 질의를 실행할 때 이것을 반환하는 것이 필수적고, 그 밖의 경우 + 데이터베이스 지정적인 "컬럼이 발견되지 않았습니다" 오류가 일어날 것이다. 추가적인 + 컬럼은 * 표기를 사용할 자동적으로 반환될 것이지만, 우리는 다음 <literal>Dog</literal>에 + 대한 <literal>many-to-one</literal> 예제에서처럼 명시적인 것을 더 선호한다:</para> - </sect1> + <programlisting><![CDATA[sess.createSQLQuery("SELECT ID, NAME, BIRTHDATE, DOG_ID FROM CATS").addEntity(Cat.class); +]]></programlisting> - <sect1 id="querysql-aliasreferences"> - <title>Alias 참조와 프로퍼티 참조</title> + <para>이것은 cat.getDog()이 고유하게 기능하는 것을 허용한다.</para> + <sect2> - <para> - 위에서 사용된 <literal>{cat.*}</literal> 표기는 "모든 프로퍼티"에 대한 약어이다. 다른 방법으로, 당신은 명시적으로 컬럼들을 - 리스트할 수 있지만, 심지어 이 경우 조차도 우리는 Hibernate로 하여금 각각의 프로퍼티에 대해 SQL 컬럼 alias들을 끼워넣도록 해야 한다. - 컬럼 alias에 대한 placeholder는 테이블 alias 수식어가 붙은 프로퍼티 이름이다. 다음 예제에서, 우리는 매핑 메타데이터에 선언된 - 것에 대해 다른 테이블 (<literal>cat_log</literal>)로부터 <literal>Cat</literal>들을 검색한다. 우리는 심지어 우리가 - 좋아할 경우 where 절 속에 프로퍼티 alias들을 사용할 수도 있음을 주목하라. - </para> - <para> - The <literal>{}</literal>-syntax is <emphasis>not</emphasis> required for named queries. - See <xref linkend="querysql-namedqueries"/> - </para> - - <programlisting><![CDATA[String sql = "select cat.originalId as {cat.id}, " + - "cat.mateid as {cat.mate}, cat.sex as {cat.sex}, " + - "cat.weight*10 as {cat.weight}, cat.name as {cat.name} " + - "from cat_log cat where {cat.mate} = :catId" + <sect2> + <title>연관들과 콜렉션들을 처리하기</title> + <para>프락시를 초기화 시킴에 있어 가능한 특별한 라운드트립을 피하기 위해서 + <literal>Dog</literal>에서 eagerly join시키는 것이 간으하다. 이것은 + <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> + 프로퍼티를 갖는다. 우리가 join의 대상 프로퍼티 경로를 지정하는 것을 가능하도록 하기 위해 + 하나의 alias 이름("cat")을 추가했음을 주지하라. 대신에 예를 들어 <literal>Cat</literal>이 + <literal>Dog</literal>에 대해 one-to-many를 가질 경우, 콜렉션들에 대해 동일한 eager joining을 + 행하는 것이 가능하다.</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>이 단계에서 우리는 Hibernate에서 native 질의들을 사용가능하도록 만들기 위해 + sql 질의들을 강화시키지는 것을 시작하지 않고서도 native 질의들로서 가능한 것의 한계에 + 도달하고 있다; 문제점들은 동일한 타입의 여러 엔티티들을 반환할 때 또는 디폴트 alias/column + 이름들이 충분하지 않을 때 발생하기 시작한다.</p> + </sect2> + + <sect2> + <title>여러 개의 엔티티들을 반환하기</title> + + <para>지금까지 결과 셋 컬럼 이름들은 매핑 문서 내에 지정된 컬럼 이름들과 동일하다고 가정되어 있다. + 동일한 컬럼이 하나 이상의 테이블 내에서 나타날 수 있기 때문에, 이것은 여러 개의 테이블들을 조인시키는 + SQL 질의들에 대해 문제가 될 수 있다.</para> + + <para>컬럼 alias 주입은 다음 질의(아마 실패할 것이다)에서 필요하다:</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 그리고 그것의 mother를 + 반환하는 것이다. 왜냐하면 그것들이 동일한 컬럼 이름들로 매핑되어 있기 때문에 이것은 실패할 것이고 + 데이베이스 상에서 반환된 컬럼 alias들은 아마 매핑들 내에 지정된 컬럼들("ID" 와 "NAME")과 같지 않은 + "c.ID", "c.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>컬럼 alias들을 주입하기 위한 Hibernate용 placeholder들을 가진 SQL 질의 문자열</para> + </listitem> + + <listitem> + <para>그 질의에 의해 반환되는 엔티티들</para> + </listitem> + </itemizedlist> + + <para>위에 사용된 {cat.*} 과 {mother.*} 표기는 "모든 프로퍼티들"에 대한 생략이다. + 다른 방법으로 당신은 컬럼들을 명시적으로 열거할 수도 있지만, 이 경우에 우리는 Hibernate로 하여금 + SQL 컬럼 alias들을 각각의 컬럼에 주입시키도록 강제한다. 컬럼 alias를 위한 placeholder는 단지 + 그 테이블 alias에 의해 수식된 프로퍼티 이름이다. 다음 예제에서, 우리는 다른 테이블(cat_log)로부터 + 매핑 메타데이터 내에 선언된 것으로의 Cat들과 그것들의 mother들을 검색한다. 우리는 우리가 좋다면 + 심지어 where 절 내에 프로퍼티 alias를 사용할 수도 있음을 주지하라.</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) - .setLong("catId", catId) - .list();]]></programlisting> + .addEntity("cat", Cat.class) + .addEntity("mother", Cat.class).list() +]]></programlisting> + <sect3 id="querysql-aliasreferences" revision="2"> + <title>alias 참조와 프로퍼티 참조</title> + + <para>대부분의 경우에 위의 alias 주입이 필요하지만, composite 프로퍼티들, 상속 판별자들 + (inheritance discriminators), 콜렉션 등과 같은 보다 복잡한 매핑들과 관련된 질의들의 경우에는 + 고유한 alias들을 주입시키는 것을 Hibernate에게 허용하는데 사용될 몇몇 특별한 alias들이 존재한다.</para> + + <para>다음 테이블은 alias 주입을 사용하는 다른 가능성들을 보여준다. 노트: 결과 내에 있는 alias 이름들이 + 예제이며, 각각의 alias는 사용될 때 하나의 유일한 이름과 아마 다른 이름을 가질 것이다.</para> + + <table frame="topbot" id="aliasinjection-summary"> + <title>alias 주입 이름들</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>composite 프로퍼티</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)</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>콜렉션 키</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>non-managed 엔티티들을 반환하기</title> + + <para>native sql 질의에 ResultTransformer를 적용하는 것이 가능하다. 예를 들어 + non-managed 엔티티들을 반환하기 위해 ResultTransformer를 허용하는 것.</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>결과 변환자(transformer)</para> + </listitem> + </itemizedlist> + <para> - <emphasis>노트:</emphasis> 만일 당신이 각각의 프로퍼티를 명시적으로 리스트할 경우, 당신은 그 클래스와 - <emphasis>그것의 서브클래스들</emphasis>의 모든 프로퍼티들을 포함해야 한다! + 위의 질의는 초기화되어 있고 NAME과 BIRTHNAME의 값들을 <literal>CatDTO</literal>의 + 대응하는 프로퍼티들과 필드들 속으로 주입시킨 <literal>CatDTO</literal>의 리스트를 반환할 것이다. </para> - <para> - 다음 테이블은 alias injection을 사용하는 다른 가능성들을 보여준다. 노트 : 결과 내에서 alias 이름들이 예제들이며, 각각의 alias는 - 사용될 시에 하나의 유일한 그리고 가능한 다른 이름을 가질 것이다. - </para> + </sect2> - <table frame="topbot" id="aliasinjection-summary"> - <title>Alias injection 이름들</title> - - <tgroup cols="4"> - <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>composite 프로퍼티</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)</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>콜렉션 키</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> + <sect2> + <title>상속 처리하기</title> + <para>상속의 부분으로서 매핑되는 엔티티들을 질의하는 native sql 질의들은 baseclass의 + 모든 프로퍼티들을 포함해야 하고 그 모든 것이 서브클래스화 되어야 한다.</para> + </sect2> + + <sect2> + <title>파라미터들</title> + + <para>Native sql 질의들은 위치 파라미터들 뿐만 아니라 명명된 파라미터들을 지원한다:</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> @@ -219,7 +369,7 @@ <literal>addEntity()</literal> 호출을 필요로 하지 <emphasis>않는다</emphasis>. </para> - <programlisting><![CDATA[<sql-query name="persons"> + <programlisting><![CDATA[<sql-query name="persons"> <return alias="person" class="eg.Person"/> SELECT person.NAME AS {person.name}, person.AGE AS {person.age}, @@ -228,16 +378,17 @@ WHERE person.NAME LIKE :namePattern </sql-query>]]></programlisting> - <programlisting><![CDATA[List people = sess.getNamedQuery("persons") + <programlisting><![CDATA[List people = sess.getNamedQuery("persons") .setString("namePattern", namePattern) .setMaxResults(50) .list();]]></programlisting> - <para> - The <literal><return-join></literal> 요소와 <literal><load-collection></literal> - 요소는 연관들을 조인시키고 콜렉션들을 각각 초기화 시키는 질의들을 정의하는데 사용된다. - </para> + + <para><literal><return-join></literal> 요소와 + <literal><load-collect... [truncated message content] |