Особенности использования Toplink JPA на Tomcat

Рубрика: Development, Java | 26 March 2008, 14:42 | Vadim Voituk

Довелось попробовать Oracle Toplink Essentials в среде не-J2EE контейнера, а на старом-добром Tomcat.
При этом методом проб, ошибок и гугления узнал о нюансах, которые неплохо бы знать на будущее:

1. Внутри war-файла, persistence.xml должен находиться в /WEB-INF/classes/META-INF/, а не как ожидалось в /META-INF/ (рядом с context.xml)
Иначе же выпадает Exception а-ля “Неизвестный persistent-unit”, связанный с тем, что persistence.xml попросту не находится TopLink-ом.
Подробнее о том, где должен быть произведен поиск persistence.xml написано в разделе 6.2. спецификации “JSR 220: Enterprise JavaBeans, Version 3.0 – Java Persistence API

2. Очевидно, что в среде Tomcat ни о каком JTA и думать не приходится.
Потому transaction-type указываем в RESOURCE_LOCAL, а вместо привычного jta-data-source используем non-jta-data-source.
Вот тут то как раз собака и порылась, потому что как ни крути а Toplink ничего знать не знает про указанный DataSource.
Лечится созданием собственного Toplink Session Customizer такого содержания:


package net.glamourfone.utils;

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);
  }
}

и указанием его в свойствах persistence.xml
<property name="toplink.session.customizer"
value="net.glamourfone.utils.ToplinkSessionCustomizer" />

3. Стоит ещё отметить что в среде Tomcat, DataSource нужно указывать в виде полного пути в JNDI-дереве:
<non-jta-data-source>java:comp/env/jdbc/ipxdb</non-jta-data-source>

Пока вроде все.
По мере наступания на последующие грабли – буду дописывать.

Комментариев: 4

4 Responses to “Особенности использования Toplink JPA на Tomcat”

Комментарии:

  1. Andrey

    А можно пример поднятия и использования EntityManagerFactory или EntityManager в бине?
    Что-то типа вот такого, только чтобы работало :) ::
    Context ctx = (Context) new javax.naming.InitialContext().lookup(“java:comp/env/”);
    emf = (EntityManagerFactory) ctx.lookup(“persistence/bfView_nbPU/factory”);

  2. dmitrygusev

    На автора надо ссылку давать:
    http://javanotepad.blogspot.com/2007/07/working-with-non-jta-datasource-in.html

  3. Vadim Voituk

    Дмитрий,
    В таком случае нужно дававть ссылку на документацию TopLink, а указанный сайт вижу впервые.

  4. Michael

    Доброго времени суток.
    Вадим, что посоветуешь почитать про JPA (TopLink).
    Я пока новичок в этом. У меня есть вопрос: Допустим есть 5-6 таблиц, которые у меня в виде Entity. есть persistense.xml, настроенный на БД. Каким образом с помощью oracle.toplink.essentials.sessions.Session мне задать нужного пользователя с паролем (run-time), чтобы работать с БД? Спасибо.

Leave a Reply