同时拥有JPA和Liquibase:如何处理它们的配置文件?

问题描述

我的项目仅从JPA开始,并且没有Spring。后来,我添加了Liquibase,并且持久性单元名称存在一些问题,因为必须具有一个持久性单元名称才能使用EntityManager

entityManagerFactory = Persistence.createEntityManagerFactory("MyPU");

因此,为了能够继续使用Liquibase创建表并使用JPA持久存储到数据库中,尽管保留了相同的数据库配置,我仍然保留了persistence.xmlliquibase.properties文件。

<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://xmlns.jcp.org/xml/ns/persistence"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_2.xsd"
             version="2.2">
    <persistence-unit name="MyPU">
        <properties>
            <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost/jpa_specialist?createDatabaseIfNotExist=true&amp;useTimezone=true&amp;serverTimezone=UTC"/>
            <property name="javax.persistence.jdbc.user" value="root"/>
            <property name="javax.persistence.jdbc.password" value="root"/>
            <property name="javax.persistence.jdbc.driver" value="com.mysql.cj.jdbc.Driver"/>
            <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL8Dialect"/>
            <property name="hibernate.show_sql" value="true"/>
            <property name="hibernate.format_sql" value="true"/>
        </properties>
    </persistence-unit>
</persistence>
changeLogFile=src/main/resources/META-INF/database/dbchangelog.xml
url=jdbc:mysql://localhost/jpa_specialist?createDatabaseIfNotExist=true&useTimezone=true&serverTimezone=UTC
username=root
password=root

我看过liquibase-hibernate,但我不太了解它,但是它似乎用于生成diff文件,目前我不需要。

两个文件都需要吗?我可以做一些只有其中之一的事情吗?

解决方法

Liquibase没有直接方法从presistence.xml文件中读取url /用户名/密码信息。 liquibase-hibernate扩展确实添加了将数据库与Java文件映射文件进行差异化的支持,但并未更改Liquibase如何获取url / username / password。

您说过您没有使用Spring,但是如果您仍在Web应用程序中,则可以使用Liquibase servlet listener运行Liquibase,它会从预先配置的数据源中拉出连接。 JPA可以从相同的预配置数据源中提取数据,而不必重新定义配置。

否则,除非您需要执行一些自定义Java编码来解析persistence.xml文件并将其传递到Liquibase,否则您确实需要两个文件。

为避免重复,您可以执行一些操作,例如在maven / gradle /任何设置中定义构建属性,并将<property name="javax.persistence.jdbc.url" value="${database.url}"/>保存在persistence.xml源文件中,将url: ${database.url}保存在liquibase.properties文件中

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...