如 Hibernate 文档中所述,TABLE_PER_CLASS
在获取多态关系时表现非常糟糕
2.2.4.1。每班表
这种策略有很多缺点(尤其是多态查询和关联),在 JPA 规范、Hibernate 参考文档、Hibernate in Action 和许多其他地方都有解释。Hibernate 解决了大多数使用 SQL UNION 查询实现此策略的问题。它通常用于继承层次结构的顶层:
@Entity @Inheritance(strategy = InheritanceType.TABLE_PER_CLASS) public class Flight implements Serializable { ... }
此策略支持一对多关联,前提是它们是双向的。此策略不支持 IDENTITY 生成器策略:id 必须在多个表之间共享。因此,在使用此策略时,您不应使用 AUTO 或 IDENTITY。
但在这种情况下,我对继承策略没有其他选择,所以我正在寻找改进查询的方法。Comment 是我的具体类,它与抽象 Commentable 类具有 M:1 关系。
我希望在 Comment中存储一个鉴别器列,可以区分它所指的 Commentable 的具体类型,并在我的查询中使用 CASE:
@NamedQuery(name = "Comments.withItemTitle",
query = "select c.commentBody, " +
"case " +
"when n.targetType = 'video' THEN (select v.title from Video v where v.id = c.target.id) " +
"when n.targetType = 'message' THEN (select m.title from Message m where m.id = n.target.id) " +
"when n.targetType = 'blog' THEN (select b.title from Blog b where b.id = n.target.id) " +
"end " +
"from Comment c")
但是hibernate抛出一个关于嵌套选择的错误,说它不能确定它的类型。这在 postgre 中似乎是合法的——如果 Hibernate 以这种方式支持嵌套的 SELECT 表达式,它不会解决问题吗?
我的下一个想法是对commentable.title
每条评论进行反规范化并存储相关信息,但出于显而易见的原因,我犹豫不决。出于这个问题的目的,我无法更改 Commentable 的继承结构。
有没有其他方法可以在不强制休眠到 UNION 每个表的情况下执行此查询?