[EclipseLink] Best Practise zur Generierung von Entities aus Tabellen

n3

Mitglied
Hallo,

ich habe ein JSF Projekt mit einer MySQL Datenbank und als JPA kommt EclipseLink zum einsatz.

Zur Generierung der Klassen, habe ich das folgende Tutorial verwendet:
Generating a JavaServer Faces 2.0 CRUD Application from a Database - NetBeans IDE 6.8/6.9 Tutorial

Es werden pro Tabelle drei Dateien erstellt. Beispiel Anhand der Tabelle 'User':
User, UserController, UserJpaController

Ich nutze zwar Eclipse als IDE, aber wenn ich hiermit den Code generiere, dann wird nur eine Klasse mit getter und setter erstellt, aber keine CRUD-Methoden. Zudem wird bei der Generierung der Buchstabe 's' entfernt, sofern sich dieser am Wortende befindet. Beispiel: 'lis' -> 'li'

Im Grunde wollte ich wissen, was das beste Verfahren ist, um den Code zu generiern und zu nutzen. Ich würde jetzt so vorgehen, dass ich jede generierte Klasse erweitern würde, um dort eigenen Code zu schreiben. Dieser würde dann nicht verloren gehen, sollte ich die Entitäten neu generieren lassen. Zudem würde ich den generierten Klassen das Prefix 'Base' anfügen. Beispiel:

Java:
User extends BaseUser
UserController extends BaseUserController
UserJapController extends BaseUserJpaController

Ich weiß aber nicht, ob das jetzt sinnvoll ist, oder ob es eine bessere Lösung gibt. Ich hoffe, dass mir jemand etwas helfen kann.

Gruß,
n3
 
G

gman

Gast
Ich nutze zwar Eclipse als IDE, aber wenn ich hiermit den Code generiere, dann wird nur eine Klasse mit getter und setter erstellt

Eclipse generiert dir nur die Entity-Klassen. Die Codegenerierung von Netbeans geht da viel weiter, dient aber eher dazu
schnell was lauffähiges zu haben oder nur eine einfache CRUD-Anwendung zu erstellen.

Zudem wird bei der Generierung der Buchstabe 's' entfernt, sofern sich dieser am Wortende befindet. Beispiel: 'lis' -> 'li'

Versteh ich jetzt nicht. Bei welchen Codebestandteilen denn? Klassen, Variablen?

Ich würde jetzt so vorgehen, dass ich jede generierte Klasse erweitern würde, um dort eigenen Code zu schreiben.

Generierter Code sollte nicht mehr angepasst werden (ja, es kann ausnahmen geben). Bei JSF werden die Entity-Klassen
so gelassen wie sie sind und der eigene Code in verschiedene Schichten darüber gepackt (siehe z.B. hier).
Wenn du trotzdem eigenen Code hinzufügst (z.B. equals und hashCode usw) dann kannste ja die Dateien ins SCM
stecken und wenn die Dateien neu generiert wurden deine Änderungen daraus wieder übernehmen.
 

n3

Mitglied
Sorry für die späte Meldung melden, aber ich komme leider erst jetzt zum antworten.

Versteh ich jetzt nicht. Bei welchen Codebestandteilen denn? Klassen, Variablen?
Also wenn man eine Tabelle names user hat, erstellt Eclipse daraus eine Klasse user. Ich habe jetzt aber eine Tabelle lis und Eclipse erstellt anstelle der passenden Klasse lis die Klasse li

Generierter Code sollte nicht mehr angepasst werden (ja, es kann ausnahmen geben). Bei JSF werden die Entity-Klassen
so gelassen wie sie sind und der eigene Code in verschiedene Schichten darüber gepackt (siehe z.B. hier).
Ja das meine ich. Ich will die generierten Klassen nicht anpassen, sondern erweitern. Also eine Schicht drüber packen. Angenommen ich habe eine Tabelle user, dann möchte ich mir die Klasse BaseUser erstellen lassen. Nun erstelle ich eine eigene Klasse User, die BaseUser erweitert.
Ich kann dann immer auf User zugreifen und habe meine eigenen Methoden und auch die generierten. Ich kenne diese Methode vom Symfony Framework für PHP.

@Wildcard & SirWayne
Danke für die zwei Tipps. Ich denke nicht das ich unbedingt bei EclipseLink bleiben muss. Einzige Voraussetzung ist, dass es über eine WAR auf einem TomCat deployed werden kann. Ich suche einfach eine Methode, womit ich, basierend auf der DB, Klassen erstellen kann um objektorientiert auf die DB zuzugreifen und wo die Standard Methoden (CRUD) bereits generiert werden. Ich habe Teneo und Texo kurz überflogen und glaube das Texo das ist was ich suche. Liege ich richtig? Die Frage stelle ich nur, weil ich etwas unter Zeitdruck bin und ungern Stunden der Recherche investiere, um dann herauszufinden, dass es nicht passt :rtfm: Über eine "Jup, dass ist genau das was du suchst" würde ich mich also sehr freuen ;)
 

Wildcard

Top Contributor
Danke für die zwei Tipps. Ich denke nicht das ich unbedingt bei EclipseLink bleiben muss
Sowohl Teneo als auch Texo sind EclipseLink kompatibel. Der Vorteil ist, beide basieren auf EMF (ein Modellierungstool um Modelle und passende Java Klassen zu erstellen) und EMF Modelle haben viele Vorteile, darunter:
-Listener Schnittstelle
-Validierung
-Serialisierung austauschbar, zB relational (zB mit EclipseLink), XML, XMI, textuell, oder binär
-Compare Framework um Diff und Match Modelle zu berechnen
-hochperformant
-Klassen können händisch nachbearbeitet werden und beim Neugenerieren wird automatisch gemerged
(händische Änderungen bleiben also erhalten)
-EMF kann komplette CRUD Editoren generieren wahlweise als Eclipse Editor, GWT, oder RAP Anwendung
und vieles mehr.
 

n3

Mitglied
Wenn ich das richtig verstehe, dann ist EclipseLink ein ORM Werkzeug welches die Basis für Texo und Teneo bildet. Texo und Teneo sind dabei EMF Werkzeuge. Oder kann ich mit EclipseLink und Hibernate ebenfalls den Code generieren, denn ich benötige? So wie ich das verstanden habe, nein.

In Zusammenhang mit EMF, habe ich eher Teneo gefunden. @SirWayne, kannst du mir vielleicht sagen, wieso du Texo vorziehen würdest? Mir wird der Unterschied bzw. der Vorteil gegenüber Teneo nicht ganz klar.
 

Wildcard

Top Contributor
In Zusammenhang mit EMF, habe ich eher Teneo gefunden. @SirWayne, kannst du mir vielleicht sagen, wieso du Texo vorziehen würdest? Mir wird der Unterschied bzw. der Vorteil gegenüber Teneo nicht ganz klar.
Beide Projekte sind von den gleichen Entwicklern. Mit EMF generierte Klassen erweitern normalerweise EObject und erben damit viel Funktionalität. Mit Texo kann man stattdessen Pojos ohne EMF Dependency generieren und sie zur Laufzeit bei Bedarf in 'volle EMF Objekte umwandeln'.
 

n3

Mitglied
Danke für die Erklärung. Wie gesagt bin ich in den Thema noch nicht drin und ich vermute einfach, dass die Funktionalität, die man mit Teneo gleich hat, die aus deinem letzten Post gestern ist. Ich vermute dann mal, dass ich für ein nicht allzu komplexes Webtool Texo verwenden sollte.
 
G

Gast2

Gast
Danke für die Erklärung. Wie gesagt bin ich in den Thema noch nicht drin und ich vermute einfach, dass die Funktionalität, die man mit Teneo gleich hat, die aus deinem letzten Post gestern ist. Ich vermute dann mal, dass ich für ein nicht allzu komplexes Webtool Texo verwenden sollte.

Mit Texo werden wie oben erwähnt Pojos generiert und ein orm.xml 2.0 file. Dafür fehlen dir die EMF Funktonalitäten.
Mit Teneo wird noch 1.2 generiert.
 

n3

Mitglied
Danke für die Erklärung.

Ich habe noch etwas weiter im Netz gesucht, um mich mit dem Thema vertraut zu machen und bin bei JSF auf EJB, DAO usw. gestoßen. So wie ich das verstanden habe, kann ich ganz normale mit JPA die Entitäten erstellen lassen und daraus EJBs, welche die DAOs sind. In den EJB sollten dann die CRUD Methoden stehen.

Ich will das gerade testen und wenn das so richtig ist, dann benötige ich doch theoretisch kein Texo/Teneo, oder?
 
G

Gast2

Gast
Ich will das gerade testen und wenn das so richtig ist, dann benötige ich doch theoretisch kein Texo/Teneo, oder?

Nein es gibt genügend andere Tools, welche dir Klassen generieren. Aber EMF ist eben ein mächtiges Tool und ich verstehe dein Sorgen gerade nicht. Für deine kleine Anwendung hast du dein EMF Modell in 10 min. Solange wie du damit rummachst hättest schon längst testen können ;).

Hier ist ein kleiner Einstieg in EMF
Eclipse Modeling Framework (EMF) - Tutorial
 

n3

Mitglied
Meine Sorge ist derzeit nur, dass mir der allgemeine Überblick noch fehlt. Ich will etwas verstehen, bevor ich mich entscheide ;)

Ich habe versucht das Tutorial zu machen, aber wie jedes Tutorial welches ich bisher gefunden habe, erstellt man das Modell erst mit Eclipse und dann wird es in der Datenbank erzeugt. Ich habe aber die Datenbank bereits und will aus der Datenbank heraus alles erstellen. Hierfür finde ich keine Option und kein Tutorial :-/ Daher kann ich nicht so ganz nachvollziehen, wie mir EMF/Teneo/Texo helfen sollen.

Vielleicht ist diese Frage für euch sehr primitiv, aber für mich ist es nun mal nicht ganz klar :-/ Ich hätte ja schon was probiert, aber wie gesagt, ich finde nichts, wo ich aus der Datenbank heraus den Code generieren kann.
 
G

Gast2

Gast
Vielleicht ist diese Frage für euch sehr primitiv, aber für mich ist es nun mal nicht ganz klar :-/ Ich hätte ja schon was probiert, aber wie gesagt, ich finde nichts, wo ich aus der Datenbank heraus den Code generieren kann.

heeee ???:L??? Du wirst aus der Datenbank auch keinen Code bekommen.

Deine Überlegungen sind auch falsch rum. Du solltest in Objekten und Models denken und nicht in Tabellen ;)
 

n3

Mitglied
In dem Tutorial wird das Modell doch in Eclipse erstellt. Ich möchte aber, dass das Modell anhand einer bestehenden Datenbank erstellt wird.
 
G

Gast2

Gast
In dem Tutorial wird das Modell doch in Eclipse erstellt. Ich möchte aber, dass das Modell anhand einer bestehenden Datenbank erstellt wird.

Das Model wird aus einer ecore Datei erstellt und darin ist dein Model abgebildet, welches du für deine Anwendung definierst. Das Model ist das Kernstück deiner Andwendung.

Es gibt nichts mit Datenbank-->Java klassen...

Es gegt noch Model-->JPA-->generiert die DB z.B. Hibernate kann sowas.
 
M

maki

Gast
Vielleicht ist diese Frage für euch sehr primitiv, aber für mich ist es nun mal nicht ganz klar :-/ Ich hätte ja schon was probiert, aber wie gesagt, ich finde nichts, wo ich aus der Datenbank heraus den Code generieren kann.
Die Frage ist nicht "primitiv", ganz im Gegenteil, ein Modell aus der DB generieren zu lassen nur mit EclipseLink oder Hibernate ist eher etwas für Leute mit Erfahrung in ORM, für Anfänger ist der "normale" Weg, also Java -> Mapping -> DB generieren lassen der bessere, weil einfachere.

Ist denn die DB schon mit Daten befüllt?
Oder hast du einfach ein ER Mdoell erstellt und versuchst dieses nun nach JPA zu "migrieren"?
 

n3

Mitglied
Ok, dann benötige ich etwas wie DB -> Model.

Die zugrunde liegende Datenbank ist etwas größer und bereits mit Daten gefüllt. Zudem wird sie immer wieder mal angepasst. Daher löst das einmalige generieren des Modells das Problem nicht. Wenn ich aus der DB das Modell und daraus die Klassen generiere, soll mein eigener Code beim erneuten generieren des Modells und der Klassen nicht überschrieben werden. Daher mein Lösungsansatz mit

Java:
class User extends BaseUser

Diese Funktionalität ist scheinbar in Netbeans integriert. Zu mindestens gibt es ein Tutorial was das verspricht:
Generating a JavaServer Faces 2.0 CRUD Application from a Database - NetBeans IDE 6.8/6.9 Tutorial
 
M

maki

Gast
Dazu gibt es ein Muster, nennt sich "Generation Gap", bin aber der Meinung, dass eine MeetInTheMiddle vorgehensweise doch geeigneter wäre, einfach mal so die Basisklassen der Vererbungshierarchie ändern verursacht doch mehr Änderungen als man denkt.
Beim MeeInTheMiddle gibt es einerseits ein OO Model, andererseits eine fertiges Schema, dann musst du noch ein Mapping dazwischen bauen.
 
G

gman

Gast
Nochmal nachgehakt: Was genau codest du denn selbst in die Entity-Klassen? Wenn es nur equals, hashCode, usw.
sind kann man die ja nach jedem Generieren aus dem SCM wieder zurückholen.
Alles was mehr in Richtung Buisnesslogik oder Services geht sollte eigentlich in eine eigene Schicht gepackt werden.
Ich richte mich gerne mal nach diesem Beispiel, sieht für die kleine Anwendung nach Overkill aus aber es
ergibt schon Sinn.

Hoffe es hilft dir weiter.
 

n3

Mitglied
Ich habe in Erfahrung gebracht, dass man mit Netbeans erst Entitäten aus der DB erstellen kann. Basierend auf den Entitäten kann man dann EJBs erstellen und daraus dann JSFMBs. Das Problem hierbei ist, dass Java EE 6 Voraussetzung ist, da erst ab version 6 EJBs in einem Web Projekt erlaubt sind. Da ich aber Tomcat 6 verwenden muss, kann ich nur auf Java EE 5 zurückgreifen und das Unterstützt es einfach nicht. Somit kann ich derzeit nur Entitäten aus der DB erstellen.

@maki
Ich verliere da den Überblick zwischen EMF, Texo, Teneo, MeetInTheMiddle...

@gman
Ich glaube das Beispiel was du verlinkt hast, geht in die richtige Richtung. Ich formuliere meine Frage aber mal neu, denn ich glaube das ich einiges durcheinander bekommen habe.

Basierend auf Tomcat 6 und Java EE 5 möchte ich eine JSF Web Anwendung entwickeln. Die Datenbank hierzu habe ich bereits. Ich suche jetzt nach einer schnellen und einfachen Lösung, um Daten aus der DB zu lesen und im Web darzustellen und eben auch Benutzereingaben in die DB zu speichern.
Zudem habe ich am Anfang mit IceFaces gespielt. Ich glaube jetzt aber, dass durch die neue Version 2.0 von JSF IceFaces nicht mehr so viele Vorteile hat. Da die Datentabellen von JSF nicht sonderlich viel können, würde ich gern MyFaces Tomahawk verwenden.

Ich bin was die Entwicklung in Java angeht noch sehr unerfahren und daher würde ich mich freuen, wenn mir jemand ein passendes Tutorial oder ähnliches empfehlen könnte.

Danke nochmals für die bereits geleistete Hilfe.
 
M

maki

Gast
Ich bin was die Entwicklung in Java angeht noch sehr unerfahren und daher würde ich mich freuen, wenn mir jemand ein passendes Tutorial oder ähnliches empfehlen könnte.
n3, willl dich nicht verunsichern, aber JEE Entwicklung ist schon eine Herausforderung für Leute die seit Jahren Java entwickeln, speziell JSF und JPA sind schon sehr komplex mit einer sehr steilen Lernkurve, würde dir raten dich nicht gleich in so ein großes Projekt zu stürzen, sondern estmal kleinere Brötchen zu backen (die dann auch fertig werden und gut sind ;)).

"Tomcatentwicklung" gibt es nicht, es gibt eine Reihe von Spezifikationen (Servlet Spec., JSF Spec.etc. pp.) die festlegen, was ein ServletContainer können muss (Tomcat ist so einer zB.), du würdest nach einem JSF TUtorial suchen, Servletgrundlagen solltest du auch draufhaben.

MeeInTheMiddle ist übrigens kein Tool sondern eine Vorgehensweise.
 

n3

Mitglied
Der Herausforderung muss ich mich stellen. Ich denke, dass meine beschriebene Anforderung nicht so komplex sein kann. Aber ich kann mich natürlich irren. Ich habe mir auch schon ein JSF Buch durchgelesen, aber einmal durchlesen reicht nicht ;) Es fördert aber das Grundverständnis.

Das MeetInTheMiddle eine Vorgehensweise und kein Tool ist, war mir bewusst. Ich wollte damit nur ausdrücken, dass ich erst einmal einen Einstieg brauche, damit ich alle diese Sachen verstehe und vor allem umsetzen kann.

Das Problem an den meisten Tutorials ist, dass sie immer nur eine Sache zeigen. Ich brauche aber eines, wo ich sehe, wo welche Klassen gespeichert werden sollte, wie man am besten die Daten des Benutzers verarbeitet usw. Ich glaube das Beispiel von gman geht in die richtige Richtung.
 
G

gman

Gast
Das von mir verlinkte Beispiel würde so auch auf einem Tomcat laufen. Konkret wird in der
README beschrieben wie man das Projekt baut und auf einem Jetty laufen lässt.
Wenn du nicht zwingend EJB und den ganzen anderen JEE-Kram brauchst, kannst du dir auch
die Rosinen (JSF 2.0 und JPA 2.0) rauspicken und das Projekt auf einem Tomcat laufen lassen.
Wenn du Maven benutzt ist es sogar ziemlich einfach ein Beispielprojekt zu erstellen:

Code:
mvn archetype:generate -DarchetypeCatalog=http://myfaces.apache.org

und dann die "11" wählen -> " myfaces-archetype-codi-jsf20" (hier beschrieben).

Man kann aber auch mit Eclipse-Bordmitteln so ein Projekt erstellen:

JSF-Tutorial

JPA-Tutorial
 
Zuletzt bearbeitet von einem Moderator:

schalentier

Gesperrter Benutzer
Ich weiss, das hier ist ein Java Forum etcetc, dennoch (der Vollstaendigkeit halber): Ruby On Rails geht nach dem vom TO beschriebenen Schema vor (Aus der DB Struktur werden die DB-Access-Klassen erstellt). Es gibt dort auch einen Mechanismus, um dann entsprechende Controller und Views fuer einfache CRUD Operationen zu generieren (Scaffolding). Im Tomcat laeufts auch (mit JRuby). Nur so als Info, falls das mit Java noch nicht absolut felsenfestgeschrieben sein sollte).
 

n3

Mitglied
Theoretisch kann ich mir die Rosinen raus picken. Ich werde mal die Tutorials durch arbeiten. Danke!

@Schalentier
RubyOnRails ist leider keine Option

Edit:
Ok, ich habe mir die Tutorials durchgelesen und soweit bin ich ja. Ich habe schon einige JSF Seiten erstellt und jetzt will ich die Masken mit den Daten aus der DB füllen. Hier hänge ich grad :-/ Ich weiß nur nicht wie ich den Controller am besten erstelle und was ich am einfachsten generieren kann.
 
Zuletzt bearbeitet:

n3

Mitglied
Ich habe mich heute nochmal etwas informiert und ich bin scheinbar total auf dem falschen Weg.

Ein Architekturbeispiel ist:
JSF-View -> Managed Bean - > Modell-Objekte -> DB

Die Modell-Objekte sind die Entitäten die ich mit JPA erstellen kann. Um ein Objekt dann zu speichern, kann ich einfach den EntityManager verwenden.

Java:
@PersistenceContext
private EntityManager em;
...
public String save(){
  ...
  em.persist(newUser);
  ...
}

Daher konnte ich auch keine Beispiele im Internet finden, wie man CRUD Methoden generieren kann, da diese Funktionalität ja durch den EntityManager, welcher ein Bestandteil von JPA ist, realisiert wird.

Soweit richtig, oder?
 
G

Gast2

Gast
Daher konnte ich auch keine Beispiele im Internet finden, wie man CRUD Methoden generieren kann, da diese Funktionalität ja durch den EntityManager, welcher ein Bestandteil von JPA ist, realisiert wird.

Soweit richtig, oder?

Deine Modelobjekte greifen nicht auf deine DB zu meistens hast du noch einen Service und ein DAo für z.B. Transaktionhandling dazwischen...

Du kannst dir aber die Entitäten und Model Objekte usw. generieren lassen. Und w;)
 
G

gman

Gast
wie man CRUD Methoden generieren kann

Dieses Tutorial zeigt was man alles mit Netbeans generieren kann. Aber Eclipse kann (soweit ich weiss) "nur"
die Entity-Klassen generieren. Aber das sollte in deinem Fall ja auch reichen. In der DAO- oder Service-Schicht
kannst du dann ja deinen speziellen Code einbringen.
 

Ähnliche Java Themen


Oben