Как мне объявить свой источник данных в OpenEJB?

Я пытаюсь развернуть приложение в OpenEJB 3.1.4 + Tomcat 6. Это приложение нормально развертывается в JBoss, но я хочу, чтобы оно работало в OpenEJB.

По сути, я хотел бы знать, как настроить источник данных и развернуть его с помощью EAR для OpenEJB.

Сейчас:

EJB можно найти в браузере JNDI OpenEJB, но спящий режим, похоже, не находит источник данных (он не может обновить схему базы данных) — из стандартного вывода:

org.hibernate.tool.hbm2ddl.SchemaExport execute INFO: Running hbm2ddl schema export
org.hibernate.tool.hbm2ddl.SchemaExport execute INFO: exporting generated schema to database
org.hibernate.tool.hbm2ddl.SchemaExport create GRAVE: Unsuccessful: create table Answer ([...])

Мой persistence.xml указывает на мой источник данных:

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="1.0" xmlns="http://java.sun.com/xml/ns/persistence"
[...]

  <persistence-unit name="myapp">
  <provider>org.hibernate.ejb.HibernatePersistence</provider>

<jta-data-source>java:/myapp_mysql</jta-data-source>

Я попытался включить файл источника данных, например src/main/application/mysql-ds.xml:

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

  <datasources>
    <local-tx-datasource>
      <jndi-name>myapp_mysql</jndi-name>
      <connection-url>jdbc:mysql://hostname:3306/my_app</connection-url>
      <driver-class>com.mysql.jdbc.Driver</driver-class>
      <user-name>user</user-name>
      <password>password</password>

И даже еще один вроде src/main/application/openejb.xml:

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

<openejb>
  <Connector id="myapp_mysql">
    JdbcDriver = com.mysql.jdbc.Driver
    JdbcUrl = jdbc:mysql://hostname:3306/my_app
    UserName = user
    Password = password
  </Connector>
</openejb>

Но ни один из них, похоже, не загружается/не учитывается моим контейнером приложения. Любые идеи?


person Brian Clozel    schedule 04.03.2011    source источник


Ответы (2)


Нашел. На самом деле я запутался с развертыванием EJB и тем, что было настоящим контейнером приложения: OpenEJB — это контейнер приложения, но сам он развернут как веб-приложение в Tomcat.

Сначала настройте свой PersistenceUnit в persistence.xml:

<?xml version="1.0" encoding="UTF-8"?>
  <persistence version="1.0" xmlns="http://java.sun.com/xml/ns/persistence"
  [...]

  <persistence-unit name="myapp">
  <provider>org.hibernate.ejb.HibernatePersistence</provider>

  <jta-data-source>myapp_mysql</jta-data-source>

Затем объявите свой источник данных в файле конфигурации OpenEJB tomcat\conf\openejb.xml

<Resource id="myapp_mysql" type="DataSource">
  JdbcDriver  com.mysql.jdbc.Driver
  JdbcUrl   jdbc:mysql://localhost:3306/my_app
  UserName   user
  Password  password
  JtaManaged true
</Resource>
person Brian Clozel    schedule 04.03.2011

Это связано с тем, что вы используете специфичный для JBoss файл развертывания (mysql-ds.xml) для приложения, развернутого в Tomcat. Для tomcat вам понадобится другой файл. Видеть это:

http://tomcat.apache.org/tomcat-6.0-doc/jndi-resources-howto.html#JDBC_Data_Sources

Однако не уверен насчет части OpenEJB, так как у меня нет опыта работы с ней.

person jpkrohling    schedule 04.03.2011
comment
Спасибо за совет. Я знаком с Tomcat, но не с OpenEJB+Tomcat. Я знаю, что mysql-ds.xml специфичен для Jboss, я ищу способ OpenEJB делать то же самое. - person Brian Clozel; 04.03.2011
comment
Обратите внимание, что определение источников данных способом Tomcat в стеке OpenEJB+Tomcat работает нормально, и эти источники данных могут быть внедрены во все сервлеты и ejb через стандартную аннотацию @Resource. Однако они представляют собой простые источники данных в стиле Tomcat - без пула, без управления транзакциями. Использование источника данных OpenEJB предпочтительнее, особенно с JPA, который нуждается как в источниках данных, управляемых jta, так и в источниках данных, не связанных с jta. - person David Blevins; 20.03.2011