java - 如何使用 Hibernate 正确注释 List<Interface>?

标签 java hibernate jpa annotations jpa-2.1

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

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

@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,它有两个我无法无一异常(exception)地注释的列表(私有(private)列表 sellOrders 和私有(private)列表 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;
}

这是我的异常(exception)...

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 specification 的第 11.1.40 节(PDF 第 474 页)中我们发现了一条与您的问题相关的重要信息:

The entity class that is the target of the association. Optional only if the collection-valued relationship property is defined using Java generics. Must be specified otherwise.

提示:

关于“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;

希望对您有所帮助。

关于java - 如何使用 Hibernate 正确注释 List<Interface>?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49343875/

相关文章:

java - 如何将 mongo shell 查询转换为 java basicDBObject?

nhibernate - 如何使用 NHibernate 和 Spring 为死锁配置 RetryAdvice 和 ExceptionTranslation

java - 如何使用 session 工厂关闭连接

spring - hibernate 不支持的功能

mysql - 控制在 jpa 中创建表的顺序

java - 克服 Cypher Lucene 查询上的 NullPointerException

java - spring-mvc Web 应用程序中的导航错误/无效

java - 使用 JMS + CCDT 文件连接到 IBM MQ 时出现负载平衡问题

hibernate - 防止Grails中过时的状态错误

javascript - 日期类型(对象或数字)问题