Derby/JavaDB Datenbanktabelle erweitern, ohne Tabelle zu ändern

ProChris

Mitglied
Hallo zusammen,

als Interface zu meiner Datenbank nutze ich JPA und als konkrete Implementierung EclipseLink.

Ich würde gerne eine Tabelle erweiterbar machen. Zum Zeitpunkt der Entwicklung kenne ich leider noch nicht alle Anforderungen an die Datenbank Tabellen.

Beispiel:

Ich habe ein kleine Adressverwaltung geschrieben. Die Datenbanktabelle wie so aus:

Kontakte
IDVornameName
1Ich bin ein VornameIch bin ein Name
2Vorname bin ichName bin ich

Angenommen wir wollen jetzt einen weiteren Wert in der Tabelle speichern, ohne diese zu verändert. In der aktuellen Tabelle ist das nicht so einfach möglich. Ich habe mir dazu folgendes überlegt:

Eine zweite Tabelle anlegen, die auf die erste referenziert. Konkret sieht das so aus:

KontakteErweiterung
IDKontakteIDTypZahlZeichenketteDatum
11Geburtsdatum<null><null>20.01.2000
21Alter20<null><null>
31Telefonnummer<null>+49123456789<null>
42Geburtsdatum<null><null>01.01.2000
52Telefonnummer<null>+49987654321<null>

Mit der Tabelle KontakteErweiterung ist meine Tabelle Kontakte quasi endlos erweiterbar mit den drei Datentypen Zahl, Zeichenkette und Datum.

Gibt es eine Möglichkeit das mit JPA abzubilden? Wünschenswert wäre etwas, was so flexibel ist, dass man quasi jede beliebige Tabelle so weitern kann. Ich könnte mir sowas vorstellen:

Code:
public class Kontakte extends Erweiterung

Es wäre doch cool, wenn allein durch die Vererbung die DB Tabelle angelegt wird. Geht sowas irgendwie?

Viele Grüße

ProChris
 

ProChris

Mitglied
Das klingt schon recht gut. Kann man das auch dynamisch umsetzen? Nach diesem Konzept müsste ich für jede Datenbanktabelle, die ich erweitern möchte eine eigene Klasse anlegen. Ich hätte gerne nur eine Erweiterung Klasse.

Beispiel:

Code:
public class Kontakte extends Erweiterung
public class Projekte extends Erweiterung
public class Kunden extends Erweiterung

Nach dem Beispiel muss ich für jede der Entität eine Erweiterungsklasse programmieren, weil die Annotation den Namen der Datenbanktabelle enthält: @Table(name="TABLENAME")
 

ProChris

Mitglied
Hallo zusammen,

ich habe es geschafft. :) Für alle die es interessiert, wir ich es gelöst habe.

Hier eine Klasse Kunden, die in der Datenbank die Tabelle Kunden mit drei Feldern anlegt. Die Felder sind: ID, VORNAME, NAME
Java:
@Entity
@Table(name = "KUNDEN")
public final class Kunden extends AbstractErweiterung
{
    private String nachname;

    private String vorname;

    public Kunden()
    {

    }

    public String getNachname() {
        return this.nachname;
    }

    public void setNachname(final String nachname) {
        this.nachname = nachname;
    }

    public String getVorname() {
        return this.vorname;
    }

    public void setVorname(final String vorname) {
        this.vorname = vorname;
    }
}

Diese abstrakte Klasse legt die *_ERWEITERUNG Tabelle an. In dieser Erweiterung Tabelle sind alle nützlichen Datentypen enthalten.

Java:
@MappedSuperclass
public abstract class AbstractErweiterung
{
    @Id
    private final String id;

    @ElementCollection
    @OneToMany
    private Map<String, ErweiterungWerte> erweiterung;

    protected AbstractErweiterung()
    {
        super();

        this.id = UUID.randomUUID().toString();
        this.erweiterung = new HashMap<>();
    }

    public void setStringWert(final String name, final String stringWert)
    {
        final ErweiterungWerte erweiterungWerte = new ErweiterungWerte();

        erweiterungWerte.setStringWert(stringWert);

        this.erweiterung.put(name, erweiterungWerte);
    }

    public String getStringWert(final String name)
    {
        return this.erweiterung.get(name).getStringWert();
    }
// ToDo: Alle anderen Methoden müssen noch hinzugefügt werden.
}

Java:
@Embeddable
public final class ErweiterungWerte
{
    private Boolean booleanWert;

    private Integer integerWert;

    private Double doubleWert;

    private String stringWert;

    private Date dateWert;

    public ErweiterungWerte()
    {

    }

    public Boolean getBooleanWert() {
        return this.booleanWert;
    }

    public void setBooleanWert(final Boolean booleanWert) {
        this.booleanWert = booleanWert;
    }

    public Integer getIntegerWert() {
        return this.integerWert;
    }

    public void setIntegerWert(final Integer integerWert) {
        this.integerWert = integerWert;
    }

    public Double getDoubleWert() {
        return this.doubleWert;
    }

    public void setDoubleWert(final Double doubleWert) {
        this.doubleWert = doubleWert;
    }

    public String getStringWert() {
        return this.stringWert;
    }

    public void setStringWert(final String stringWert) {
        this.stringWert = stringWert;
    }

    public Date getDateWert() {
        return this.dateWert;
    }

    public void setDateWert(final Date dateWert) {
        this.dateWert = dateWert;
    }
}

Was mich interessiert, seht ihr Verbesserungspotential?

Viele Grüße

ProChris
 

Dukel

Top Contributor
Alternativ kann man z.B. JSON nutzen, welches in modernen Datenbanken Einzug findet. Dann kann man den Dynamischen Teil beliebig erweitern.
 

LimDul

Top Contributor
Ich glaube auch nicht, dass das mit JPA Bordmitteln geht. Meine persönliche Meinung dazu ist: Das ist ein Datenbanklayout, was man tunlichst vermeiden sollte und der Normalisierung widerspricht.

Es ist unübersichtlich (weil die Daten zu einer Entität nicht in einer Tabellenzeile stehen sondern in mehreren) macht Querys deutlich komplexer (Liefere mir alle Daten zu allen Kontakten die mit Nachnamen Max heißen - dann bekomme ich gg. 50 Zeilen, wovon 30 zu Max Mustermann und 20 zu Max Müller gehören - dass muss ich mir dann aber in Java zusammenstricken, in der Datenbank geht das kaum).

Sinnvoll ist das meines Erachtens nur, wenn ich diese Daten, die ich in der Erweiterung speichere nicht fest in meinen Klassen habe, sondern die dynamscih zur Laufzeit angelegt werden (z.B. in einer Key/Value Map). Dann wiederrum muss ich mir aber überlegen, wie ich in Map in JPA speichere. Darüber könnte man dass ggf. lösen. Aber wenn ich die Werte wirklich als fixe Variablen habe, dann gehören die auch in die Kontakte Tabelle rein und die Tabelle um die Spalten erweitert.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
F MySQL Aufbau der Datenbanktabelle Datenbankprogrammierung 2
E Wie kann ich textdateien, die als BLOB abgespeichert sind, aus der Datenbanktabelle auslesen? Datenbankprogrammierung 23
M Warum ist es suboptimal viele Indexe auf eine Datenbanktabelle zu setzen? Datenbankprogrammierung 4
N Java-Objekt dynamisch aus Datenbanktabelle erzeugen? Datenbankprogrammierung 4
V Datenbanktabelle kopieren Datenbankprogrammierung 2
T Inhalt einer Datenbanktabelle autom. in XML ausgeben Datenbankprogrammierung 7
X Daten einer DatenbankTabelle in JTable darstellen Datenbankprogrammierung 13
S verschiedene Teile einer Datenbanktabelle Datenbankprogrammierung 3
M MySQL Datenbanktabelle erstellen Datenbankprogrammierung 10
L Struktur einer vorhandenen Datenbanktabelle ändern Datenbankprogrammierung 8
M Derby/JavaDB Kleine DB mit Tabelle erweitern - Integrität - Alter-Table - Netbeans ... Datenbankprogrammierung 5
Zed PostGresSQL: Tabele um Colum erweitern Datenbankprogrammierung 3
S ResultSet erweitern ? Datenbankprogrammierung 4
S MongoDB löschung ohne Cascade Datenbankprogrammierung 1
D OpenJPA Zeichenvorrat in DB & Fremdschlüssel ohne Entität Datenbankprogrammierung 5
B Inner Join ohne SQL Syntax Datenbankprogrammierung 2
M MySQL Verbindung zum Server aufbauen ohne DB ansprechen Datenbankprogrammierung 2
ruutaiokwu sql abfrage mit rekursion, mit oder ohne cte... Datenbankprogrammierung 5
X MySQL DB-verbindung ohne JDBC/ODBC Datenbankprogrammierung 1
N SQL-Injection verhindern OHNE PreparedStatements Datenbankprogrammierung 11
D Hibernate CreateQuery ohne Result Datenbankprogrammierung 7
R PreparedStatement ohne Parameter? Datenbankprogrammierung 4
P SQL Injection verhindern ohne z.B. prepareStatement Datenbankprogrammierung 2
eskimo328 Datenbankverbindung ohne Passwort im Quelltext bei einer offline Anwendung Datenbankprogrammierung 14
Kenan89 Insert ohne Auswirkung Datenbankprogrammierung 7
D MySQL User mit nur mit lokalen Lesezugriff und ohne Phpmyadmin Datenbankprogrammierung 4
J Derby/JavaDB Zugriff ohne Entwicklungsumgebung Datenbankprogrammierung 5
M MySQL Bilddatei in MYSQL DB abspeichern, ohne lokal auf HDD zwischenzuspeichern Datenbankprogrammierung 3
Screen Ich suche eine SQLDatenbank ohne JDBC-Treiber Datenbankprogrammierung 12
T mdb Verbindung ohne Registrierung der Datenquelle im OS Datenbankprogrammierung 14
V MySQL MsSql ohne Server nutzen? Datenbankprogrammierung 2
NoXiD Access Datenbank in java einbinden ohne ODBC treiber zu erstellen Datenbankprogrammierung 5
T MySQL Zugriff ohne Angabe der Datenbank Datenbankprogrammierung 3
B MySQL-Dumpdatei ohne Batchdatei wieder einlesen Datenbankprogrammierung 48
M Mysql Delete ohne Where Klausel untersagen Datenbankprogrammierung 8
P JPA Datenbanksettings ohne persistence.xml Datenbankprogrammierung 3
E DB installieren ohne Installationsroutine Datenbankprogrammierung 4
V Delete From Tabelle, ohne vorher die Tabelle zu kennen Datenbankprogrammierung 5
P Datenbank für Java Anwendung wie SQLite ohne Installation Datenbankprogrammierung 4
M MySQL: Spalte auf einmal füllen, ohne iterieren zu müssen Datenbankprogrammierung 4
S Datenbank zugriff optimieren - zugriff ohne cursor? Datenbankprogrammierung 7
J HSQLDB ohne JDBC Datenbankprogrammierung 8
L einfache Datenbankabfrage ohne erstes Element Datenbankprogrammierung 2
D An Access Datenbank andocken ohne sie beim System anzumelden Datenbankprogrammierung 3
D ODBC Zugriff auf MDB-Datenbank, Insert Into ohne Funktion Datenbankprogrammierung 2
G Access mit Java OHNE ODBC Datenbankprogrammierung 7
B ResultSet ohne Datenbank erstellen Datenbankprogrammierung 4
G Datenbank ohne Server Datenbankprogrammierung 28
C Datenbankanbindung ohne ODBC JDBC Brücke Datenbankprogrammierung 5
R Datenbank ohne Installation (Multiuser) Datenbankprogrammierung 9
E jdbc Verbindung ohne Einrichten einer DSN möglich ? Datenbankprogrammierung 3
clemson [SQL] Abfrage --> alle Gruppen, ohne MailConfig Datenbankprogrammierung 10
O Datenbankzugriff "ohne" Server ? Datenbankprogrammierung 9
A Java und Accessdateien ohne ODBC? Datenbankprogrammierung 2

Ähnliche Java Themen

Neue Themen


Oben