2016-09-19 4 views
0

У меня есть проект Java, в котором я использую JPA для сохранения. Теперь я хочу интегрировать LiquiBase в свой проект, но я не знаю, как изменить порядок выполнения JPA/Liquibase.Liquibase + JPA: Порядок выполнения

Для ясности: До сих пор моя persistence.xml выглядит следующим образом:

<property name="javax.persistence.jdbc.driver" value="org.h2.Driver"/> 
<property name="javax.persistence.jdbc.url" value=.../> 
<property name="javax.persistence.jdbc.user" value=.../> 
<property name="eclipselink.ddl-generation" value="create-or-extend-tables"/> 

Теперь я попытался установить:

<property name="eclipselink.ddl-generation" value="none"/> 

так что LiquiBase обрабатывает все базы данных-материал.

Но теперь, когда я запускаю свой код, JPA выдает ошибку, потому что некоторые таблицы отсутствуют, хотя эти таблицы должны быть созданы Liquibase, что заставляет меня думать, что JPA работает до ликбазы.

Как изменить этот заказ? До сих LiquiBase не выполняется в коде с помощью этой строки:

java.sql.Connection connection = openConnection(); //your openConnection logic here 

Database database = DatabaseFactory.getInstance().findCorrectDatabaseImplementation(new JdbcConnection(connection)); 

Liquibase liquibase = new liquibase.Liquibase("path/to/changelog.xml", new ClassLoaderResourceAccessor(), database); 

liquibase.update(new Contexts(), new LabelExpression()); 

Я где-то читал, что это может быть достигнуто с помощью LiquiBase Servlet слушателя, но требует источника данных базы данных, и я не знаю, как получить, что ,

Liquibase сам работает нормально.

+0

Это приложение Java EE или Spring? – Puce

+0

Его проект Java EE :) – Crucios

ответ

0

Если вы хотите запустить LiquiBase как часть вашего приложения я рекомендую использовать один из вариантов, задокументированных в разделе "Automated":

http://www.liquibase.org/documentation/running.html

Если вы разрабатываете приложение Java EE, сначала создайте источник данных: https://docs.oracle.com/javaee/7/tutorial/resource-creation002.htm

Обратите внимание, что это конкретный сервер приложений.

Поскольку Java EE 6 в настоящее время также является независимым аннотацию сервер приложений, который может быть использован: http://docs.oracle.com/javaee/7/api/javax/annotation/sql/DataSourceDefinition.html

В вашем persistence.xml я предлагаю использовать transaction-type="JTA" и ссылки на источник данных с помощью:

<jta-data-source>jdbc/someDB</jta-data-source> 

Опустить деталь:

<property name="javax.persistence.jdbc.driver" value="org.h2.Driver"/> 
<property name="javax.persistence.jdbc.url" value=.../> 
<property name="javax.persistence.jdbc.user" value=.../> 
+0

Я не использую Spring или CDI, поэтому единственным вариантом для меня является использование прослушивателя сервлета. Единственная проблема заключается в том, что я не знаю, как получить значение базы данных для моей базы данных, которое требуется для параметра Servlet. Не могли бы вы дать мне подсказку? ;) – Crucios

+0

@Curcios Источник данных обычно определяется на сервере приложений и специфичен для сервера приложений.Начиная с Java EE 6 теперь также существует независимая аннотация для сервера приложений, которая может быть использована: http://docs.oracle.com/javaee/7/api/javax/annotation/sql/DataSourceDefinition.html – Puce

+0

У меня есть постоянство. xml с указанным выше контентом, поэтому в моем коде не определен источник данных. Нет ли способа получить источник данных? Или нет источника данных вообще? Должен ли я определить источник данных где-то для этого? – Crucios