【问题标题】:Entity hierarchy in HibernateHibernate 中的实体层次结构
【发布时间】:2011-10-13 04:13:26
【问题描述】:

创建 2 个实体(其中 1 个是另一个实体的父级)的正确方法是什么?例如,我们有以下 2 个表:

Email_Outbox
------------
Id
Email_Id
Date_Sent

Email_Outbox_Schedule
---------------------
Id
Email_Id
Date_Sent
Date_to_Send

很简单,我们在EmailOutbox 中会立即发送电子邮件,在EmailOutboxSchedule 中会在指定日期发送电子邮件。所以理想情况下,这是 Java 中的一个类层次结构,其中EmailOutboxSchedule 扩展了EmailOutbox。然后我们只需要指定1个额外的字段dateToSend,就可以利用典型的对象层次特征。用hibernate做这个有问题吗?我需要以任何特殊方式注释这 2 个实体吗?

【问题讨论】:

    标签: hibernate orm hierarchical-data hibernate-mapping object-relational-model


    【解决方案1】:

    您可能需要阅读有关Hibernate inheritance mapping 的信息。但是,从逻辑上讲,我不认为日程安排会扩展收件箱。听起来时间表更像是单个消息的属性。那么可能只是在单个消息实体上具有可为空的属性date to send

    【讨论】:

    • 对于需要立即发送的电子邮件,我可以将 dateToSend 设为 null,但我更希望有单独的表和类。我不同意 EmailOutboxSchedule 是否是 EmailOutbox 的子类,但我对在休眠中表示对象层次结构的正确机制比这个特定示例更好奇。 Hibernate继承映射的链接是一个似乎与此无关的JIRA问题。我搜索并手册的第10章描述了继承映射,但我想要一些更简单的东西,2个单独的表 - 1个类层次结构。
    • 为错误的链接道歉,一定是卡在我标签上的剪贴板中。已更正。如果您真的想使用层次结构并且想要使用您描述的表,那么您可以考虑Table per concrete class
    【解决方案2】:

    通过this document,我看到的解决方案是将@MappedSuperclass 用于父类Email_Outbox,然后有两个子类Scheduled_Email_Outbox 和Immediate_Email_Outbox。

    Immediate_Email_Outbox 将为空,@Entity 注释除外。

    我承认,一个空的类并不优雅,但它似乎可以工作。 (无论如何,hibernate 和优雅有些格格不入。)

    【讨论】:

    • 它可以工作,但不能代表所需的层次结构。但这是一个合理的解决方案(例如,就像只有可以为空的 schedule 列一样合理)。
    • 关于休眠和优雅的非常有趣的评论:)。这似乎是最有意义的。在我看来,这绝对比有一个可以为空的时间表列更好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-17
    • 2013-02-02
    • 1970-01-01
    • 2021-07-05
    • 1970-01-01
    相关资源
    最近更新 更多