@ElementCollection с картой <Entity, Embeddable>, где 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
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 не был загружен.
Через отладку я вижу, что хотя id установлен в объекте Instrument, все остальные поля имеют значение null.
Поэтому мой вопрос: разрешает ли JPA2.0 ElementCollection, где ключом является сущность, которая также присутствует в качестве поля значения Embeddable? Если так, то что я облажался. И если нет, то является ли лучшим обходным решением использование идентификатора сущности Instrument в качестве ключа?
Заранее спасибо.
постскриптум Я использую реализацию JPA hibernate 4.1.4.