【问题标题】:Inheritance with SINGLE_TABLE strategy in JPA and @Discriminator in getterJPA 中的 SINGLE_TABLE 策略和 getter 中的 @Discriminator 继承
【发布时间】:2012-02-24 23:20:07
【问题描述】:

使用 SINGLE_TABLE 策略的 JPA 实体中的继承问题。在 getter 中,@Discriminator 减少了继承范围。

我有以下结构:

@Entity
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name="type")
@DiscriminatorValue("A")
class A {
...
}

@Entity
@DiscriminatorValue("B")
class B extends A {
...
}

@Entity
@DiscriminatorValue("C")
class C extends B {
...
}

@Entity
class Something{
@ManyToMany // blah blah
private List<B> listB; // getters and setters
}

问题如下。我有 C 类的对象(假设继承 C 也是 B)。当我在做的时候:

Something s = Something.findById(11); // Here is listB with elements of type C and B
List<B> listB = s.getListB();

我只获取 B 类的对象,没有 C。但是 C 扩展了 B,所以它也应该在列表中。 Getter 构造了这样一个查询:

SELECT t1.id, t1.type, t1.sys_modified_date, t1.sys_created_date, t1.name,  t1.shortName
FROM something_b t0 INNER JOIN A t1 ON t0.listB = t1.id 
WHERE t0.news = ? AND t1.type = ? 
[params=(long) 205, (String) B]

问题是这个 getter (Something.getListB) 只将此列表简化为 B 类(通过鉴别器 B)。这导致对象类 C 不在列表中。它是由@Discriminator 通过指示严格类型“t1.type = B”引起的。它不允许在那里放置像“t1.type IN (B,C)”这样的集合/列表。

自定义 JPQL 查询以不同的方式构造:

SELECT t1.id, t1.type, t1.sys_modified_date, t1.sys_created_date, t1.name,  t1.shortName
FROM something_b t0 INNER JOIN A t1 ON t0.listB = t1.id 
WHERE t0.news = ? AND t1.type IN (?, ?) 
[params=(long) 205, (String) B, (String) C]

并且它们按应有的方式工作。但是吸气剂呢?

有趣的是,当我将 Something 类从 B 类更改为 A 类(所有人的基础)时: @实体 类的东西{ @ManyToMany // 等等等等 私人名单列表A; // getter 和 setter }

这解决了问题。在 getter 查询中:

SELECT t1.id, t1.type, t1.sys_modified_date, t1.sys_created_date, t1.name,  t1.shortName
FROM something_b t0 INNER JOIN A t1 ON t0.listB = t1.id 
WHERE t0.news = ? 
[params=(long) 205]

消失“AND t1.type = ?”。它可以工作,但会干扰从“真实世界对象”到“ORM 实体”的映射。该解决方案发生了变化,使抽象变得更糟。这不是优雅的解决方案。

问题:

我该如何解决这个问题?

我可以在 getter 中使用自定义 JPQL 查询吗?

如何强制 getter 获取 B 和 C 对象?

你还有别的提议,而不是把List改为List???

【问题讨论】:

    标签: inheritance jpa entity getter discriminator


    【解决方案1】:

    您使用的是哪个 JPA 提供程序?听起来像一个错误。这应该适用于 EclipseLink。

    【讨论】:

    • 我们在 2.1.0 版本中使用 Open JPA。您是否有与其他 JPA 提供商合作的经验?
    猜你喜欢
    • 1970-01-01
    • 2014-09-02
    • 1970-01-01
    • 2011-12-02
    • 2012-04-17
    • 1970-01-01
    • 2022-10-25
    • 2011-03-23
    • 2011-04-08
    相关资源
    最近更新 更多