# [EclipseLink] Best Practise zur Generierung von Entities aus Tabellen



## n3 (9. Jun 2011)

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:


```
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


----------



## gman (9. Jun 2011)

> 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.


----------



## Wildcard (9. Jun 2011)

Hast du dir schonmal EMF angesehen?
Eclipse Modeling - EMF - Home
Dann zB Teneo für die EclipseLink Anbindung.
Teneo/EclipseLink - Eclipsepedia


----------



## Gast2 (10. Jun 2011)

Würde dir aber eher EMF Texo vorschlagen.
Texo - Eclipsepedia


----------



## n3 (12. Jun 2011)

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 (12. Jun 2011)

> 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 (13. Jun 2011)

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 (13. Jun 2011)

> 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 (13. Jun 2011)

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.


----------



## Gast2 (14. Jun 2011)

n3 hat gesagt.:


> 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 (14. Jun 2011)

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?


----------



## Gast2 (14. Jun 2011)

n3 hat gesagt.:


> 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 (14. Jun 2011)

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.


----------



## Gast2 (14. Jun 2011)

n3 hat gesagt.:


> 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 (14. Jun 2011)

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


----------



## Gast2 (14. Jun 2011)

n3 hat gesagt.:


> 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.


----------



## maki (14. Jun 2011)

> 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 (14. Jun 2011)

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


```
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


----------



## maki (14. Jun 2011)

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.


----------



## gman (14. Jun 2011)

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 (14. Jun 2011)

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.


----------



## maki (14. Jun 2011)

> 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 (14. Jun 2011)

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.


----------



## gman (14. Jun 2011)

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:


```
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


----------



## schalentier (14. Jun 2011)

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 (14. Jun 2011)

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.


----------



## n3 (15. Jun 2011)

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.


```
@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?


----------



## Gast2 (15. Jun 2011)

n3 hat gesagt.:


> 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


----------



## gman (16. Jun 2011)

> 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.


----------

