Updated HibernateUtil

git-svn-id: https://svn.jboss.org/repos/hibernate/trunk/Hibernate3/doc@8293 1b8cb986-b30d-0410-93ca-fae66ebed9b2
This commit is contained in:
JongDae Kim 2005-10-02 06:22:36 +00:00
parent b3f771dbb6
commit 03cf32cdec
3 changed files with 17 additions and 15 deletions

View File

@ -1508,14 +1508,14 @@ hibernate.dialect = org.hibernate.dialect.PostgreSQLDialect]]></programlisting>
</sect2> </sect2>
<sect2 id="configuration-j2ee-currentsession" revision="1"> <sect2 id="configuration-j2ee-currentsession" revision="2">
<title>자동적인 JTA 및 Session 바인딩</title> <title>자동적인 JTA 및 Session 바인딩</title>
<para> <para>
관리되지 않는 환경들에서 우리는 static <literal>SessionFactory</literal>가진 <literal>HibernateUtil</literal>, 관리되는 환경들에서 우리는 <literal>SessionFactory</literal>JNDI에 바인드 시키는 것을 권장한다. 트랜잭션과
그리고 Hibernate <literal>Session</literal>에 대한 <literal>ThreadLocal</literal> 관리를 제안했다. 몇몇 EJB들이 <literal>Session</literal> 핸들링을 위해, 당신은 이미 소개된 <literal>HibernateUtil</literal> helper
동일 트랜잭션 내에서 실행되지만 동일 쓰레드 내에서 실행되지 않을 수 있으므로, 이 접근법은 EJB 환경에서 사용하기가 쉽지 않다. 우리는 클래스를 사용할 수 있다. 하지만 EJB들은 동일한 쓰레드에서 실행되지 않을 수도 있는데, 그것은 항상 적절하게
당신이 관리되는 환경에서 <literal>SessionFactory</literal>를 JNDI에 바인드 시키는 것을 권장한다. <literal>ThreadLocal</literal> 핸들링을 행하지 않는다(예를 들면 두 개의 세션이 서로를 호출할 때).
</para> </para>
<para> <para>
@ -1525,7 +1525,10 @@ hibernate.dialect = org.hibernate.dialect.PostgreSQLDialect]]></programlisting>
<literal>hibernate.transaction.flush_before_completion</literal> <literal>hibernate.transaction.flush_before_completion</literal>
<literal>hibernate.transaction.auto_close_session</literal> 구성 옵션 둘 다 당신이 <literal>hibernate.transaction.auto_close_session</literal> 구성 옵션 둘 다 당신이
<literal>getCurrentSession()</literal>으로 검색하는 모든 <literal>Session</literal>에 대해 자동적으로 설정될 <literal>getCurrentSession()</literal>으로 검색하는 모든 <literal>Session</literal>에 대해 자동적으로 설정될
것이고, 따라서 세션들은 또한 컨테이너가 JTA 트랜잭션들을 끝낼 때 자동적으로 flush되고 닫혀질 것이다. 것이고, 따라서 세션들은 또한 컨테이너가 JTA 트랜잭션들을 끝낼 때 자동적으로 flush되고 닫혀질 것이다. 이것은
<literal>ThreadLocal</literal> 관리에 대한 대안이다. 당신이 <emphasis>CaveatEmptor</emphasis> 어플리케이션에서
찾을 수 있는 <literal>HibernateUtil</literal> 클래스는 실제로 두 개의 방도들 사이를 자동적으로 전환할 수 있으므로,
transaction-local, BMT, 그리고 CMT 환경들 사이에서 당신의 코드를 이식가능하게 유지할 수 있다.
</para> </para>
<para> <para>

View File

@ -406,7 +406,7 @@ Indexes: cat_pkey primary key btree (cat_id)]]></programlisting>
</sect1> </sect1>
<sect1 id="quickstart-playingwithcats" revision="2"> <sect1 id="quickstart-playingwithcats" revision="3">
<title>cat들에 작업하기</title> <title>cat들에 작업하기</title>
<para> <para>
@ -461,7 +461,7 @@ public class HibernateUtil {
public static final ThreadLocal session = new ThreadLocal(); public static final ThreadLocal session = new ThreadLocal();
public static Session currentSession() { public static Session getCurrentSession() {
Session s = (Session) session.get(); Session s = (Session) session.get();
// Open a new Session, if this Thread has none yet // Open a new Session, if this Thread has none yet
if (s == null) { if (s == null) {
@ -494,7 +494,7 @@ public class HibernateUtil {
예제는 다음과 같을 수 있다(예외상황 처리 없이): 예제는 다음과 같을 수 있다(예외상황 처리 없이):
</para> </para>
<programlisting><![CDATA[Session session = HibernateUtil.currentSession(); <programlisting><![CDATA[Session session = HibernateUtil.getCurrentSession();
Transaction tx = session.beginTransaction(); Transaction tx = session.beginTransaction();
Cat princess = new Cat(); Cat princess = new Cat();
@ -515,7 +515,7 @@ HibernateUtil.closeSession();]]></programlisting>
</para> </para>
<para> <para>
당신이 원하는 만큼 당신이 <literal>HibernateUtil.currentSession();</literal>을 호출할 수 있고, 당신은 당신이 원하는 만큼 당신이 <literal>HibernateUtil.getCurrentSession();</literal>을 호출할 수 있고, 당신은
이 쓰레드의 현재 <literal>Session</literal>을 항상 얻을 것임을 노트하라. 당신은 서블릿 코드 내에서든 또는 서블릿 필터 이 쓰레드의 현재 <literal>Session</literal>을 항상 얻을 것임을 노트하라. 당신은 서블릿 코드 내에서든 또는 서블릿 필터
내에서든 HTTP response가 전송되기 전에, 당신의 단위 작업이 완료된 후에 <literal>Session</literal>이 확실히 내에서든 HTTP response가 전송되기 전에, 당신의 단위 작업이 완료된 후에 <literal>Session</literal>이 확실히
닫혀지도록 해야 한다. 두 번째 옵션의 좋은 측면은 쉬운 lazy 초기화이다: 뷰가 렌더링 될 때 <literal>Session</literal> 닫혀지도록 해야 한다. 두 번째 옵션의 좋은 측면은 쉬운 lazy 초기화이다: 뷰가 렌더링 될 때 <literal>Session</literal>

View File

@ -48,7 +48,7 @@
그리고 당신은 데이터베이스 트랜잭션 경계들을 어떻게 한정하는가? 그리고 당신은 데이터베이스 트랜잭션 경계들을 어떻게 한정하는가?
</para> </para>
<sect2 id="transactions-basics-uow"> <sect2 id="transactions-basics-uow" revision="1">
<title>작업 단위</title> <title>작업 단위</title>
<para> <para>
@ -77,10 +77,9 @@
우리는 하나의 <literal>ThreadLocal</literal> 변수를 사용하여 그 <literal>Session</literal>을 요청에 서비스하는 우리는 하나의 <literal>ThreadLocal</literal> 변수를 사용하여 그 <literal>Session</literal>을 요청에 서비스하는
쓰레드에 바인드 시킬 것을 권장한다. 이것은 이 쓰레드 내에서 실행되는 모든 코드에서 (static 변수에 접근하는 것처럼) 쉽게 쓰레드에 바인드 시킬 것을 권장한다. 이것은 이 쓰레드 내에서 실행되는 모든 코드에서 (static 변수에 접근하는 것처럼) 쉽게
접근을 허용해준다. 당신이 선택하는 데이터베이스 트랜잭션 경계 구분 메커니즘에 따라, 당신은 또한 <literal>ThreadLocal</literal> 접근을 허용해준다. 당신이 선택하는 데이터베이스 트랜잭션 경계 구분 메커니즘에 따라, 당신은 또한 <literal>ThreadLocal</literal>
변수 내에 트랜잭션 컨텍스트를 유지할 수도 있다. 이것을 위한 구현 패턴들은<emphasis>ThreadLocal Session</emphasis> 변수 내에 트랜잭션 컨텍스트를 유지할 수도 있다. 이를 위한 구현 패턴들은 <emphasis>ThreadLocal Session</emphasis>
<emphasis> 뷰 내의 Open Session</emphasis>으로 알려져 있다. 당신은 이것을 구현하기 위해 이 문서의 앞 쪽에 보였던 <emphasis>Open Session in View</emphasis>으로 알려져 있고 Hibernate Wiki 상에서 찾을 수 있다. 물론 당신은
<literal>HibernateUtil</literal> helper 클래스를 쉽게 확장할 수 있다. 물론 당신은 당신의 환경에서 인터셉터를 구현하고 그것을 하나의 인터셉터를 구현하고 그것을 당신의 환경에 설정하는 방법을 찾아야 한다. 팁들과 예제들은 Hibernate 웹 사이트를 보라.
설정하는 방법을 찾아야 한다. 팁들과 예제들은 Hibernate 웹 사이트를 보라.
</para> </para>
</sect2> </sect2>