JPA: Mapping von bestehender DB

Status
Nicht offen für weitere Antworten.

mr-gurke

Mitglied
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
 

GilbertGrape

Bekanntes Mitglied
Hallo,

also zunächst mal: ich fand das Tutorial direkt von Hibernate ganz gut, also das hier: HIBERNATE - Relational Persistence for Idiomatic Java

Achso, ich weiß natürlich nicht, ob du überhaupt Hibernate verwenden willst, aber ich geh mal davon aus :bae:

Also, so wie ich dich verstanden habe, möchtest du Reverse Engineering machen? Also anhand deiner Tabellen die Entitys erzeugen lassen? Oder willst du nur generell wissen wie man Beziehungen und sowas erstellt?

Reverse Engineering kann man mit HibernateTools machen, dazu hier ein Link: Hibernate Tools || IT-Republik - JAXenter - Artikel
Oder auch mit MyEclipse, aber das ist kostenpflichtig.

Gruß, GG
 

mr-gurke

Mitglied
Plattform ist JavaEE mit Glassfish als ApplicationServer. Und da ist JPA (Java Persistance API, Klon von Oracles Toplink) und die JavaDB (auf die hab ichs derzeit zum Entwickeln gepackt, später Oracle) mit dabei.

Aber wenn es mit Hibernate wesentlich besser und eleganter lösbar ist, dürfte es auch kein allzugroßer Aufwand sein umzusteigen.

An Reverse Engineering dachte ich noch gar nicht - habe die ersten Versuche jetzt manuell gemacht.

Gruß mr-gurke
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen


Oben