2016-04-14 61 views
0

我希望有人能帮我弄清楚我在用hibernate时遇到的一个问题。休眠与接口的关联

我正在开发一个可以开发不同类型的实体的计费系统。这些实体实现了“Invoicable”界面。

在我的发票类我有这条线

@ManyToOne(fetch = FetchType.EAGER) 
private Invoiceable responsibleEntity; 

的开票界面看起来像这样

@MappedSuperclass 
public interface Invoiceable 
{ 
// Name to display as entity responsible 
String getInvoiceOwnerName(); 

// Get email address to send invoice 
String getInvoiceOwnerEmail(); 
} 

我得到一个例外,当我运行这个

组织。 hibernate.AnnotationException:@OneToOne或@ManyToOne在models.Invoice.responsibleEntity引用一个未知实体:interfaces.Invoiceable

我试过用Google搜索和阅读一些类似的帖子,但我什么都不能上班。 hibernate是否支持这种类型的映射?

谢谢

回答

1

你必须在Hibernate的方式使用继承来做到这一点。详细信息可以在 - >Hibernate Inheritance Doc

附加信息: Hibernate无法将类型连接在一起,其中没有数据库表位于其后面。这对你意味着什么。 MappedSuperclasses没有表格,所以没有什么可以连接在一起。所以这是无法运作的。最重要的是牢记在心。当您请求读取所有父对象时。他应该加入哪些表格?这就是hibernate继承系统发挥作用的原因。您必须将界面更改为普通类。这不应该是一个大问题。现在选择您选择的继承策略。他们每个人都有自己的优点和缺点。请阅读文档以了解哪种最适合您的情况。

以下是带有Invoice类的单表方法的示例。

@Entity 
@Inheritance(strategy=InheritanceType.SINGLE_TABLE) 
@DiscriminatorColumn(
    name="invoiceType", 
    discriminatorType=DiscriminatorType.STRING 
) 
@DiscriminatorValue("Invoice") 
public class Invoiceable { ... } 

@Entity 
@DiscriminatorValue("CustomInvoice") 
public class CustomInvoice extends Invoiceable { ... } 
+1

您能否总结这里的关键点?堆栈溢出通常不会欢迎只不过是链接到另一个资源的答案。此外,链接有时会中断。 –

+0

@ mh-dev我确实读过了这篇文档,但我看不到如何使用界面。它实际上表示那里的接口不支持注释。由于我的实体不是来自同一个基类,我不明白我能做到这一点。我必须找到另一种方式。 – FMC

+0

我扩展了答案,但请记住,继承策略会对性能产生影响。所以请仔细阅读文档。 –