Alte Daten ins neue Modell quetschen

DaBe1812

Bekanntes Mitglied
Hallo zusammen,

ich habe folgendes Problem:
Ich habe ein neues Datenmodell zu einer alten Anwendung erstellt. Die neue Tabelle ist (ich denke mal) ziemlich gut nach dem relationalen Standard, d.h. Werte, die der Benutzer besser nicht eingibt, sondern auswählt, sind entweder in einem ENUM, oder eben relational verknüpft in einer weiteren Tabelle.

Die alte Anwendung war da ein wenig anders. Erstmal waren alle "Spalten" untereinander, d.h. für jedes Feld gab es eine Zeile mit ID und Feldindex als Schlüssel. Zusätzlich sind damit alle Werte erstmal String. Verknüpfungen sind auch eher katastrophal aufgelöst worden.

Jetzt hat der Kunde angefordert, dass zur Einarbeitung die User bitte vor der Migration auf die alte Datenbank zugreifen sollen.

Grundsätzlich für "einfache" Daten kein Problem. Ich habe also ein riesiges Select, dass mir die vertikalen Daten horizontal darstellt und als Alias den Feldnamen verwendet, den ich in der neuen Tabelle vorgesehen habe. Funktioniert aktuell auch topp für diese einfachen Felder. Problematisch sind jetzt aber die relationalen Felder. Also da, wo ich in meinem Datenmodell ein Objekt erwarte, kommt ja aus meiner neuen Datenbank eine ID, mit der er in einer anderen Tabelle einen Datensatz laden kann. Aus der alten Datenbank kommt aber ein "richtiger" Wert als String, also z.B. die Nummer eines Mandanten, die aber nicht die ID ist. Das knallt natürlich beim Laden der Daten, weil JPA mit dem String aus der alten DB keine Relation zur neuen Tabelle herstellen kann.

In meinem Kopf wäre die einfachste Lösung, wenn ich den String aus der alten Datenbank einfach in der Spalte für die MandantenID suchen würde und diese dann verwende. Dafür habe ich versucht einen jakarta.persistence.AttributeConverter zu schreiben. Dieser wird aber scheinbar zur Ladezeit nicht gezogen. Also habe ich versucht ihn in der Entity-Klasse ein zu bauen:
Java:
//    @ManyToOne
//    @JoinColumn(name = "TRANSMISSION_TYPE", referencedColumnName = "UUID" )
    @Column
    @Convert(converter = KeyTabConverter.class)
    private KeyValue transmissionType;
auskommentiert mal den richtigen Code, für die neue Implementierung.

Dann erhalte ich beim Serverstart aber folgenden Fehler:
Code:
[FEHLER  ] CWOWB1000E: Es ist ein CDI-Fehler aufgetreten: CWNEN0030E: Beim Abrufen der Objektinstanz des Bindungsobjekts jakarta.persistence.PersistenceException: Ausnahme [EclipseLink-28018] (Eclipse Persistence Services - 3.0.3.v202208190922): org.eclipse.persistence.exceptions.EntityManagerSetupException
Beschreibung der Ausnahme: Die Vorabimplementierung der Persistenzeinheit [nonManagedAtc] ist fehlgeschlagen.
Interne Ausnahme: Ausnahme [EclipseLink-7353] (Eclipse Persistence Services - 3.0.3.v202208190922): org.eclipse.persistence.exceptions.ValidationException
Beschreibung der Ausnahme: Das Zuordnungsattribut [transmissionType] der Klasse [main.java.proips.persistence.entities.WindowsOrder] ist kein gültiger Zuordnungstyp für eine Konvertierungsspezifikation. ist bei der Factory java:comp/env/main.java.timer.persistence.interfaces.NonTXJobScheduleDAO/emf ein Fehler aufgetreten. Ausnahmenachricht: {2}

Ich habe auch gerade beim Testen noch gesehen, wenn ich das Feld nicht nulle in der "richtigen" Implementierung, dann wirft er den Fehler:
Java:
[WARNUNG ] CWWJP9991W: Ausnahme [EclipseLink-4002] (Eclipse Persistence Services - 3.0.3.v202208190922): org.eclipse.persistence.exceptions.DatabaseException
Interne Ausnahme: com.microsoft.sqlserver.jdbc.SQLServerException: Ungültiger Objektname "S_KEYTAB".
Fehlercode: 208
Aufruf: SELECT UUID, ACTIVE, DISPLAYNAME, KEYNAME, KEYRANGE FROM S_KEYTAB WHERE (UUID = ?)
    bind => [SLcM]
Abfrage: ReadObjectQuery(name="transmissionType" referenceClass=KeyValue )
Weil er die Tabelle S_KEYTAB in der alten Datenbank sucht, da gibt es die Tabelle aber nicht, weil da die Werte einfach als String in der eigenen Tabelle abgelegt werden.

Also ist meine Frage:
wie sollte ich den Converter richtig einbauen.

Ich bin aber auch offen für alternative Vorschläge, wie ich die Daten vielleicht mit einem Ansatz darstellen kann, an den ich gerade nicht denke.
 
Zuletzt bearbeitet:

Ullenboom

Bekanntes Mitglied
Es gibt 2 Ansätze: Entweder deine Software kann mit N vielen Versionen umgehen, und dann hast du irgendwann ziemlich viele Konverter oder du migrierst konsequent die Datenbank. Das Stichwort ist Evolutionary Database Design (https://martinfowler.com/articles/evodb.html). In Java gibt es dafür gute Lösungen, bekannt sind Liquibase und Flyway.
 

DaBe1812

Bekanntes Mitglied
Ich überlege gerade, ob es sinnvoll wäre an der Stelle eine implizite Migration zu machen?
Also die Suche sucht im Altsystem und wenn der User sich einen Datensatz auswählt, dann wird nicht dieser geöffnet, sondern er wird in die neue Datenbank geladen und dann von dort aus geöffnet.
Dann könnten die Relationen bleiben und in der Ansicht funktioniert alles, wie es soll.
Alle Relationen werden mit dazu geladen, vielleicht im ersten Schritt nur so weit, wie benötigt, z.B. bei verknüpften Windows Hosts nur der Name, der im Feld angezeigt wird.
Wenn ein Datensatz öfter als einmal geöffnet wird, dann wird er anhand seiner ID immer wieder überschrieben.
Solange die Daten noch nicht migriert sind, müsste ich zumindest nicht sämtliche Mechanismen verbiegen. Und aktuell ist im neuen System kein Speichern vorgesehen.
 

Oneixee5

Top Contributor
Ende bleibt das Problem mit den neuen Relationen
Nein wieso, in der View würdest du schon die ID's verwenden - als ob alle Relationen vorhanden wären.. Es gibt die Relationen/FK's zwar nicht physisch, das stört aber das Programm nicht, wenn du nicht speicherst.
Ich würde ein Synonym auf die View erstellen, meinetwegen MEINE_TABELLE. Wenn ich die View dann nicht mehr brauche würde ich das Synonym löschen und neu anlegen - dann aber nicht mehr auf die View zeigen, sondern auf die echte Tabelle.
Im Programm muss nichts geändert werden und es funktioniert mit den alten und neuen Daten. Synonyme für Datenbankobjekte sind bei uns ganz normales Vorgehen.

SQL:
CREATE SYNONYM MEINE_TABELLE FOR ALTE_DATEN_VIEW;
-- später
DROP SYNONYM MEINE_TABELLE;
CREATE SYNONYM MEINE_TABELLE FOR NEUE_DATEN_TABELLE;
 

DaBe1812

Bekanntes Mitglied
Okay, bin mir gerade nicht sicher, ob das klappt, weil die Keys sind in einer anderen Datenbank, sogar ein komplett anderes DBMS, anderer Server und ich meine sogar durch FW getrennt voneinander, also meine Anwendung wäre das Bindeglied zwischen den beiden Datenbanken. Aber an eine ähnliche Lösung hatte ich auch schon gedacht.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
G beim lesen der db alte daten bekommen? Datenbankprogrammierung 5
R Mongodb Daten werden immer überschrieben Datenbankprogrammierung 7
R Mongodb Daten in einem bestimmten Document speichern Datenbankprogrammierung 1
OnDemand Daten auf mehrere Tabellen aufteilen oder Spalten nutzen Datenbankprogrammierung 2
B Daten HSQL-DB Datenbankprogrammierung 2
V H2 ManyToMany wie speichere ich die Daten? Datenbankprogrammierung 10
thobren Projekt SQlite! Wie kann ich auf auf SQlite Daten zugreifen? Datenbankprogrammierung 4
OnDemand Daten verschlüsseln Datenbankprogrammierung 42
L Oracle Daten in Häppchen selektieren Datenbankprogrammierung 5
L Oracle Daten von Oracle zu MSSQL übertragen Datenbankprogrammierung 4
D Daten aus der Firebase-Echtzeitdatenbank abfragen und in Variablen speichern (JAVA) Datenbankprogrammierung 0
Z Ausgabe nur bestimmter Daten Datenbankprogrammierung 6
E netbeans - jsp Daten in Datenbank hinzufügen Datenbankprogrammierung 2
N Java Abfrage über GUI, Daten hinzufügen Datenbankprogrammierung 54
Kirby.exe Vorschläge zur Verschlüsselung von Daten in der DB Datenbankprogrammierung 2
T Java Spiel Daten speichern Datenbankprogrammierung 1
LimDul H2 Embedded DB und Gigabytes an Daten Datenbankprogrammierung 0
C Datenbank anlegen und über eine Website mit Daten füllen? Datenbankprogrammierung 25
R Wie mit zu viele Daten umgehen? Datenbankprogrammierung 2
F MySQL Wie speichere ich Daten zeitlich abhängig? Datenbankprogrammierung 4
T Oracle Normalisierung und Daten splitten Datenbankprogrammierung 1
JG12111989 DB-Daten werden falsch dargestellt Datenbankprogrammierung 7
K H2 Daten in die H2 console DB eintragen Datenbankprogrammierung 2
L SQLite Ändern der Daten in einem UNIQUE Feld Datenbankprogrammierung 1
S Daten von SQLite Datenbank nutzen Datenbankprogrammierung 5
P JSP - Daten aus 2 Tabellen in eine neue Tabelle einfügen Datenbankprogrammierung 1
L Oracle Daten von einem Server zum andere kopieren Datenbankprogrammierung 24
P Daten in eine mySQL Datenbank einfügen Datenbankprogrammierung 4
L MySQL Vergleichen von Array-Inhalt, Ausgabe gleicher Daten Datenbankprogrammierung 3
W Daten in Java intern abfragen Datenbankprogrammierung 1
G MySQL Java Problem: Nullpointer Exception obwohl Daten vorhanden sind? Datenbankprogrammierung 2
W Daten aus einer Datei von einem VServer auslesen Datenbankprogrammierung 1
I MySQL Datenbankstruktur angleichen - Daten behalten Datenbankprogrammierung 7
O JDBC Daten in zwei Tabellen mit zwei foreach-Schleifen einfügen (insert into) Datenbankprogrammierung 1
P LDAP: Daten eintragen funktioniert nicht Datenbankprogrammierung 7
B MySQL LogIn Daten im Code verstecken Datenbankprogrammierung 3
O mit Multi-Thread Daten aus Datenbank lesen und schreiben Datenbankprogrammierung 22
F Daten verdichten Datenbankprogrammierung 0
Z Finde den Fehler: Daten aus einer Access-Datenbank lesen Datenbankprogrammierung 12
B Daten aus DB in Word Dokument Datenbankprogrammierung 2
D Aktualisierung einer ListView mit Daten aus MySQL-DB Datenbankprogrammierung 5
D Daten posten auf RestApi (Mongodb/NoSQL) Datenbankprogrammierung 0
I Fehler bei Ausgabe der Daten aus der DB Datenbankprogrammierung 3
OnDemand MySQL Daten aktualisieren Datenbankprogrammierung 6
D Daten von einem Server in eigenem Java-Programm benutzen Datenbankprogrammierung 6
M Vergleich von Daten in verschiedenen Tabellen Datenbankprogrammierung 1
S Daten aus Form in Datenbank nur einmal eintragen Datenbankprogrammierung 2
6 JBDC Daten verschlüsseln? Datenbankprogrammierung 2
F MySQL Daten ändern über Java Datenbankprogrammierung 3
G SQLite Daten aus SQLite DB in andere SQLite DB importieren Datenbankprogrammierung 4
H Grosse Menge an Daten in eine Datenbank Datenbankprogrammierung 32
M Daten nachträglich hinzufügen Datenbankprogrammierung 6
2 MySQL Daten aus einer Array auslesen und MySQL Statment erstellen. Datenbankprogrammierung 5
E Daten einer SQL-Datenbank aus Combobox in labels schreiben Datenbankprogrammierung 6
N HSQLDB Daten Auslesen Datenbankprogrammierung 3
O Viele Verbindungen-Exception bei insert Daten zur MySQL-Datenbank Datenbankprogrammierung 2
P MySql daten in leeren jtable übertragen Datenbankprogrammierung 5
SexyPenny90 SQL Daten sortieren und top 5 ausgeben Datenbankprogrammierung 7
L Hibernat will Daten nicht einfügen??? Datenbankprogrammierung 2
B MySQL DB Daten aktualisieren Datenbankprogrammierung 9
D MySQL Daten werden aus Datenbank gelesen, obwohl sie dort gar nicht angekommen sind Datenbankprogrammierung 8
Kenan89 Oracle Daten einer Tabelle in Array speichern Oracle Datenbankprogrammierung 10
L SQLite Daten werden nicht in die Tabelle eingefügt Datenbankprogrammierung 7
D Übersichtliche Zuweisung von Daten in Tabellen Datenbankprogrammierung 17
C ResultSet enthält nicht alle Daten Datenbankprogrammierung 4
A Problem mit Eintragen von Daten in eine Datenbank mittels DAO Datenbankprogrammierung 4
J Daten synchronisieren in Multi-Client-Anwendungen (Hibernate) Datenbankprogrammierung 6
S JPA: DB Schema ändern und Daten nicht verlieren - wie? Datenbankprogrammierung 5
T MySQL Select: Zusammenfassen von Daten und bilden von Durchschnitt? Datenbankprogrammierung 4
F Daten in die DB hinzufügen Datenbankprogrammierung 7
H Klasse welche Mysql Daten zurück gibt Datenbankprogrammierung 18
S JPA: Problem mit Update von Daten Datenbankprogrammierung 7
H Daten in/aus Datenbank schreiben Datenbankprogrammierung 2
M DropDownBoxen mit MySQL Daten füllen Datenbankprogrammierung 3
E MySQL Daten in die Datenbank eingeben via Java Programm Datenbankprogrammierung 3
F ORA 17410 Keine weiteren Daten aus Socket zu lesen Datenbankprogrammierung 2
B Daten aus Datenbank holen Datenbankprogrammierung 6
T Problem beim schreiben von daten Datenbankprogrammierung 4
N Daten aus Datenbank abfragen und anzeigen in der Praxis?? Datenbankprogrammierung 2
G MySQL Bekomme keine Daten. Datenbankprogrammierung 7
L CLOB-Daten werden beim Einfügen in die Datenbank geändert? Datenbankprogrammierung 5
G Daten aggregieren Datenbankprogrammierung 11
Gossi Oracle 2 Daten (Datum) vergleichen Datenbankprogrammierung 6
W MySQL Daten aus bestimmter Spalte lesen Datenbankprogrammierung 2
E MySQL Befüllen einer MySQL DB mit großen Daten Datenbankprogrammierung 6
J Doppelte Daten in Spalte, nur die erste abrufen wie? Datenbankprogrammierung 15
P Daten aus MySql Datenbank lesen??? Datenbankprogrammierung 6
J Daten vergleichen Datenbankprogrammierung 10
S Daten einer Tabelle vergleichen und ggs neuen Wert einfügen Datenbankprogrammierung 8
X Daten einer DatenbankTabelle in JTable darstellen Datenbankprogrammierung 13
T Designfrage: DB-Daten direkt oder verzögert speichern Datenbankprogrammierung 2
Dragonfire Daten aus jsp Datei in datenbank speichern Datenbankprogrammierung 15
A Daten von Webshop einlesen Datenbankprogrammierung 5
S Daten aus jTextfiled in DB schreiben - SQL Befehl Datenbankprogrammierung 2
T Daten aus DB in variable Zahl an Variablen speichern Datenbankprogrammierung 18
A Datenbankanbindung an mySQL und Ein-/Auslesen der Daten Datenbankprogrammierung 4
D Vector mit Daten aus der Datenbank füllen Datenbankprogrammierung 7
G Daten aus ResultSet in String-Liste Datenbankprogrammierung 13
S Fehler beim Auslesen von Daten Datenbankprogrammierung 6
D Keine Ausgabe der Daten Datenbankprogrammierung 3

Ähnliche Java Themen

Neue Themen


Oben