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:
auskommentiert mal den richtigen Code, für die neue Implementierung.
Dann erhalte ich beim Serverstart aber folgenden Fehler:
Ich habe auch gerade beim Testen noch gesehen, wenn ich das Feld nicht nulle in der "richtigen" Implementierung, dann wirft er den Fehler:
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.
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;
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 )
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: