У меня есть проект Vanilla maven WAR с использованием веб-профиля Java EE, который выполняет свои тесты модуляции/интеграции с использованием OpenEJB. Во время OpenEJB пуска, вместо того, чтобы использовать источник данных, определенный в jndi.properties, OpenEJB создает свой собственный:OpenEJB + EclipseLink не могут создавать таблицы в базе данных HSQL
INFO - Auto-creating a Resource with id 'Default JDBC Database' of type 'DataSource for 'scmaccess-unit'.
INFO - Creating Resource(id=Default JDBC Database)
INFO - Configuring Service(id=Default Unmanaged JDBC Database, type=Resource, provider-id=Default Unmanaged JDBC Database)
INFO - Auto-creating a Resource with id 'Default Unmanaged JDBC Database' of type 'DataSource for 'scmaccess-unit'.
INFO - Creating Resource(id=Default Unmanaged JDBC Database)
INFO - Adjusting PersistenceUnit scmaccess-unit <jta-data-source> to Resource ID 'Default JDBC Database' from 'jdbc/scmaccess'
INFO - Adjusting PersistenceUnit scmaccess-unit <non-jta-data-source> to Resource ID 'Default Unmanaged JDBC Database' from 'null'
И затем, далее, когда пришло время, чтобы создать таблицу - в соответствии с Создать- уронить стратегию, определенную в файле persistence.xml в приложении - Я вижу несколько ошибок, как это:
(...) Internal Exception: java.sql.SQLSyntaxErrorException: type not found or user lacks privilege: NUMBER
Error Code: -5509
jndi.properties файл:
##
# Context factory to use during tests
##
java.naming.factory.initial=org.apache.openejb.client.LocalInitialContextFactory
##
# The DataSource to use for testing
##
scmDatabase=new://Resource?type=DataSource
scmDatabase.JdbcDriver=org.hsqldb.jdbcDriver
scmDatabase.JdbcUrl=jdbc:hsqldb:mem:scmaccess
##
# Override persistence unit properties
##
scmaccess-unit.eclipselink.jdbc.batch-writing=JDBC
scmaccess-unit.eclipselink.target-database=Auto
scmaccess-unit.eclipselink.ddl-generation=drop-and-create-tables
scmaccess-unit.eclipselink.ddl-generation.output-mode=database
И, тестовый пример:
public class PersistenceTest extends TestCase {
@EJB
private GroupManager ejb;
@Resource
private UserTransaction transaction;
@PersistenceContext
private EntityManager emanager;
public void setUp() throws Exception {
EJBContainer.createEJBContainer().getContext().bind("inject", this);
}
public void test() throws Exception {
transaction.begin();
try {
Group g = new Group("Saas Automation");
emanager.persist(g);
} finally {
transaction.commit();
}
}
}
Это решает проблему, касающуюся типа, но это не объясняет, почему источник данных по-прежнему создается, когда один уже определен в jndi.properties (и я тоже пытался делать так programmaticaly, через свойства объекта) , – javabeats
Я не знаю, почему OpenEJB это делает. Возможно, лучше разделить эту проблему на отдельный вопрос. – Eelke