在我们的代码中有这两个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结构。如果这是唯一的方法,我会这样做,但我想知道是否有一个映射允许继承结构保持完整,因为这将涉及显着减少我们的代码重构