java - 带有鉴别器列的对象的 Eclipselink 延迟加载问题

标签 java jpa join eclipselink discriminator

我们的应用程序中有以下层次结构:

@MappedSuperclass
public abstract class AbstractDemandOrMeasureBE {
}

@Entity
@Inheritance
@DiscriminatorColumn(name = "DISCRIMINATOR", discriminatorType = DiscriminatorType.INTEGER)
@Table(name = "V_VIEW2")
public abstract class AbstractDemandOrConcreteMeasureBE extends AbstractDemandOrMeasureBE {
    @Column(name = "VC_ID")
    private Long vcId;
}

@Entity
@DiscriminatorValue("2")
public class MinimalDemandBE extends AbstractDemandOrConcreteMeasureBE {
   ..
}

@Entity
@DiscriminatorValue("1")
@HasRelationsAnnotatedAsLazyLoaded
public class ValidationMeasureBE extends AbstractDemandOrConcreteMeasureBE {
..
}

在其他对象中,我尝试加载这些实体:

@Table(name = "V_VIEW2")
public class VCBE extends SomeVeryAbstractBE {

    @OneToMany(fetch = FetchType.LAZY)
    @JoinColumn(name = "VC_ID")
    private List<ValidationMeasureBE> validationMeasures;
    public transient static final String ATTRIBUTE_VALIDATION_MEASURES = "validationMeasures";

    @OneToMany(fetch = FetchType.LAZY)
    @JoinColumn(name = "VC_ID")
    private List<MinimalDemandBE> minimalDemands;
    public transient static final String ATTRIBUTE_MINIMAL_DEMANDS = "minimalDemands";

有一个预编译查询来加载所有层次结构,它加载一些其他父对象。还有一个查询提示 - eclipselink.left-join-fetch=PP.VCBE.validationMeasures (如果将其更改为 eclipselink.left-join-fetch=PP.VCBE.minimalDemands,则加载最小需求,但验证措施(具有鉴别器 1 的条目)也会加载到最低需求集合中 - 但不应加载这些)。

现在,当执行查询时,validationMeasures 集合如果填充了对象,但所有这些对象实际上都是最小需求,并且在数据库中具有 2 作为鉴别器值。

执行的查询如下:

    SELECT * FROM V_VIEW1 t1 
        LEFT OUTER JOIN V_VIEW0 t0 ON (t0.PP_D = t1.ID) 
        LEFT OUTER JOIN V_VIEW2 t2 ON (t2.VC_ID = t0.ID) 
        WHERE (((t1.ID = ?) AND (t1.HP_ID = ?)) 
        AND t1.HP_IS IN (SELECT t3.ID FROM V_VIEW t3 WHERE (t3.HWPG_ID = ?)))
bind => [3 parameters bound]

正如我所见,查询中没有 DISCRIMINATOR 约束,为什么?

对这种行为有什么想法吗?我如何告诉 eclipselink 根据鉴别器值加载集合?

最佳答案

您能否包含用于获取此 SQL 的 JPQL 查询和提示。

那么,您是说当您使用 join-fetch 而不是 left-join-fetch 时它可以工作?

这似乎可能是一个错误,即使用外连接时未包含继承鉴别器表达式。如果是这种情况,请为此记录错误并投票。

不过你的模型很奇怪。为什么要把两个子类分成两个独立的关系呢?拥有一个会更有效率。或者,如果您确实拆分它们,则应该使用不同的外键,而不是相同的外键。为两个不同的关系共享相同的外键可能不是一个好主意。

关于java - 带有鉴别器列的对象的 Eclipselink 延迟加载问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8521744/

相关文章:

java - 使用 EclipseLink JPA 将 XML 类型存储到 PostgreSQL

java - Hibernate EntityManager 与 getSessionFactoryGetCurrentSession()

mysql - LEFT JOIN 创建多行、GROUP BY 或 DISTINCT

SQL 左连接 JOIN 条件中的过滤器与 WHERE 子句中的过滤器

java - gradle项目: error couldn't find main class

java - War应用程序(java)如何知道如何响应请求

java - JAX-WS (JAXB) : How to marshall java. util.Date 到 xs :anyType as xs:date instead of xs:dateTime?

hibernate @SequenceGenerator 不是全局的

php - MySQL Join 加 Count 加 Sum

java - 过滤器锁定算法