【问题标题】:Liquibase + JPA: Run orderLiquibase + JPA:运行订单
【发布时间】:2016-09-19 19:19:34
【问题描述】:

我有一个 Java 项目,我在其中使用 JPA 进行持久化。 现在我想将 LiquiBase 集成到我的项目中,但我不知道如何更改 JPA/Liquibase 的执行顺序。

为清楚起见: 到目前为止,我的 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 本身工作正常。

【问题讨论】:

  • 这是 Java EE 还是 Spring 应用程序?
  • 它是一个 Java EE 项目 :)

标签: java jpa liquibase


【解决方案1】:

如果您想将 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=.../>

【讨论】:

  • 我不使用 Spring 或 CDI,所以我唯一的选择是使用 Servlet 监听器。唯一的问题是我不知道如何获取我的数据库的数据源值,这是 Servlet 选项所必需的。你能给我一个提示吗? ;)
  • @Curcios 数据源通常在应用程序服务器中定义,并且是特定于应用程序服务器的。从 Java EE 6 开始,现在还可以使用独立于应用程序服务器的注解:docs.oracle.com/javaee/7/api/javax/annotation/sql/…
  • 我只有一个包含上述内容的persistence.xml,所以我的代码中没有定义数据源。我没有办法获取数据源吗?还是根本没有数据源?我应该在某个地方定义一个数据源来让它工作吗?
  • 在JPA之前没有其他办法让liquibase运行吗?我不想改变 JPA 连接到我的数据库的方式,那么有没有办法使用 transaction-type="Resource_Local" 来实现这一点?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-13
  • 2017-05-06
相关资源
最近更新 更多