@ElementCollection与地图 其中,实体是嵌入式的领域(@ElementColl

2019-06-27 01:44发布

通过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实现。

Answer 1:

所以我的问题是,是否JPA2.0允许ElementCollection其中键是一个实体,这也是目前作为嵌入值的字段?

是的,我管理这个映射做到这一点:

@ElementCollection( targetClass = FreightBid.class )
@MapKeyJoinColumn( name = "carrier_id", referencedColumnName = "id" )
@CollectionTable( name = "freight_bid",
    joinColumns = @JoinColumn( name = "offer_pool_id" ) )
@Access( AccessType.FIELD )
private Map<Carrier,FreightBid> bidsByCarrier;

在我的情况下,运营商是@Entity和FreightBid是@Embedded

我已经能够坚持和检索正确包含此地图的实体。

那我搞砸了。

您应该删除领域protected Instrument instrument;OpenPosition类,而是使用注释@MapKeyJoinColumn在地图领域的投资组合类声明至极列应作为联接列到地图的关键。

此外,它会是最好避免使用其他领域比对象至极行为的hashCode方法为地图键......你JPA实现者可能会搞砸ID。



文章来源: @ElementCollection with Map where Entity is a field of the Embeddable