2016-09-19 4 views
0

Ich habe ein Java-Projekt, in dem ich JPA für Persistenz verwende. Nun möchte ich LiquiBase in mein Projekt integrieren, aber ich weiß nicht, wie ich die Reihenfolge ändern kann, in der JPA/Liquibase ausgeführt wird.Liquibase + JPA: Laufauftrag

Zur Klarheit: Bis jetzt sieht mein persistence.xml wie folgt aus:

<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"/> 

ich jetzt zu setzen versucht:

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

so dass liquibase behandelt alle Datenbank-Zeug.

Aber jetzt, wenn ich meinen Code ausführen, wirft JPA einen Fehler, weil einige Tabellen fehlen, obwohl diese Tabellen von liquibase erstellt werden sollten, was zu der Annahme führt, dass JPA vor liquibase ausgeführt wird.

Wie ändere ich diese Reihenfolge? Bis jetzt ist Liquibase in Code über diese Zeilen ausgeführt:

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

Ich habe irgendwo gelesen, dass diese über Liquibase Servlet Zuhörer erreicht werden könnten, aber das erfordert die Datenbank Datenquelle, und ich weiß nicht, wie das bekommen .

Liquibase selbst funktioniert gut.

+0

Ist dies eine Java EE oder eine Spring-Anwendung? – Puce

+0

Es ist ein Java EE Projekt :) – Crucios

Antwort

0

Wenn Sie Liquibase als Teil Ihrer Anwendung, die ich empfehlen, verwenden Sie eine der Optionen dokumentiert in der "Automated" Abschnitt auszuführen:

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

Wenn Sie eine Java EE-Anwendung entwickeln, erstellen Sie zuerst eine Datenquelle: https://docs.oracle.com/javaee/7/tutorial/resource-creation002.htm

Beachten Sie, dass dies anwendungsserverspezifisch ist.

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

Da Java EE 6 auch Server unabhängig Annotation eine Anwendung jetzt ist, die verwendet werden können: mit http://docs.oracle.com/javaee/7/api/javax/annotation/sql/DataSourceDefinition.html

In Ihrem persistence.xml schlage ich transaction-type="JTA" zu verwenden und die Datenquelle verweisen

Den Artikel auslassen:

<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

Ich benutze weder Spring noch CDI, also ist die einzige Option für mich, einen Servlet Listener zu verwenden. Das einzige Problem mit diesem ist, dass ich nicht weiß, wie man den Datenquellenwert meiner Datenbank erhält, der für die Servletoption benötigt wird. Könnten Sie mir einen Hinweis geben? ;) – Crucios

+0

@Curcios Die Datenquelle ist normalerweise im Anwendungsserver definiert und anwendungsserverspezifisch.Seit Java EE 6 gibt es jetzt auch eine anwendungsserverunabhängige Annotation, die verwendet werden kann: http://docs.oracle.com/javaee/7/api/javax/annotation/sql/DataSourceDefinition.html – Puce

+0

Ich habe nur eine Persistenz. XML mit dem obigen Inhalt, also gibt es keine Datenquelle irgendwo in meinem Code definiert. Kann ich die Datenquelle nicht abrufen? Oder gibt es überhaupt keine Datenquelle? Soll ich irgendwo eine Datenquelle definieren, damit das funktioniert? – Crucios