2009-09-14

톰켓 6.0 + JPA

톰켓 6.0에서 JPA를 사용하는 방법이다.

우선 톰켓 6.0 깨끗하게 하기를 참고하여 톰켓을 설치하고, 톰켓 6.0 데이터소스 설정를 참고하여 아파치 더비를 데이터소스로 설정한다.


JPA 구현부로는 오라클이 제공하는 TopLink Essentials을 다운로드한다.

다운로드한 glassfish-persistence-installer-v2-b41.jar 파일이 있는 디렉토리로 이동하여 다음 명령어를 실행한다. 자바가 사용할 수 있어야 한다.

java -jar glassfish-persistence-installer-v2-b41.jar


아래 화면에서 스크롤을 맨 아래까지 내린 다음에 Accept 버튼을 누른다.



압축이 풀리면서 디렉토리가 생기는데 다음 2 파일을 webapps/ROOT/WEB-INF/lib 디렉토리에 복사한다.

  • toplink-essentials.jar
  • toplink-essentials-agent.jar

그리고 webapps/ROOT/WEB-INF/classes/META-INF/persistence.xml 파일을 작성하고 다음 내용을 기술한다.

<?xml version="1.0" encoding="UTF-8"?>

<persistence version="1.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd">
  <persistence-unit name="ExampleUnit" transaction-type="JTA">
    <provider>oracle.toplink.essentials.PersistenceProvider</provider>
    <jta-data-source>java:comp/env/jdbc/Base</jta-data-source>
    <class>com.dimdol.example.model.Document</class>
    <class>com.dimdol.example.model.User</class>
    <class>com.dimdol.example.model.Element</class>
    <exclude-unlisted-classes>true</exclude-unlisted-classes>
    <properties>
      <!--
      <property name="toplink.ddl-generation" value="create-tables" />
      -->
      <property name="toplink.session.customizer" value="com.dimdol.example.util.ToplinkSessionCustomizer" />
    </properties>
  </persistence-unit>
</persistence>

  • persistence-unit 태그 name 속성에 모델 그룹을 지칭하는 적절한 이름(ExampleUnit)을 설정한다.
  • provider 태그에 JPA 구현 클래스 이름(oracle.toplink.essentials.PersistenceProvider)을 설정한다.
  • jta-data-source 태그에 데이터소스 JNDI 이름(java:comp/env/jdbc/Base)을 설정한다.
  • class 태그로 모델 클래스들을 설정한다.

property 태그로 toplink.session.customizer 이름에 다음 클래스를 설정한다. 이렇게 해야 하는 정확한 이유는 알수 없지만 이렇게 하지 않으면 정상적으로 동작하지 않는다.

package com.dimdol.example.util;

import oracle.toplink.essentials.jndi.JNDIConnector;
import oracle.toplink.essentials.sessions.Session;
import oracle.toplink.essentials.tools.sessionconfiguration.SessionCustomizer;

public class ToplinkSessionCustomizer implements SessionCustomizer {

    public void customize(Session session) throws Exception {
        JNDIConnector connector = (JNDIConnector) session.getLogin().getConnector();
        connector.setLookupType(JNDIConnector.STRING_LOOKUP);
    }

}


No comments: