通过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;
....
与仪器实体是:
@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();
....
当我尝试使用这个,是创建的模式,我能够坚持的投资组合,而是试图找回他们时,我得到的仪器类的hashCode方法一个NullPointerException。 看来JPA正在试图获得哈希代码来构建地图的关键,但仪器对象尚未加载。
我可以通过调试看到,虽然ID在仪器对象设置,所有其他字段为空。
所以我的问题是,是否JPA2.0允许ElementCollection其中键是一个实体,这也是目前作为嵌入值的字段? 如果是这样,那我搞砸了。 如果没有,是使用仪器实体的ID作为键,而不是最好的解决方法?
提前致谢。
PS我使用休眠4.1.4 JPA实现。