Наличие JPA и Liquibase: что делать с их конфигурационными файлами?

#java #hibernate #jpa #liquibase

#java #переход в спящий режим #jpa #liquibase

Вопрос:

Мой проект начался только с JPA, и в нем нет Spring. Позже я добавил Liquibase, и у меня возникли некоторые проблемы с именем модуля сохранения, поскольку оно необходимо для того, чтобы его можно было использовать EntityManager .

 entityManagerFactory = Persistence.createEntityManagerFactory("MyPU");
  

Итак, чтобы иметь возможность продолжить создание таблиц с помощью Liquibase и сохранить их в базе данных с помощью JPA, я сохранил оба persistence.xml и liquibase.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=trueamp;amp;useTimezone=trueamp;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=trueamp;useTimezone=trueamp;serverTimezone=UTC
username=root
password=root
  

Я взглянул на liquibase-hibernate и не очень хорошо в этом разобрался, но, похоже, он используется для генерации файлов diff, которые мне на данный момент не нужны.

Необходимы ли оба файла? Могу ли я что-нибудь сделать, чтобы иметь только один из них?

Ответ №1:

У Liquibase нет прямого способа считывать информацию об URL / имени пользователя / пароле из presistence.xml файл. Расширение liquibase-hibernate добавляет поддержку для сопоставления базы данных с вашими файлами сопоставления файлов Java, но не изменяет способ получения Liquibase URL / имени пользователя / пароля.

Вы сказали, что не используете Spring, но если вы все еще находитесь в веб-приложении, вы можете использовать прослушиватель сервлетов Liquibase для запуска Liquibase, который извлекает соединение из предварительно настроенного источника данных. JPA может извлекать данные из того же самого предварительно настроенного источника данных вместо повторного определения конфигурации.

В противном случае, если вы не хотите выполнить немного пользовательского Java-кодирования для анализа persistence.xml файл и передайте его в Liquibase, вам действительно нужны оба файла.

Чтобы избежать повторения, вы могли бы сделать что-то вроде определения свойств сборки в вашей maven / gradle / любой другой настройке и иметь <property name="javax.persistence.jdbc.url" value="${database.url}"/> в своем persistence.xml исходный файл и url: ${database.url} в вашем файле liquibase.properties.