@ElementCollection mit Map <Entity, Embeddable> wobei Entity ein Feld der Embeddable ist
Nach dem Durchsuchen der JPA-Dokumente und verschiedener Posts bin ich verwirrt, ob das Folgende mit JPA2.0 möglich ist. Ich fange gerade mit JPA an, also entschuldige mich, wenn ich etwas Dummes tue.
Mein Domain-Modell hat ein "Portfolio", das null oder mehr "offene Positionen" enthält. Eine Position besteht aus einem "Instrument" (bei dem es sich um eine JPA-Einheit handelt) und einem Preis (doppelt). Das Portfolio sieht wie folgt aus:
@Entity (name = "portfolio")
public class Portfolio {
@Id
@Column (name = "id")
@GeneratedValue
private long id;
@ElementCollection (fetch = FetchType.EAGER)
@CollectionTable (name = "portfolio_entry", joinColumns = @JoinColumn (name = "portfolio_id"))
private final Map<Instrument, OpenPosition> positions = new HashMap<Instrument, OpenPosition>();
....
Das OpenPosition Embeddable sieht wie folgt aus:
@Embeddable
public class OpenPosition extends Position {
@ManyToOne (targetEntity = InstrumentImpl.class, optional = false)
@JoinColumn (name = "instrument_id", nullable = false)
protected Instrument instrument;
@Column (name = "price", nullable = false)
protected double price;
....
und das Instrument ist:
@Entity (name="instrument")
public class Instrument {
@Id
@Column(name = "id")
@GeneratedValue
private long id;
@Column(name = "isin", nullable = false)
private String isin;
....
@Override
public int hashCode() {
int hash = 17;
hash = 31 * hash + isin.hashCode();
....
Wenn ich versuche, dies zu verwenden, wird das Schema erstellt und ich kann Portfolios beibehalten, aber wenn ich versuche, sie abzurufen, erhalte ich eine NullPointerException in der hashCode-Methode der Instrument-Klasse. Es scheint, dass JPA versucht, den Hash-Code zum Erstellen des Map-Schlüssels abzurufen, aber das Instrument-Objekt wurde nicht geladen.
Ich kann durch das Debuggen sehen, dass, obwohl die ID im Instrument-Objekt festgelegt ist, alle anderen Felder null sind.
Meine Frage ist also, ob JPA2.0 eine ElementCollection zulässt, bei der der Schlüssel eine Entität ist, die auch als Feld des einbettbaren Werts vorhanden ist. Wenn ja, was vermassle ich? Und wenn nicht, ist es die beste Lösung, stattdessen die ID der Instrument-Entität als Schlüssel zu verwenden?
Danke im Voraus.
p.s. Ich verwende die JPA-Implementierung von Hibernate 4.1.4.