После поиска в документах JPA и различных сообщениях я не понимаю, возможно ли следующее с JPA2.0. Я только начинаю работать с JPA, так что извините, если я делаю что-то глупое,
Моя доменная модель имеет «Портфель», который содержит ноль или более «открытых позиций». Позиция состоит из «Инструмента» (, который является сущностью JPA ), и цены (двойной ). Портфолио выглядит следующим образом:
@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>();
....
OpenPosition Embeddable выглядит следующим образом:
@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;
....
а объект Instrument —:
@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();
....
Когда я пытаюсь использовать это, создается схема, и я могу сохранять портфолио, но при попытке их извлечения я получаю исключение NullPointerException в методе hashCode класса Instrument. Кажется, JPA пытается получить хэш-код для создания ключа Map, но объект Instrument не загружен.
В процессе отладки я вижу, что хотя идентификатор установлен в объекте Instrument, все остальные поля пусты.
Итак, мой вопрос: разрешает ли JPA2.0 ElementCollection, где ключ является сущностью, которая также присутствует как поле значения Embeddable? Если да, то что я туплю. А если нет,лучший обходной путь для использования вместо этого идентификатора объекта Instrument в качестве ключа?
Заранее спасибо.
p.s. Я использую реализацию JPA в спящем режиме 4.1.4.