2016-09-19 73 views
0

我有一個使用JPA進行持久化的Java項目。 現在我想將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之前運行。

如何更改該訂單? 直到現在,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爲您的應用程序,我建議要使用的 「自動」 一節中介紹的選項之一的一部分:

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 Listener。 唯一的問題是,我不知道如何獲得我的數據庫的數據源值,這是Servlet選項所需的。 你能給我一個提示嗎? ;) – Crucios

+0

@Curcios數據源通常在應用程序服務器中定義,並且是特定於應用程序服務器的。由於Java EE 6現在還有一個可以使用的與應用程序服務器無關的註釋:http://docs.oracle.com/javaee/7/api/javax/annotation/sql/DataSourceDefinition.html – Puce

+0

我只有一個持久性。 XML與上述內容,所以沒有一個數據源在我的代碼中的某個地方定義。我沒有辦法獲得數據源嗎?或者根本沒有數據源?我應該在什麼地方定義一個數據源才能工作? – Crucios