Hi,
ich stehe gerade vor einem Designproblem.
Ich habe eine Datenbank mit etwa 30 Tabellen. Ein drittel der Felder ist mit Werten belegt, ein drittel mit Foreign Keys zu anderen Tabellen in einer n:1 Beziehung (Also die Maintabelle enthält in der Spalte Hersteller z.B. die Zahl 4, die Tabelle Hersteller enthält als id diese Ziffer und den Firmennamen, Anschrift, ... also z.B. 4, IBM, USA, ... oder ist das ne 1:n Beziehung (von der Maintabelle aus gesehen?). Der Rest der Felder ist ein Foreign Key zu einer Verknüpfungstabelle, in der der Maintabelle mehrere Einträge aus einer weiteren Tabelle zugeordnet sind.
Die Herausforderung ist nun diese Datenbankstruktur (die schon mehrfach vorher verbogen wurde um mit wenig Aufwand noch Änderungen hinzubekommen) in einem EJB zuverwenden und sie mittels JPA abzubilden. Änderungen in der Struktur sind nur schwer durchführbar, da die ganze DB etwa 500 Spalten in den Tabellen enthält und insgesamt mehrer tausend Datensätze eingeben sind und in produktiver Verwendung ist. Daher ist eine Strukturänderung nur der letzte Ausweg.
Ich habe schon etliches mit JPA probiert, komme aber noch nicht so richtig ins rollen.
Ist eine Entity überhaupt umsetzbar, die mehrere andere Entities als Attribute hat?
Also z.B.
[highlight=Java]
@Entity
class Produkte implements Serializable {
@Id
private int id;
private String name;
@ManyToOne
private Hersteller hersteller; // Hersteller ist wiederum eine Entity und als int in der DB
private Set<Haendler> haendler; // Haenlder ist eine Entity und ein Produkt wird von mehreren Haendlern vertrieben
private int herstellungsStatus; // HerstellungsStatus (wird das noch produziert, läuft bald aus, ...) ist wiederum eine Tabelle
... getter und setter und default Konstruktor
}
@Entity
class Hersteller implements Serializable{
@Id
private int id;
private String name;
private String land;
...
}
[/highlight]
Wunschziel ist jetzt, dass in jedem Produktobjekt, nachdem die Daten aus der DB geladen wurden, alle Attribute "aufgelöst" sind. Also produkt.getHersteller().getName() soll den Herstellernamen liefern, produkt.getHaendler().iterator() soll einen Iterator über die Händler liefern und getHerstellungsStatus() soll nicht das Interger liefern sondern gleich den HerstellungsStatus.
Sicherlich ist es einfacher jede Tabelle einzeln als Entity zu mappen und dann in den Session Beans alles zusammen zu stöpseln, aber nicht unbedingt empfehlenswert. Und einen "general-Join" über alle Tabellen will ich auch nicht.
Ist das mit JPA hinzubekommen und weiß jemand wo das JPA so erklärt ist, dass man versteht, wie man die Beziehungen umsetzt oder kann das jemand kurz erläutern?
Vielen Dank
ich stehe gerade vor einem Designproblem.
Ich habe eine Datenbank mit etwa 30 Tabellen. Ein drittel der Felder ist mit Werten belegt, ein drittel mit Foreign Keys zu anderen Tabellen in einer n:1 Beziehung (Also die Maintabelle enthält in der Spalte Hersteller z.B. die Zahl 4, die Tabelle Hersteller enthält als id diese Ziffer und den Firmennamen, Anschrift, ... also z.B. 4, IBM, USA, ... oder ist das ne 1:n Beziehung (von der Maintabelle aus gesehen?). Der Rest der Felder ist ein Foreign Key zu einer Verknüpfungstabelle, in der der Maintabelle mehrere Einträge aus einer weiteren Tabelle zugeordnet sind.
Die Herausforderung ist nun diese Datenbankstruktur (die schon mehrfach vorher verbogen wurde um mit wenig Aufwand noch Änderungen hinzubekommen) in einem EJB zuverwenden und sie mittels JPA abzubilden. Änderungen in der Struktur sind nur schwer durchführbar, da die ganze DB etwa 500 Spalten in den Tabellen enthält und insgesamt mehrer tausend Datensätze eingeben sind und in produktiver Verwendung ist. Daher ist eine Strukturänderung nur der letzte Ausweg.
Ich habe schon etliches mit JPA probiert, komme aber noch nicht so richtig ins rollen.
Ist eine Entity überhaupt umsetzbar, die mehrere andere Entities als Attribute hat?
Also z.B.
[highlight=Java]
@Entity
class Produkte implements Serializable {
@Id
private int id;
private String name;
@ManyToOne
private Hersteller hersteller; // Hersteller ist wiederum eine Entity und als int in der DB
private Set<Haendler> haendler; // Haenlder ist eine Entity und ein Produkt wird von mehreren Haendlern vertrieben
private int herstellungsStatus; // HerstellungsStatus (wird das noch produziert, läuft bald aus, ...) ist wiederum eine Tabelle
... getter und setter und default Konstruktor
}
@Entity
class Hersteller implements Serializable{
@Id
private int id;
private String name;
private String land;
...
}
[/highlight]
Wunschziel ist jetzt, dass in jedem Produktobjekt, nachdem die Daten aus der DB geladen wurden, alle Attribute "aufgelöst" sind. Also produkt.getHersteller().getName() soll den Herstellernamen liefern, produkt.getHaendler().iterator() soll einen Iterator über die Händler liefern und getHerstellungsStatus() soll nicht das Interger liefern sondern gleich den HerstellungsStatus.
Sicherlich ist es einfacher jede Tabelle einzeln als Entity zu mappen und dann in den Session Beans alles zusammen zu stöpseln, aber nicht unbedingt empfehlenswert. Und einen "general-Join" über alle Tabellen will ich auch nicht.
Ist das mit JPA hinzubekommen und weiß jemand wo das JPA so erklärt ist, dass man versteht, wie man die Beziehungen umsetzt oder kann das jemand kurz erläutern?
Vielen Dank