【问题标题】:Hibernate: table per concrete class mapping & referencingHibernate:每个具体类映射和引用的表
【发布时间】:2013-06-08 09:26:01
【问题描述】:

我指的是每个具体类的表,如下所述:Table per concrete class

按照 9.1.6 中的示例,假设我有 CashPayment、CreditCardPayment,两者的超类是一个抽象支付类。

如果我使用“每个具体类的表”类型的映射,我将有两个表:CASH_PAYMENT 和 CREDIT_PAYMENT,并且没有 PAYMENT 表。没关系。

但是,我如何构建另一个名为 Xyz 的实体类型,其中包含对付款(现金或抄送)的引用/属性...?从 Java 的角度来看,这没问题:Xyz.pamentType,但我如何在 HBM/annotations 中配置它,XYZ 表会是什么样子?

它可能有一个 PAYMENT_ID 列,但显然它不能是外键,因为有两个潜在的表可供参考。我猜 XYZ 需要一些额外的列来说明它是哪种类型的付款。

或者每次我读取 Xyz 的实例时,Hibernate 是否会使用 ID 连接两个表以找到正确的类型?

顺便说一句,我知道这是一种不好的方法,我可以使用更简单的替代方法,但我已经简化了问题,因为答案(而不是替代方法)对我有用。谢谢!

【问题讨论】:

    标签: hibernate class reference concrete


    【解决方案1】:

    没有什么可配置的,只是创建与支付的关系,例如:

    @OneToOne private Payment payment;
    

    然后给它赋值并持久化它们。

    没有额外的列用于找出付款的类型。确定支付休眠的类型

    • 使联合
      • CashPayment 查询结果
      • CreditCardPayment 表的查询结果。
    • 这些选择语句在选择列表中包含表示类型的附加项。
    • 外部选择从嵌套查询中获取值(联合的结果)。附加属性确定在创建 Payment 实例时将使用哪个具体类。

    【讨论】:

    • 谢谢,您已经清楚地回答了这个问题。这类似于我问 Hibernate 是否会加入这两个表时的意思,尽管我的意思是说“联合”。如果它们是三个大表,则联合并不理想......无论如何要给 Hibernate 更多信息以避免联合?
    • XYZ的表结构怎么样。会有外键吗?如果是,它将指向哪个表?
    猜你喜欢
    • 2015-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-01
    • 2017-04-07
    • 2015-11-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多