@ElementCollection com Map <Entity, Embeddable> onde Entity é um campo do Embeddable
Depois de pesquisar nos documentos do JPA e em várias postagens, estou confuso sobre se o seguinte é possível com o JPA2.0. Eu estou apenas começando com o JPA, então me desculpe se estou fazendo algo estúpido,
Meu modelo de domínio tem um "Portfólio", que contém zero ou mais "posições abertas". Uma posição consiste em um "Instrumento" (que é uma Entidade JPA) e um preço (double). O portfólio é o seguinte:
@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>();
....
O OpenPosition Embeddable é o seguinte:
@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;
....
e a entidade Instrumento é:
@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();
....
Quando tento usar isso, o esquema é criado e eu posso persistir nos portfólios, mas ao tentar recuperá-los, recebo um NullPointerException no método hashCode da classe Instrument. Parece que o JPA está tentando obter o código hash para construir a chave Map, mas o objeto Instrument não foi carregado.
Eu posso ver através da depuração que, embora o id seja definido no objeto Instrument, todos os outros campos são nulos.
Então, minha pergunta é: o JPA2.0 permite um ElementCollection em que a chave é uma entidade que também está presente como um campo do valor Embeddable? Se sim, o que estou estragando? E se não, a melhor solução é usar o id da entidade Instrumento como chave?
Desde já, obrigado.
p.s. Estou usando a implementação do Hibernate 4.1.4 JPA.