goldstift's blogspot my 2 cent

25 September 2011

SpringRoo: Entity-Klassen und JPA-Repositories mit SpringRoo erstellen

Dies ist der zweite Artikel in meiner Tutorial-Reihe zu SpringRoo 1.2.0 in der die Beispiel-Anwendung "photooapp" entwickelt wird.

Vorbedingungen

In diesem Beitrag geht es um die initiale Erstellung der Roo-Anwendung. Hierfür müssen folgende Vorbedingungen erfüllt sein:

Lokalen Datenbankserver installieren (falls notwendig)

Wir gehen davon aus, dass die Anwendung später mit einer MySQL 5.1-Datenbank betrieben werden soll, die auf dem gleichen Server läuft wie die Anwendung.
Um eine ähnliche Umgebung für die Entwicklung zu verwenden, benötigen wir eine lokale MySQL-Installation. Für diejenigen ohne eine lokale Installation ist die wohl einfachste und schnellste Art dies zu erreichen wahrscheinlich das XAMPP-Paket von Apachefriends. Es kann über die URL http://www.apachefriends.org/de/xampp.html heruntergeladen werden.

Ist die Software installiert und der MySQL-Datenbankserver gestartet, können mit den folgenden beiden Befehlen die Datenbank und der zugehörige Benutzer erstellt werden. Diese Befehle sind auch im MySQL-Setup-Skript enthalten:

$ /Applications/XAMPP/xamppfiles/bin/mysql -u root -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 5.1.44 Source distribution

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> CREATE DATABASE photooapp DEFAULT CHARSET=utf8;
mysql> GRANT ALL ON photooapp.* TO photooapp@localhost IDENTIFIED BY 'pho!00App';
mysql> exit
Bye
$

Nun sollten alle notwendigen Vorbedingungen erfüllt sein und wir können in der SpringRoo shell weitermachen.

Datenmodell-Klassen in SpringRoo erstellen

Für die Demo-Anwendung "Photooapp" wurde folgendes (vorläufiges) Datenmodell erstellt, das wir nun in SpringRoo umsetzen wollen:

Hierzu öffnen wir die SpringRoo Shell:
ahe:(git)photooapp[master]/$ ~/dev/tools/spring-roo-1.2.0.M1/bin/roo.sh
____ ____ ____
/ __ \/ __ \/ __ \
/ /_/ / / / / / / /
/ _, _/ /_/ / /_/ /
/_/ |_|\____/\____/ 1.2.0.M1 [rev 1fa252f]


Welcome to Spring Roo. For assistance press TAB or type "hint" then hit ENTER.
...
roo> script --file log.roo --lineNumbers true

Nun gibt es zwei Möglichkeiten:

a) Man tippt die folgenden Befehle auf der Roo-Shell ein:
project de.goldstift.photoo
jpa setup --provider HIBERNATE --database MYSQL --databaseName photooapp --userName photooapp --hostName 127.0.0.1 --password pho!00App

entity --class ~.domain.Tag --activeRecord false --testAutomatically
field string --fieldName name --notNull --sizeMin 2
field string --fieldName lowerCaseName --notNull --sizeMin 2

entity --class ~.domain.Person --activeRecord false --testAutomatically
field string --fieldName lastname --notNull --sizeMin 2
field string --fieldName firstname
field string --fieldName nickname --notNull

entity --class ~.domain.Event --activeRecord false --testAutomatically
field string --fieldName name --notNull --sizeMin 2
field date --fieldName fromDate --type java.util.Date --dateTimeFormatPattern "yyyy-MM-dd HH:mm:ss"
field date --fieldName toDate --type java.util.Date --dateTimeFormatPattern "yyyy-MM-dd HH:mm:ss"

entity --class ~.domain.Folder --activeRecord false --testAutomatically
field string --fieldName title
field date --fieldName createDate --type java.util.Date --dateTimeFormatPattern "yyyy-MM-dd HH:mm:ss"
field string --fieldName systemPath --notNull --sizeMin 1
field string --fieldName urlPath --notNull --sizeMin 1
field boolean --fieldName writable --primitive false

entity --class ~.domain.PhotoFile --activeRecord false --testAutomatically
field reference --fieldName folder --type ~.domain.Folder --cardinality MANY_TO_ONE --fetch EAGER
field string --fieldName filename --notNull
field number --fieldName width --notNull --type java.lang.Short
field number --fieldName height --notNull --type java.lang.Short

entity --class ~.domain.Photo --activeRecord false --testAutomatically
field string --fieldName title
field string --fieldName description
field string --fieldName thumbnail --notNull
field reference --fieldName thumbnailFile --type ~.domain.PhotoFile --cardinality MANY_TO_ONE --fetch EAGER
field reference --fieldName previewFile --type ~.domain.PhotoFile --cardinality MANY_TO_ONE --fetch EAGER
field reference --fieldName originalFile --type ~.domain.PhotoFile --cardinality MANY_TO_ONE --fetch EAGER
field date --fieldName importDate --type java.util.Date --dateTimeFormatPattern "MS"
field date --fieldName shotDate --type java.util.Date --dateTimeFormatPattern "MS"
field set --fieldName tags --type ~.domain.Tag --cardinality MANY_TO_MANY --fetch EAGER
field set --fieldName persons --type ~.domain.Person --cardinality MANY_TO_MANY --fetch EAGER
field set --fieldName events --type ~.domain.Event --cardinality MANY_TO_MANY --fetch EAGER

repository jpa --interface ~.repository.TagRepository --entity ~.domain.Tag
repository jpa --interface ~.repository.EventRepository --entity ~.domain.Event
repository jpa --interface ~.repository.PersonRepository --entity ~.domain.Person
repository jpa --interface ~.repository.PhotoRepository --entity ~.domain.Photo
service --interface ~.service.TagService --entity ~.domain.Tag
service --interface ~.service.EventService --entity ~.domain.Event
service --interface ~.service.PersonService --entity ~.domain.Person
service --interface ~.service.PhotoService --entity ~.domain.Photo

json all
web mvc setup
web mvc all --package ~.web

oder

b) man importiert die Befehle als Roo-Skript (speichern als "log.roo") mit Hilfe des folgenden Befehls:

roo> script --file log.roo --lineNumbers true

Anschließend kann die Anwendung über die folgenden Maven Befehle gebaut und gestartet werden:

ahe:(git)photooapp[master]/$ mvn clean package
(...)
ahe:(git)photooapp[master]/$ mvn jetty:run

Durch letzteren Befehl wird die Anwendung in einem Jetty ApplicationServer gestartet, wodurch sie unter http://localhost:8080/photooapp verfügbar sein sollte.

Die komplette Anwendung ist bei github verfügbar unter https://github.com/aheusingfeld/photooapp


Weiterführende Links

Weitere Artikel der Reihe

Keine Kommentare:

Kommentar veröffentlichen