@ElementCollection с Map, где Entity — это поле Embeddable

После поиска в документах 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.

5
задан hendalst 15 August 2012 в 17:28
поделиться