2. Dirk Weil
GEDOPLAN GmbH, Bielefeld
GEDOPLAN IT Consulting
Konzeption, Realisierung von IT-Lösungen
GEDOPLAN IT Training
Seminare in Berlin, Bielefeld, on-site
Java EE seit 1998
Vorträge, Veröffentlichungen
DB-Schema-Evolution mit LiquiBase 2
3. Weiterentwicklung des DB-Schemas
Weiterentwicklung der Anwendung erfordert
Hinzufügen von Tabellen und Spalten
Entfernen von Tabellen und Spalten
Umbenennen von Tabellen und Spalten
…
Durchführung
manuell (SQL Tool)
automatisiert durch JPA-Standard-Properties
automatisiert durch proprietäre Properties der Provider
automatisiert durch dedizierte Tools
DB-Schema-Evolution mit LiquiBase 3
4. Schema Generation Properties im Standard
Seit JPA 2.1 können Properties zur Schema-Erzeugung in
persistence.xml eingetragen werden:
DB-Schema-Evolution mit LiquiBase 4
Property
javax.persistence
.schema-generation.…
Bedeutung
database.action
scripts.action
Auswahl der Befehle, die in der DB ausgeführt bzw. in die Ziel-Skripte
geschrieben werden. Erlaubte Werte sind none, create, drop-and-
create und drop.
create-source
drop-source
Auswahl, ob das Erzeugen bzw. Löschen auf Basis der Metadaten der
persistenten Klassen oder durch Quell-Skripte erfolgen soll. Erlaubte
Werte: metadata, script, metadata-then-script, script-then-
metadata.
create-script-source
drop-script-source
Quell-Skripte zum Erzeugen bzw. Löschen von Tabellen
(ignoriert, falls create-source bzw. drop-souce den Wert metadata
haben).
scripts.create-target
scripts.drop-target
Ziel-Skripte zum Erzeugen bzw. Löschen von Tabellen
(ignoriert, falls scripts.action den Wert none hat).
5. Schema Generation Properties im Standard
Beispiele:
Erzeugen von fehlenden Tabellen
Löschen und Neuerzeugung aller Tabellen
DB-Schema-Evolution mit LiquiBase 5
<persistence-unit …>
<properties>
<property name="javax.persistence.schema-generation.database.action"
value="create" />
<property name="javax.persistence.schema-generation.create-source"
value="metadata" />
<persistence-unit …>
<properties>
<property name="javax.persistence.schema-generation.database.action"
value="drop-and-create" />
<property name="javax.persistence.schema-generation.create-source"
value="metadata" />
6. Schema Generation Properties im Standard
Die Schema-Generierung mittels Standard-Properties ist recht
limitiert:
Tabellen können nur komplett neu erzeugt werden
Quell- und Zielskripte müssen absolut adressiert werden
Alternative: Schema-Generierungs-Properties der Provider
DB-Schema-Evolution mit LiquiBase 6
<persistence-unit …>
<properties>
<property name="eclipselink.ddl-generation"
value="create-or-extend-tables" />
<property name="eclipselink.ddl-generation.output-mode"
value="database" />
<property name="hibernate.hbm2ddl.auto"
value="update" />
7. Schema Management mit Liquibase
Open Source: http://www.liquibase.org
DB-unabhängig
Durchführung beliebiger DB-Änderungen (DDL und DML)
Verwaltet Änderungen in Skripten (sog. Changelogs, XML-basiert)
DB-Schema-Evolution mit LiquiBase 7
Changelogs
DATABASECHANGELOG
TABLE1
TABLE2
Liquibase
8. Schema Management mit Liquibase
Changelogs können willkürlich aufgeteilt und referenziert werden
Empfehlung:
Ablage als Ressource-Dateien
Aufteilung nach Komponenten und Versionen
DB-Schema-Evolution mit LiquiBase 8
<databaseChangeLog …>
<changeSet id="create person" author="demo">
<createTable tableName="JPA_LB_PERSON">
<column name="id" type="varchar(10)">
<constraints primaryKey="true" nullable="false" />
</column>
<column name="lastname" type="varchar(50)"/>
<column name="firstname" type="varchar(50)"/>
</createTable>
</changeSet>
<databaseChangeLog …>
<include file="liquibase/demo/V1.xml" />
9. Schema Management mit Liquibase
Ausführung per Maven Plugin
Konfiguration
Aufruf
mvn liquibase:update
DB-Schema-Evolution mit LiquiBase 9
<plugin>
<groupId>org.liquibase</groupId>
<artifactId>liquibase-maven-plugin</artifactId>
<version>3.5.3</version>
<configuration>
<changeLogFile>liquibase/changelog.xml</changeLogFile>
<driver>org.h2.Driver</driver>
<url>jdbc:h2:~/h2/seminar;AUTO_SERVER=TRUE</url>
<username>seminar</username>
<password>seminar</password>
10. Schema Management mit Liquibase
Ausführung per API
Library Dependency
Aufruf
DB-Schema-Evolution mit LiquiBase 10
<dependency>
<groupId>org.liquibase</groupId>
<artifactId>liquibase-core</artifactId>
<version>3.5.3</version>
</dependency>
Connection connection = …; // JDBC connection
new Liquibase("liquibase/changelog.xml",
new ClassLoaderResourceAccessor(),
DatabaseFactory.getInstance()
.findCorrectDatabaseImplementation(new JdbcConnection(connection)))
.update((Contexts) null);
11. Schema Management mit Liquibase
Ausführung mittels CDI Extension
Library Dependency
Konfiguration durch CDI Producer (s. nächste Seite)
Aufruf automatisch bei Container-Initialisierung
DB-Schema-Evolution mit LiquiBase 11
<dependency>
<groupId>org.liquibase</groupId>
<artifactId>liquibase-cdi</artifactId>
<version>3.5.3</version>
</dependency>
12. Schema Management mit Liquibase
CDI Producer zur Konfiguration der Extension
DB-Schema-Evolution mit LiquiBase 12
public class LiquibaseProducer {
@Resource(lookup = "jdbc/seminar") DataSource dataSource;
@Produces @LiquibaseType CDILiquibaseConfig getConfig() {
CDILiquibaseConfig config = new CDILiquibaseConfig();
config.setChangeLog("liquibase/changeLog.xml");
return config;
}
@Produces @LiquibaseType ResourceAccessor getResourceAccessor() {
return new ClassLoaderResourceAccessor(getClass().getClassLoader());
@Produces @LiquibaseType DataSource getDataSource() {
return this.dataSource;
}
13. Schema Management mit Liquibase
Exemplarische Weiterentwicklung der Anwendung
DB-Schema-Evolution mit LiquiBase 13
@Entity
@Table(name = "JPA_LB_PERSON")
public class Person {
@Id
private String id;
private String lastName;
private String firstName;
@Entity
@Table(name = "JPA_LB_PERSON")
public class Person {
@Id
private String id;
private String lastName;
private String firstName;
private String fullName;
15. Schema Management mit Liquibase
Exemplarische Weiterentwicklung der Anwendung
mvn liquibase:update, API Call oder CDI Producer
ergänzt Spalte fullname
füllt fullname
DB-Schema-Evolution mit LiquiBase 15
16. Schema Management mit Liquibase
Exemplarische Weiterentwicklung der Anwendung
Rücknahme von Änderungen:
mvn liquibase:update
-Dliquibase.rollbackCount=2
DB-Schema-Evolution mit LiquiBase 16
17. Schema Management mit Liquibase
Weitere Features
Changelog:
Format auch YAML oder JSON
Preconditions zur Prüfung von Vorbedingungen
Contexts zur Unterscheidung von Umgebungen, z. B. Test vs. Produktion
Parameter, setzbar bspw. aus System Properties
Aus bestehender DB generierbar
Aus Diff zwischen DBs generierbar
Ausführung auch als Servlet Listener, Spring Listener
Diverse weitere Kommandos für Diffs, SQL Output, Dokumentation
DB-Schema-Evolution mit LiquiBase 17