【问题标题】:Hibernate associations with an interfaceHibernate 与接口的关联
【发布时间】:2016-04-14 06:43:25
【问题描述】:

我希望有人可以帮助我找出我在使用休眠时遇到的问题。

我正在开发一个可以为不同类型的实体开具发票的计费系统。实体实现了“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();
}

我在运行时遇到异常

org.hibernate.AnnotationException:models.Invoice.responsibleEntity 上的 @OneToOne 或 @ManyToOne 引用了未知实体:interfaces.Invoiceable

我试过用谷歌搜索它并阅读一些类似的帖子,但我什么也做不了。 hibernate 是否支持这种类型的映射?

谢谢

【问题讨论】:

    标签: java hibernate interface


    【解决方案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 { ... } 
    

    【讨论】:

    • 能不能在这里总结一下重点? Stack Overflow 通常不欢迎只是指向另一个资源的链接的答案。此外,链接有时会断开。
    • @mh-dev 我确实阅读了这个文档,但我看不到如何使用界面。它实际上在那里说注释不支持接口。由于我的实体不是来自同一个基类,我不知道我将如何做到这一点。我得另寻出路。
    • 我扩展了答案,但请记住,继承策略会影响性能。所以请仔细阅读文档。
    • 谢谢,这样好多了。您的编辑赢得了我的支持。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-01
    • 2010-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-26
    相关资源
    最近更新 更多