我可以在休眠中使用单表继承从扩展实体中选择所有超级对象吗?

Posted

技术标签:

【中文标题】我可以在休眠中使用单表继承从扩展实体中选择所有超级对象吗?【英文标题】:Can I select all super objects from an extended entity using single table inheritance in hibernate? 【发布时间】:2016-07-28 01:50:07 【问题描述】:

我认为在我的用例中使用单表继承是个好主意 - 能够在一个表中存储不同的内容类型。在我的情况下,存储不同的文章类型(链接、文本、图像)。

    文本(基类) 文章编号 文字 链接(文本扩展) 超级(articleId,文本) 链接 图像(文本扩展) 超级(articleId,文本) 图片 图像描述

我正在制作不同文章(图片、文本和链接)的 feed,遇到了我无法 select * from text 的问题并包含超类?有没有解决的办法?我是否选择了错误的数据库架构设置?

如果我可以从文本中选择全部并包含链接和图像对象,那就太理想了。

我面临的另一个问题是我是否应该在 spring 中为我的text, link, and image 类使用一个控制器?目前我有 3 个不同的控制器,每个扩展实体都有 3 个不同的服务?!

【问题讨论】:

【参考方案1】:

文本既是成员又是实体本身?我不建议这样做。但我尝试将您的控制器集中在请求和响应交互上。您不一定需要每个实体的控制器。我这样做了,我发现它使我的应用程序围绕实体而不是用户尝试执行的过程。绝对是每个实体的 Dao 和 Service,但在我看来,控制器是关于用户与应用程序交互的。

我不确定您在休眠中查询基表的问题。我知道你可以在 JPA 中使用treat() JPA Criteria Query over an entity hierarchy using single table inheritance 做这样的事情。但我不会那样做。而只是在文本服务层中拥有这个功能,它可以访问所有需要的 Daos。当然,如果您有数百个扩展 Text 的类,我会寻找您正在寻找的类型的解决方案,但鉴于您只有 3 个,我认为该解决方案会很好,您那里只有 3 个 daos。

这样做也意味着您不必担心摆脱单表策略。

所以在服务层它只是:

List<String> texts = textDao.getAllText();
texts.addAll(linkDao.getAllText());
texts.addAll(imgDao.getAllText());
return texts;

可能是最简单的。

【讨论】:

以上是关于我可以在休眠中使用单表继承从扩展实体中选择所有超级对象吗?的主要内容,如果未能解决你的问题,请参考以下文章

在休眠中使用继承时如何仅获取一种实体?

我可以删除 Hibernate 单表继承中的鉴别器列吗?

单表继承(休眠)的 JPA 2 标准查询

由于继承缺陷,Core Data sqlite 存储单表?

如何将@UniqueConstraint 与单表继承(JPA)一起使用?

从实体类继承并扩展类