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

时间:2011-12-15 14:36:36

标签: 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加载集合?

1 个答案:

答案 0 :(得分:0)

是否可以包含用于获取此SQL的JPQL查询和提示。

所以,你说当你使用join-fetch但不是left-join-fetch时它会起作用吗?

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

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