Avendo sia JPA che Liquibase: cosa fare con i loro file di configurazione?

Aug 22 2020

Il mio progetto è iniziato solo con JPA e non ha Spring. Successivamente, ho aggiunto Liquibase e ho avuto alcuni problemi con il nome dell'unità di persistenza poiché è necessario averne uno per poterlo utilizzare EntityManager.

entityManagerFactory = Persistence.createEntityManagerFactory("MyPU");

Così, per essere in grado di continuare con la creazione tavoli con Liquibase e persistenti nel database con JPA, ho continuato a entrambi persistence.xmle liquibase.propertiesfile, nonostante contaning la stessa configurazione del database.

<?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

Ho dato un'occhiata liquibase-hibernatee non l'ho capito molto bene ma sembra essere usato per generare i file diff, cosa che al momento non è mia esigenza.

Sono necessari entrambi i file? C'è qualcosa che posso fare per averne solo uno?

Risposte

1 NathanVoxland Oct 19 2020 at 15:01

Liquibase non ha un modo diretto per leggere le informazioni su URL / nome utente / password dal file presistence.xml. L'estensione liquibase-hibernate aggiunge il supporto per diff'ing un database con i file di mappatura dei file java, ma non cambia il modo in cui Liquibase ottiene l'url / nome utente / password.

Hai detto che non stavi usando Spring, ma se sei ancora in un'applicazione web, puoi usare il servlet listener Liquibase per eseguire Liquibase che estrae la connessione da un'origine dati preconfigurata. JPA può eseguire il pull dalla stessa origine dati preconfigurata invece di ridefinire anche la configurazione.

Altrimenti, a meno che tu non voglia fare un po 'di codifica Java personalizzata per analizzare il file persistence.xml e passarlo a Liquibase, hai bisogno di entrambi i file.

Per evitare la ripetizione potresti fare qualcosa come definire le proprietà di build nel tuo maven / gradle / qualunque configurazione e hai <property name="javax.persistence.jdbc.url" value="${database.url}"/>nel tuo file sorgente persistence.xml e url: ${database.url}nel tuo file liquibase.properties.