📄 quickstart.po
字号:
"--------+-----------------------+-----------\n" " cat_id | character(32) | not null\n" " name | character varying(16) | not null\n" " sex | character(1) |\n" " weight | real |\n" "Indexes: cat_pkey primary key btree (cat_id)]]>"#: index.docbook:270msgid "appended paragraph 46"msgstr "당신은 이제 수작업으로 당신의 데이터베이스 내에 이 테이블을 생성시킬 것이고, 만일 당신이 <literal>hbm2ddl</literal> 도구로 이 단계를 자동화 시키고자 원할 경우 <xref linkend=\"toolsetguide\"/>를 읽어라. 이 도구는 테이블 정의, 맞춤형 컬럼 타입 컨스트레인트들, 유일 컨스트레인트들과 인덱스들을 포함하는, 전체 SQL DDL을 생성시킬 수 있다."#: index.docbook:279msgid "appended paragraph 47"msgstr "cat들에 작업하기"#: index.docbook:281msgid "appended paragraph 48"msgstr "우리는 이제 Hibernate의 <literal>Session</literal>을 시작할 준비가 되어 있다. 그것은 <emphasis>persistence manager</emphasis> (영속 관리자)이고, 우리는 데이터베이스로 <literal>Cat</literal>들을 저장하고 데이터베이스로부터 <literal>Cat</literal>들을 검색하는데 그것을 사용한다. 그러나 먼저 우리는 <literal>SessionFactory</literal>로부터 <literal>Session</literal>(Hibernate의 작업 단위)를 얻어야 한다:"#: index.docbook:288msgid "appended paragraph 49"msgstr "" "<![CDATA[SessionFactory sessionFactory =\n" " new Configuration().configure().buildSessionFactory();]]>"#: index.docbook:290msgid "appended paragraph 50"msgstr "<literal>configure()</literal> 호출은 <literal>hibernate.cfg.xml</literal> 구성 파일을 로드시키고 <literal>Configuration</literal> 인스턴스를 초기화 시킨다. 당신이 SessionFactory(불변적임)를 빌드하기 <emphasis>이전에</emphasis> 당신은 <literal>Configuration</literal>에 접근함으로써 다른 프로퍼티들을 설정할 수 있다(그리고 심지어 매핑 메타데이터를 변경시킬 수 있다). 우리는 어디서 <literal>SessionFactory</literal>를 생성시키고 우리의 어플리케이션 속에서 어떻게 그것에 접근할 수 있나?"#: index.docbook:298msgid "appended paragraph 51"msgstr "<literal>SessionFactory</literal>는 대개 오직 한번만, 예를 들어 대개 <emphasis>load-on-startup</emphasis> 서블릿으로 시작 시에 빌드된다. 이것은 또한 당신이 당신의 서블릿들 내에 있는 인스턴스 변수 속에 그것을 유지하지 않을 것이지만 어떤 다른 위치에 유지시킬 것임을 의미한다. 더구나 우리는 어떤 종류의 <emphasis>Singleton</emphasis>을 필요로 하며, 따라서 우리는 어플리케이션 코드로 쉽게 <literal>SessionFactory</literal>에 액세스 할 수 있다. 다음에 보여진 접근법은 두 문제 모두를 해결한다: 시작 구성과 <literal>SessionFactory</literal>에 대한 쉬운 접근."#: index.docbook:306msgid "appended paragraph 52"msgstr "우리는 <literal>HibernateUtil</literal> helper 클래스를 구현한다:"#: index.docbook:310msgid "appended paragraph 53"msgstr "" "<![CDATA[import org.hibernate.*;\n" "import org.hibernate.cfg.*;\n" "\n" "public class HibernateUtil {\n" "\n" " private static Logger log = LoggerFactory.getLogger(HibernateUtil.class);\n" "\n" " private static final SessionFactory sessionFactory;\n" "\n" " static {\n" " try {\n" " // Create the SessionFactory\n" " sessionFactory = new Configuration().configure().buildSessionFactory();\n" " } catch (Throwable ex) {\n" " // Make sure you log the exception, as it might be swallowed\n" " log.error(\"Initial SessionFactory creation failed.\", ex);\n" " throw new ExceptionInInitializerError(ex);\n" " }\n" " }\n" "\n" " public static final ThreadLocal session = new ThreadLocal();\n" "\n" " public static Session getCurrentSession() {\n" " Session s = (Session) session.get();\n" " // Open a new Session, if this Thread has none yet\n" " if (s == null) {\n" " s = sessionFactory.openSession();\n" " session.set(s);\n" " }\n" " return s;\n" " }\n" "\n" " public static void closeSession() {\n" " Session s = (Session) session.get();\n" " if (s != null)\n" " s.close();\n" " session.set(null);\n" " }\n" "}]]>"#: index.docbook:312msgid "appended paragraph 54"msgstr "이 클래스는 static 초기자를 가진 <literal>SessionFactory</literal>를 처리할 뿐만 아니라 또한 현재의 쓰레드를 위한 <literal>Session</literal>을 소유하는 <literal>ThreadLocal</literal> 변수를 갖는다. 이 helper를 사용하려고 시도하기 전에 thread-local 변수에 대한 자바 개념을 이해해야 한다. 보다 복잡하고 강력한 <literal>HibernateUtil</literal> 클래스는 http://caveatemptor.hibernate.org/의 <literal>CaveatEmptor</literal>에서 찾을 수 있다."#: index.docbook:319msgid "appended paragraph 55"msgstr "<literal>SessionFactory</literal>는 threadsafe이고, 많은 쓰레드들이 동시에 그것에 접근할 수 있고 <literal>Session</literal>들을 요청할 수 있다. 하나의 <literal>Session</literal>은 데이터베이스에 대해 한 개의 단위 작업을 나타내는 non-threadsafe 객체이다. <literal>Session</literal>들은 <literal>SessionFactory</literal> 로부터 열려지고 모든 작업이 완료될 때 닫혀진다. 당신의 서블릿의 <literal>process()</literal> 메소드 내에 있는 예제는 다음과 같을 수 있다(예외상황 처리 없이):"#: index.docbook:327msgid "appended paragraph 56"msgstr "" "<![CDATA[Session session = HibernateUtil.getCurrentSession();\n" "Transaction tx = session.beginTransaction();\n" "\n" "Cat princess = new Cat();\n" "princess.setName(\"Princess\");\n" "princess.setSex('F');\n" "princess.setWeight(7.4f);\n" "\n" "session.save(princess);\n" "\n" "tx.commit();\n" "HibernateUtil.closeSession();]]>"#: index.docbook:329msgid "appended paragraph 57"msgstr "하나의 <literal>Session</literal> 내에서 모든 데이터베이스 오퍼레이션은 데이터베이스 오퍼레이션들(심지어 읽기 전용 오퍼레이션들 조차도)을 격리시키는 하나의 트랜잭션 내부에서 발생한다. 우리는 기본 트랜잭션 방도(우리의 경우, JDBC 트랜잭션들)로부터 추상화시키는데 Hibernates <literal>Transaction</literal> API 를 사용한다. 이것은 우리의 코드가 임의의 변경들 없이도 (JTA를 사용하는) 컨테이너-관리되는 트랜잭션들에 배치되는 것을 허용해준다."#: index.docbook:336msgid "appended paragraph 58"msgstr "당신이 원하는 만큼 당신이 <literal>HibernateUtil.getCurrentSession();</literal>을 호출할 수 있고, 당신은 이 쓰레드의 현재 <literal>Session</literal>을 항상 얻을 것임을 노트하라. 당신은 서블릿 코드 내에서든 또는 서블릿 필터 내에서든 HTTP response가 전송되기 전에, 당신의 단위 작업이 완료된 후에 <literal>Session</literal>이 확실히 닫혀지도록 해야 한다. 두 번째 옵션의 좋은 측면은 쉬운 lazy 초기화이다: 뷰가 렌더링 될 때 <literal>Session</literal>이 여전히 열려져 있어서, Hibernate는 당신이 현재 객체 그래프를 네비게이트 하는 동안 초기화 되지 않은 객체들을 로드시킬 수 있다."#: index.docbook:344msgid "appended paragraph 59"msgstr "Hibernate는 데이터베이스로부터 객체들을 검색하는데 사용될 수 있는 다양한 메소드들을 갖고 있다. 가장 유연한 방법은 Hibernate Query Language (HQL)을 사용하는 것이다. Hibernate Query Language (HQL)은 배우기가 쉽고 SQL에 대한 강력한 객체 지향 확장이다:"#: index.docbook:350msgid "appended paragraph 60"msgstr "" "<![CDATA[Transaction tx = session.beginTransaction();\n" "\n" "Query query = session.createQuery(\"select c from Cat as c where c.sex = :sex\");\n" "query.setCharacter(\"sex\", 'F');\n" "for (Iterator it = query.iterate(); it.hasNext();) {\n" " Cat cat = (Cat) it.next();\n" " out.println(\"Female Cat: \" + cat.getName() );\n" "}\n" "\n" "tx.commit();]]>"#: index.docbook:352msgid "appended paragraph 61"msgstr "Hibernate는 또한 type-safe 질의들을 공식화 시키는데 사용될 수 있는 객체-지향 <emphasis>query by criteria</emphasis> API을 제공한다. 물론 Hibernate는 데이터베이스와의 모든 SQL 통신을 위해 <literal>PreparedStatement</literal>들과 파라미터 바인딩을 사용한다. 당신은 또한 Hibernate 직접적인 SQL 질의 특징을 사용할 수도 있거나 드문 경우에 <literal>Session</literal>으로부터 plain JDBC 커넥션을 얻을 수도 있다."#: index.docbook:362msgid "appended paragraph 62"msgstr "마지막으로"#: index.docbook:364msgid "appended paragraph 63"msgstr "우리는 이 작은 튜토리얼 내에서 단지 Hibernate의 표면을 훑기만 했다. 우리는 우리의 예제들 속에 어떤 서블릿 지정적 코드를 포함하지 않음을 노트하라. 당신이 적합한지를 알려고 할 때 당신은 당신 자신의 서블릿을 생성시켜야 하고 Hibernate 코드를 삽입해야 한다."#: index.docbook:370msgid "appended paragraph 64"msgstr "데이터 접근 계층으로서 Hibernate는 당신의 어플리케이션에 강하게 통합됨을 염두에 두라. 대개 모든 다른 레이어들은 영속 메커니즘에 의존했다. 당신은 이 설계의 함축을 확실히 이해하도록 하라."#: index.docbook:375msgid "appended paragraph 65"msgstr "보다 복잡한 어플리케이션 예제는 http://caveatemptor.hibernate.org/ 를 보고 http://caveatemptor.hibernate.org/에 있는 다른 튜토리얼들을 살펴보라."msgid "ROLES_OF_TRANSLATORS"msgstr "<!--TRANS:ROLES_OF_TRANSLATORS-->"msgid "CREDIT_FOR_TRANSLATORS"msgstr "<!--TRANS:CREDIT_FOR_TRANSLATORS-->"
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -