[英]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.