Hibernate: Mapping-Annotations an Member anstatt an Getter-Methoden?

DarthShader

Erfahrenes Mitglied
Hallo,

ich habe eine Frage zu Hibernate und den Annotations, mit denen ich das O-/R-Mapping konfigurieren kann. Vorweg: Ja, ich möchte mit Annotations arbeiten, nicht mit einem XML Mapping.

Aus einen Lehrbuch habe ich vor einiger Zeit, als ich mich mit Hibernate vertraut machte, gelernt, man sollte die Annotations an die Getter-Methoden einer Bean schreiben, z.B.:

Java:
@ManyToOne( optional = true )
@JoinColumn( name = "doc_id" )
public Document getDocument()
{
	return document;
}

oder auch

Java:
@Id
@GeneratedValue( strategy = GenerationType.IDENTITY )
public Integer getId()
{
	return id;
}

Ich habe recht große Domain Modelle, alles Beans mit sehr vielen Properties. Meine Frage ist nun, kann ich diese Annotations auch an die Member schreiben, anstatt an deren Getter-Methode? Das wäre dem ersten Beispiel dann entsprechend so:

Java:
@ManyToOne( optional = true )
@JoinColumn( name = "doc_id" )
private Document document = null;

Sollte das funktionieren, gibt es irgendwelche Nachteile? Wiederspricht es vielleicht einer "best practice" und falls ja, warum?

Falls nicht, würde ich das nämlich gerne so machen, denn ich finde es viel übersichtlicher, die Mapping-Annotations im Klassen-Kopf zu sehen, als ständig nach unten durch die Getter-/Setter-Methoden zu scrollen.


Vielen Dank für Eure Hilfe!
 
Hallo,

soweit ich weiß, funktioniert das bei Hibernate nur an den Methoden.

Gibt es einen bestimmten Grund, dass du nicht die JPA nutzt? Da hast du auch Annotations und die kannst du an die Variablen schreiben.

MFG

Sascha
 
Ähm... wie wärs mit ausprobieren? :D. Das häte dich wahrscheinlich genausoviel Zeit gekostet, wie den Post zu schreiben :). Zum anderen liefert ne Googleanfrage zu "Hibernate Mapping Annotations" in den ersten Hits gleich Tutorials die genau das tun, wonach du fragst.

Ansonsten würde ich dir ähnlich wie Sascha empfehlen, soweit wie möglich JPA zu nutzen und Hibernate als Persistenzprovider.

Gruß
Ollie
 
Ok, scheint als hätte ich mich geirrt. Ich glaube aber mal so etwas gelesen zu haben. :)

MFG

Sascha
 
Danke für Eure Antworten.

Soweit wie möglich JPA benutzen?

Soweit ich weiß, ist Hibernate eine Implementierung von JPA. Sobald ich das Mapping mit den Annotations mache, benutze ich die Annotaions vom JPA. Auch meine obigen Beispiele sind JPA (alles Annotations aus javax.persistence). Von daher verwirren mich Eure Einwände gerade ein wenig :)

Es geht mir auch nicht so sehr darum, ob es funktioniert, sondern ob es da irgendwelche nachteile gibt. Man kann doch als erfahrener Entwickler oft eine Meinung zu irgendwelchen Vorgehensweisen abgeben. Und so dachte ich, gäbe es hier vielleicht jemand, der sagt "hey ich mache das schon seit längerem so" oder "lass die Finger davon, denn es gibt die Nachteile A und B...".

In der Hibernate Annotaions Doku steht ja auch, dass man es so machen kann, aber dort steht nichts von Vor- oder Nachteilen (Thema "property" oder "field" mapping).
 
Der Vorteil an der JPA ist, dass du nicht auf Hibernate angewiesen bist. Du kannst auch einen anderen Persistence-Provider nehmen.

Ich weiß jetzt nicht, ob es mit den JPA-Annotations funktioniert. Ich kann mich hier an einen Post erinnern, da hat es nicht funktioniert. Ich hab es noch nie ausprobiert.

MFG

Sascha
 
Hi :)

Also eigentlich geht es hier immer noch nicht darum, ob es geht :) In der Hibernate Dokumentation steht ja, dass es funktioniert (zugegeben, es könnte trotzdem nicht funktionieren, dann würde die Doku falsch liegen).

Es geht mir einzig und allein um die "best practice", aber dazu kann wohlmöglich hier niemand etwas sagen.
 
Das ist liegt ganz an dir, ob du es lieber an den Methoden stehen hast oder an den Variablen.

Ich persönlich hab es lieber an den Variablen stehen.

MFG

Sascha
 
HIbernateannotationen gehen über die JPA Annotationen hinaus. Desweiteren hat Hibernate einige funktionalität, die nicht im JPA Standard festgelegt ist (Criterias usw.)

2/3 deines Posts klangen halt so, als wenn du wissen wollen würdest, ob es überhaupt geht ;).

Die Annotationsposition entscheidet darüber ob Hibernate die Werte per Methodencall oder per Feldmodifikation setzt. Das kann schon entscheident sein, wenn man im Setter halt nicht nur reine Zuweisungslogik hat.

Gruß
Ollie
 
Dann habe ich mich wohl ungeschickt ausgedrückt, sorry :)

Also ja, wenn ich im Setter noch anderen Code stehen habe, dann sollte die Annotation wohl auch an die Bean properties. Ansonsten werde ich das jetzt mal an die "fields" hauen. Ich achte auch darauf, dass ich es nicht vermische (wovon auch in der Hibernate Doku abgeraten wird).
 
Zurück