PostgreSQL läuft als eigener Datenbankserver. JPA bildet Java-Objekte auf relationale Daten ab. Flyway verwaltet die Entwicklung des Schemas. Diese drei Aufgaben sind verschieden. PDF Batch Studio Server verwendet JPA für Jobdaten und Flyway für deren Tabellen. Wir untersuchen zuerst ein kleines SQL-Schema, bevor wir den echten Adapter und seine Entity lesen.
01Eine getrennte PostgreSQL-Lerndatenbank starten
Verwende Docker Compose mit der Beispieldatei. Die Datenbank wird nur an 127.0.0.1:15432 gebunden. Die Zugangsdaten sind ausdrücklich lokale Beispieldaten. Starte docker compose up -d und führe SQL mit docker compose exec -T db psql -U learner -d learning < V1__jobs.sql aus.
services:
db:
image: postgres:17
environment:
POSTGRES_USER: learner
POSTGRES_PASSWORD: local-tutorial-only
POSTGRES_DB: learning
ports:
- "127.0.0.1:15432:5432"
volumes:
- learning-data:/var/lib/postgresql/data
volumes:
learning-data:
02Schema und Transaktion lesen
UUID identifiziert den Job. CHECK begrenzt die erlaubten Lernzustände. BEGIN und COMMIT verbinden den Job mit seiner Zeile im Ereignisprotokoll. Dieser Zusammenhang ist die Grundlage einer späteren Outbox.
CREATE TABLE jobs (
id UUID PRIMARY KEY,
status TEXT NOT NULL CHECK (status IN ('DRAFT', 'READY', 'DONE'))
);
CREATE TABLE job_events (
id BIGINT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
job_id UUID NOT NULL REFERENCES jobs(id),
event_type TEXT NOT NULL
);
BEGIN;
INSERT INTO jobs VALUES ('00000000-0000-0000-0000-000000000001', 'DRAFT');
INSERT INTO job_events(job_id, event_type) VALUES ('00000000-0000-0000-0000-000000000001', 'JobCreated');
COMMIT;
SELECT j.status, e.event_type FROM jobs j JOIN job_events e ON e.job_id=j.id;
03JPA als Abbildung verstehen
Lies BatchJobEntity und JpaJobRepositoryAdapter in der fest verlinkten Version. Die Entity beschreibt die gespeicherte Form. Der Adapter übersetzt zwischen dieser Form und BatchJob im Kern. Eine Domainklasse muss deshalb keine JPA-Annotationen tragen.
04Migrationen unveränderlich behandeln
Eine veröffentlichte V1-Datei wird nicht nachträglich umgeschrieben. Neue Änderungen erhalten V2 und folgende Versionen. Flyway prüft angewendete Migrationen. Testcontainers prüft dieselben Regeln mit PostgreSQL statt nur einer vereinfachten Ersatzdatenbank.
Die Abfrage zeigt einen DRAFT-Job und einen JobCreated-Eintrag. Beide wurden in einer Transaktion geschrieben.
Deine Übung
Schreibe eine V2-Migration mit einer created_at-Spalte. Was muss für vorhandene Zeilen gelten?
Lösung mit Erklärung anzeigen
Definiere einen geeigneten Standardwert oder einen ausdrücklichen Backfill, bevor die Spalte NOT NULL wird. Prüfe eine Datenbank mit bereits vorhandenem Job. Eine erfolgreiche leere Neuinstallation beweist keine funktionierende Upgrade-Migration.
Projektbezug und Quellen
Das Beispiel ist zum Lernen vereinfacht. Die verlinkte Codeversion zeigt die Anwendung im Projekt und die dortigen Prüfungen.