繁体   English   中英

如何正确注释列表 <Interface> 与休眠?

[英]How to properly annotate a List<Interface> with Hibernate?

我刚刚开始学习如何使用Hibernate,但是我无法弄清楚在引用接口时如何正确注释列表。

这是我的情况,我有一个MarketOrderImpl类,可以像这样实现MarketOrder。

@Entity
public final class MarketOrderImpl implements MarketOrder {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private String id;
private OrderType type;
private BigDecimal price;
private BigDecimal quantity;
private BigDecimal total;

public MarketOrderImpl(OrderType type, BigDecimal price, BigDecimal 
quantity, BigDecimal total) {
    this.type = type;
    this.price = price;
    this.quantity = quantity;
    this.total = total;
}

并且我有一个MarketOrderBookImpl,其中包含两个我无一例外无法注释的列表(私有列表sellOrders和私有列表buyOrders)

@Entity
public final class MarketOrderBookImpl implements MarketOrderBook {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private String marketId;

@OneToMany @JoinTable(name="marketorderimpl")
@MapKeyColumn(name="id")
private List<MarketOrder> sellOrders;

@OneToMany @JoinTable(name="marketorderimpl")
@MapKeyColumn(name="id")
private List<MarketOrder> buyOrders;


public MarketOrderBookImpl(String marketId, List<MarketOrder> 
sellOrders, List<MarketOrder> buyOrders) {
    this.marketId = marketId;
    this.sellOrders = sellOrders;
    this.buyOrders = buyOrders;
}

这是我的例外...

Caused by: org.hibernate.AnnotationException: Use of @OneToMany or @ManyToMany targeting an unmapped class:br.com.codefleck.tradebot.exchanges.trading.api.impl.MarketOrderBookImpl.sellOrders[br.com.codefleck.tradebot.tradingapi.MarketOrder]at org.hibernate.cfg.annotations.CollectionBinder.bindManyToManySecondPass(CollectionBinder.java:1136) at org.hibernate.cfg.annotations.CollectionBinder.bindStarToManySecondPass(CollectionBinder.java:792)
at org.hibernate.cfg.annotations.CollectionBinder$1.secondPass(CollectionBinder.java:727)
at org.hibernate.cfg.CollectionSecondPass.doSecondPass(CollectionSecondPass.java:70)
at org.hibernate.cfg.Configuration.originalSecondPassCompile(Configuration.java:1695)
at org.hibernate.cfg.Configuration.secondPassCompile(Configuration.java:1424)
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1844)
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl$4.perform(EntityManagerFactoryBuilderImpl.java:850) ... 66 more

先谢谢您的帮助!

由于PersistenceProvider实现(例如Hibernate)无法推断出哪种具体类是在这种情况下使用的“正确”类,因此您必须告诉ORM实现在运行时使用哪种类型。

JPA 2.1规范的 11.1.40节(PDF页面474)中,我们发现了一条与您的问题有关的重要信息:

作为关联目标的实体 仅当使用Java泛型定义了集合值关系属性时才是可选的。 否则必须指定。

提示

关于“ OneToMany注释元素”的表37列出了有关如何以编程方式声明特定OR映射器的运行时信息的更多详细信息

给定以上信息,正确的方法是使用以下方法声明targetEntity类型的与运行时相关的信息:

@OneToMany(targetEntity= MarketOrderImpl.class) 
@JoinTable(name="marketorderimpl")
@MapKeyColumn(name="id")
private List<MarketOrder> sellOrders;

@OneToMany(targetEntity= MarketOrderImpl.class) 
@JoinTable(name="marketorderimpl")
@MapKeyColumn(name="id")
private List<MarketOrder> buyOrders;

希望能帮助到你。

您需要定义目标实体,以便休眠可以了解绑定此关系的域。

@OneToMany(targetEntity=MarketOrderImpl.class) @JoinTable(name="marketorderimpl") @MapKeyColumn(name="id") private List<MarketOrder> sellOrders;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM