Value Objects über Hibernate JPA abbilden

Status
Nicht offen für weitere Antworten.

jfk

Neues Mitglied
Hallo,

ich nutze Hibernate JPA in meiner Persistenzschicht. Nun habe ich Objekte mit Identität wunderbar über die @Entity-Annotation abgebildet. Objekte ohne eine eigene Identität also ohne id-Feld konnte ich bisher nicht mappen, da Hibernate meckert, wenn keine @Id-Annotation vorhanden ist.

In OpenJpa gibt es die @DataStoreId-Annotation. Diese scheint mir hier richtig zu sein. Ich habe allerdings keine Entsprechung für Hibernate oder generell JPA 2.0 gefunden.

Hat jemand eine Idee, wie man Value Objects dennoch abbilden kann? Kann man sich eventuell die @Embeddable und @Embedded-Annotations zu nutze machen?
 
Zuletzt bearbeitet:

byte

Top Contributor
Eine ID muss für Hibernate nicht zwangsläufig eine Primary Key Spalte in der Tabelle sein. Du kannst auch einen Zusammengesetzten Schlüssel angeben (Composite Key). Irgendwas musst Du Hibernate aber schon geben, woran er Datensätze eindeutig identifizieren kann.
 
M

maki

Gast
Nun habe ich Objekte mit Identität wunderbar über die @Entity-Annotation abgebildet. Objekte ohne eine eigene Identität also ohne id-Feld konnte ich bisher nicht mappen, da Hibernate meckert, wenn keine @Id-Annotation vorhanden ist.
Nicht sicher ob ich dich richtig verstanden habe, bzw. wie du den Unterschied zwischen ValueObject und Entity verstehst.

So wie ich das (ValueObjects vs. ENtities) verstanden habe, haben sowohl Entities als auch ValueObjects eine Id, aber Entities werden ausschliesslich anhand ihrer Id unterschieden, ValueObjects anhand der Werte ihrer Properties.
In diesem Fall ist der Unterschied die iImplementierung der equals und hashCode Methoden, den Ids brauchen sowohl Entities als auch VOs, wenn man sie persistieren möchte.
 

jfk

Neues Mitglied
So wie ich das (ValueObjects vs. Entities) verstanden habe, haben sowohl Entities als auch ValueObjects eine Id, aber Entities werden ausschliesslich anhand ihrer Id unterschieden, ValueObjects anhand der Werte ihrer Properties.
In diesem Fall ist der Unterschied die Implementierung der equals und hashCode Methoden, den Ids brauchen sowohl Entities als auch VOs, wenn man sie persistieren möchte.

Stimmt, da ist was dran, war ein Denkfehler meinerseits.

Danke!
 

deamon

Bekanntes Mitglied
Was du suchst, nennt sich @CollectionOfElements. Damit kannst du z. B. eine Liste in einer Entity-Klasse annotieren.

Code:
@Entity
public class User{
	@Id @GeneratedValue
	private long id;
	private String name;
	@CollectionOfElements
	private Set<String> roles = new HashSet<String>();
}

Zu CollectionOfElements gibt es in JPA 1 übrigens keine Entsprechung. Die von dir erwähnte Annotation muss eine Erweiterung des Frameworks sein.
 
M

maki

Gast
Was du suchst, nennt sich @CollectionOfElements.
VOs müssen nicht notwendigerweise eine Collection sein ;)

VOs sind nur ein Weg, ein feineres Design zu erzeugen und damit mehr information in die Abstraktion zu packen, um so gleichzeitig Vereinfachungen zu ermöglichen.

Klassissches Bespiel für VOs ist Geld.
Ein 20 € Schein ist so gut wie jeder andere, da ist die ID vollkommen egal, weil es ausschliesslich um den Wert geht.
Also brauche ich nicht hunderte einzelner 20 € Objekte, die jeweils einzeln als Entity in der DB persistiert werden.
Ein einziges 20 € Objekt reicht :)

VOs sind auch prima Kandidaten für immutables, damit habe ich dann keine Aliasing Probleme mehr.
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen


Oben