2013-08-05 4 views
0

У меня есть проект 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(); 
     } 
    } 
} 

ответ

1

Похоже, что eclipselink пытается создать столбец с типом NUMBER, и этот тип не существует в HSQL. Вы указали этот тип в своих сопоставлениях? Если да, то исправьте это.

В противном случае это может помочь добавить

<property name="eclipselink.ddl-generation" value="drop-and-create-tables"/> 
    <property name="eclipselink.create-ddl-jdbc-file-name" value="createDDL_ddlGeneration.jdbc"/> 
    <property name="eclipselink.drop-ddl-jdbc-file-name" value="dropDDL_ddlGeneration.jdbc"/> 
    <property name="eclipselink.ddl-generation.output-mode" value="both"/> 

к вашему persistence.xml, так что вы можете увидеть, что создавать утверждения таблиц точно генерируется. Если eclipselink использует NUMBER для своих собственных столбцов, вы можете сказать ему использовать что-то еще, используя следующие аннотации в соответствующих полях.

@Column(columnDefinition="NUMERIC") 
+0

Это решает проблему, касающуюся типа, но это не объясняет, почему источник данных по-прежнему создается, когда один уже определен в jndi.properties (и я тоже пытался делать так programmaticaly, через свойства объекта) , – javabeats

+0

Я не знаю, почему OpenEJB это делает. Возможно, лучше разделить эту проблему на отдельный вопрос. – Eelke

Смежные вопросы