SlideShare una empresa de Scribd logo
1 de 17
Descargar para leer sin conexión
DB-Schema-Evolution mit LiquiBase
Expertenkreis Java, 29.06.2017, GEDOPLAN
Dirk Weil, GEDOPLAN GmbH
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
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
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).
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" />
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" />
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
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" />
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>
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);
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>
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;
}
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;
Schema Management mit Liquibase
Exemplarische Weiterentwicklung der Anwendung
DB-Schema-Evolution mit LiquiBase 14
<databaseChangeLog …>
<changeSet id="add fullname" author="demo">
<addColumn tableName="JPA_LB_PERSON">
<column name="fullname" type="varchar(101)"/>
</addColumn>
</changeSet>
<changeSet id="fill fullname" author="demo">
<sql>
update JPA_LB_PERSON set fullname = {fn concat(firstname, ' ', lastname)}
</sql>
<rollback/>
</changeSet>
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
Schema Management mit Liquibase
Exemplarische Weiterentwicklung der Anwendung
Rücknahme von Änderungen:
mvn liquibase:update 
-Dliquibase.rollbackCount=2
DB-Schema-Evolution mit LiquiBase 16
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

Más contenido relacionado

Similar a DB-Schema-Evolution mit LiquiBase

Fanstatic pycon.de 2012
Fanstatic pycon.de 2012Fanstatic pycon.de 2012
Fanstatic pycon.de 2012
Daniel Havlik
 

Similar a DB-Schema-Evolution mit LiquiBase (20)

JEE-Microservices mit Quarkus – eine Einführung
JEE-Microservices mit Quarkus – eine EinführungJEE-Microservices mit Quarkus – eine Einführung
JEE-Microservices mit Quarkus – eine Einführung
 
Java Code Quality: Gute Software braucht guten Code - Regeln für verständlich...
Java Code Quality: Gute Software braucht guten Code - Regeln für verständlich...Java Code Quality: Gute Software braucht guten Code - Regeln für verständlich...
Java Code Quality: Gute Software braucht guten Code - Regeln für verständlich...
 
Agile Oracle database modeling and development - APEX Connect 2020
Agile Oracle database modeling and development - APEX Connect 2020Agile Oracle database modeling and development - APEX Connect 2020
Agile Oracle database modeling and development - APEX Connect 2020
 
An Introduction to Ruby On Rails
An Introduction to Ruby On RailsAn Introduction to Ruby On Rails
An Introduction to Ruby On Rails
 
Speeding up Java Persistence
Speeding up Java PersistenceSpeeding up Java Persistence
Speeding up Java Persistence
 
Docker-Images mit vorinstallierter Instanz einer Oracle-DB
Docker-Images mit vorinstallierter Instanz einer Oracle-DBDocker-Images mit vorinstallierter Instanz einer Oracle-DB
Docker-Images mit vorinstallierter Instanz einer Oracle-DB
 
javaPersistenceInActionFeaturesJenseitsDesEntryLevels
javaPersistenceInActionFeaturesJenseitsDesEntryLevelsjavaPersistenceInActionFeaturesJenseitsDesEntryLevels
javaPersistenceInActionFeaturesJenseitsDesEntryLevels
 
Domain Driven Design in Rails
Domain Driven Design in RailsDomain Driven Design in Rails
Domain Driven Design in Rails
 
Schnelle Winkel: 10x schnellere Webapps mit AngularJS und JEE
Schnelle Winkel: 10x schnellere Webapps mit AngularJS und JEESchnelle Winkel: 10x schnellere Webapps mit AngularJS und JEE
Schnelle Winkel: 10x schnellere Webapps mit AngularJS und JEE
 
Microprofile-Anwendungen mit Quarkus
Microprofile-Anwendungen mit Quarkus Microprofile-Anwendungen mit Quarkus
Microprofile-Anwendungen mit Quarkus
 
Python builds mit ant
Python builds mit antPython builds mit ant
Python builds mit ant
 
Nooku, Molajo & Co - Joomla! Distributionen. Oder Forks.
Nooku, Molajo & Co - Joomla! Distributionen. Oder Forks.Nooku, Molajo & Co - Joomla! Distributionen. Oder Forks.
Nooku, Molajo & Co - Joomla! Distributionen. Oder Forks.
 
Neue Features der Java EE 6
Neue Features der Java EE 6Neue Features der Java EE 6
Neue Features der Java EE 6
 
Fanstatic pycon.de 2012
Fanstatic pycon.de 2012Fanstatic pycon.de 2012
Fanstatic pycon.de 2012
 
Object-orientied way of using mysqli interface - Workshop
Object-orientied way of using mysqli interface - WorkshopObject-orientied way of using mysqli interface - Workshop
Object-orientied way of using mysqli interface - Workshop
 
Speeding up Java Persistence
Speeding up Java PersistenceSpeeding up Java Persistence
Speeding up Java Persistence
 
MongoDB für Java Programmierer (JUGKA, 11.12.13)
MongoDB für Java Programmierer (JUGKA, 11.12.13)MongoDB für Java Programmierer (JUGKA, 11.12.13)
MongoDB für Java Programmierer (JUGKA, 11.12.13)
 
MongoDB für Java-Programmierer
MongoDB für Java-ProgrammiererMongoDB für Java-Programmierer
MongoDB für Java-Programmierer
 
Schlanke Webarchitekturen nicht nur mit JSF 2 und CDI
Schlanke Webarchitekturen nicht nur mit JSF 2 und CDISchlanke Webarchitekturen nicht nur mit JSF 2 und CDI
Schlanke Webarchitekturen nicht nur mit JSF 2 und CDI
 
iJUG Java Aktuell [Februar 2015] Lukas Eder - jOOQ - ein alternativer Weg mit...
iJUG Java Aktuell [Februar 2015] Lukas Eder - jOOQ - ein alternativer Weg mit...iJUG Java Aktuell [Februar 2015] Lukas Eder - jOOQ - ein alternativer Weg mit...
iJUG Java Aktuell [Februar 2015] Lukas Eder - jOOQ - ein alternativer Weg mit...
 

DB-Schema-Evolution mit LiquiBase

  • 1. DB-Schema-Evolution mit LiquiBase Expertenkreis Java, 29.06.2017, GEDOPLAN Dirk Weil, GEDOPLAN GmbH
  • 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;
  • 14. Schema Management mit Liquibase Exemplarische Weiterentwicklung der Anwendung DB-Schema-Evolution mit LiquiBase 14 <databaseChangeLog …> <changeSet id="add fullname" author="demo"> <addColumn tableName="JPA_LB_PERSON"> <column name="fullname" type="varchar(101)"/> </addColumn> </changeSet> <changeSet id="fill fullname" author="demo"> <sql> update JPA_LB_PERSON set fullname = {fn concat(firstname, ' ', lastname)} </sql> <rollback/> </changeSet>
  • 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