@ElementCollection z mapą <Entity, Embeddable> gdzie Entity to pole Osadzalnej
Po przeszukaniu dokumentów JPA i różnych postów jestem zdezorientowany, czy w JPA2.0 możliwe jest następujące. Zaczynam od JPA, więc przepraszam, jeśli robię coś głupiego,
Mój model domeny ma „Portfel”, który zawiera zero lub więcej „otwartych pozycji”. Pozycja składa się z „instrumentu” (który jest podmiotem WZP) i ceny (podwójnej). Portfel jest następujący:
@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>();
....
Osadzanie OpenPosition jest następujące:
@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;
....
a jednostką Instrumentu jest:
@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();
....
Kiedy próbuję tego użyć, tworzony jest schemat i jestem w stanie utrzymywać portfele, ale próbując je odzyskać, otrzymuję wyjątek NullPointerException w metodzie hashCode klasy Instrument. Wygląda na to, że JPA próbuje uzyskać kod skrótu, aby zbudować klucz Map, ale obiekt Instrument nie został załadowany.
Widzę poprzez debugowanie, że chociaż identyfikator jest ustawiony w obiekcie Instrument, wszystkie pozostałe pola mają wartość NULL.
Więc moje pytanie brzmi, czy JPA2.0 zezwala na ElementCollection, gdzie kluczem jest Jednostka, która jest również obecna jako pole wartości Osadzalnej? Jeśli tak, co spieprzę. A jeśli nie, to czy najlepszym rozwiązaniem jest użycie identyfikatora podmiotu Instrument jako klucza?
Z góry dziękuję.
p.s. Używam implementacji JPA hibernate 4.1.4.