Moderne Webentwicklung mit Java EE 7: Ein Experiment

Implementierung

Anzeige

Der folgende Quelltextauszug zeigt die Implementierung der Model-Klasse Post. Die Annotation @Entity kennzeichnet die Klasse als persistierbare Entität, deren Tabellenname sich aus dem Klassennamen ableitet. Alle Attribute werden automatisch in Spalten mit gleichem Namen abgelegt.

Zwar ist beides auch anpassbar, aber Convention over Configuration erspart Entwicklern die mühsame individuelle Zuordnung. Die Annotationen @Id und @GeneratedValue definieren das Attribut id als Primärschlüssel für die Entität und sorgen für eine automatische Generierung neuer Schlüsselwerte bei der Persistierung der Objekte:

@Entity
public class Post {
@Id
@GeneratedValue
private long id;

private String title;
private String content;

@OneToMany(mappedBy = "post",
fetch = FetchType.EAGER,
cascade = CascadeType.ALL)
private final List<Comment> comments = new ArrayList<>();

public long getId() {
return id;
}

public void setId(long id) {
this.id = id;
}
// [...] Getter und Setter für übrige Attribute
}

Ein Post kann 1 bis n Comments haben, was die Annotation @OneToMany am Attribut comments kennzeichnet. Dadurch erzeugt das System automatisch entsprechende Fremdschlüssel in der Datenbank. Beim Lesen eines Blog-Posts sorgt FetchType.EAGER dafür, dass alle zugeordneten Kommentare mitgelesen werden. Da die Kommentare auch ihren Post kennen sollen, ist in der Klasse Comment (mittels @ManyToOne) ein umgekehrtes Mapping konfiguriert. Die Angabe des Attributs zur Referenzierung des Posts erfolgt über mappedBy. Zuletzt sorgt das CascaceType.ALL für die automatische Weitergabe von Operationen wie Löschen oder Aktualisieren auf Post an dessen Comments.

Die Getter und Setter für die Attribute sind wichtig, damit das Framework die Objekte in der Datenbank speichern beziehungsweise sie aus ihr lesen kann. Hier könnte man durchaus von Boilerplate-Code sprechen. Wie das folgende Quelltextbeispiel aus Ruby on Rails zeigt, benötigt es deutlich weniger Code, da Rails die Attribute automatisch aus den Tabellenspalten ableitet und Getter und Setter bereitstellt. Diese Vereinfachung ist mit Java leider nur mit externen Frameworks wie Lombok möglich.

class Post < ActiveRecord::Base
has_many :comments, dependent: :destroy
end

Entwickler können mit der Bean Validation – ebenfalls durch Annotationen – in beliebigen Klassen eine Validierung der Attribute durchführen. Im Beispielprojekt ist das bei der Eingabe eines Kommentars der Fall, wie folgender Quelltext zeigt:

@NotNull(message = "Please enter a comment")
@Size(min = 5, message = "Please enter a valid comment")
private String content;

Die beiden Annotationen @NotNull und @Size stellen sicher, dass der String content weder null ist noch kürzer als fünf Zeichen. Java führt die Validierung automatisch bei wichtigen Operationen wie der Persistierung oder der Eingabe in ein Webformular durch, sodass kein weiterer Code nötig ist. Sie ist auch manuell aufrufbar und liefert alle Validierungsverstöße in einer Liste. Diese Implementierung ähnelt stark dem entsprechenden Rails-Code, der im folgenden Quelltext-Beispiel zu sehen ist.

validates :content, presence: true
validates :content, length: { minimum: 5 }
Anzeige