2016-09-19 33 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