Hibernate - 将子类POJO映射到与其父类相同的表

时间:2016-10-05 16:37:30

标签: java mysql hibernate orm hibernate-mapping

在我们的代码中有这两个Java类的内容:

public class MailMessage {
    private String id;
    private String message;
    private String sentTime;

    // getters and setters
}

public class MailMessageWithRecipients extends MailMessage {
    private String recipients;

    // getter and setter for recipients
}

分隔收件人列表的目的是,因为它可能非常大,我们希望尽可能避免加载它。我们希望能够将MailMessage和MailMessageWithRecipients映射到单个表; mail_messages。但是,如果我尝试在我们的Hibernate映射文件中执行此操作 -

<class name="MailMessage" table="mail_messages" dynamic-insert="true" dynamic-update="true">
    <id name="id" column="message_id" length="32">
        <generator class="uuid" />
    </id>
    <property name="message" column="message" />
    <property name="sentTime" column="sentTime" />
</class>

<class name="MailMessageWithRecipients" table="mail_messages" dynamic-insert="true" dynamic-update="true">
    <id name="id" column="message_id" length="32">
        <generator class="uuid" />
    </id>
    <property name="message" column="message" />
    <property name="sentTime" column="sentTime" />
    <property name="recipients">
        <column name="recipients" sql-type="longblob" />
    </property>
</class>

然后写一个这样的查询:

Query query = session.createQuery("from MailMessage where id = :id");
query.setParameter("id", id);
MailMessage message = query.uniqueResult();

我收到&#34; org.hibernate.NonUniqueResultException:查询未返回唯一结果&#34;执行查询时的异常,即使mail_messages表中只有一行。我怀疑这是因为它将该行视为MailMessage和MailMessageWithRecipients。有没有办法以这种方式将这两个对象映射到同一个表,同时保持父子Java关系?相关讨论我已经看到在映射文件中推荐组件关系,但在我看来,这将涉及删除继承结构并将MailMessageWithRecipients转换为MailMessage的Facade结构。如果这是唯一的方法,我会这样做,但我想知道是否有一个映射允许继承结构保持完整,因为这将涉及显着减少我们的代码重构

0 个答案:

没有答案