Проблема отложенной загрузки Eclipselink для объектов со столбцом дискриминатора - PullRequest
1 голос
/ 15 декабря 2011

У нас есть следующая иерархия в нашем приложении:

@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 голосов
/ 20 декабря 2011

Можете ли вы включить запрос JPQL и подсказки, которые вы используете для получения этого SQL.

Итак, вы говорите, что он работает, когда вы используете join-fetch, а не left-join-fetch?

Кажется, что это может быть ошибкой, поскольку выражение дискриминатора наследования не включается при использовании внешнего соединения.Если это так, пожалуйста, зарегистрируйте ошибку и проголосуйте за нее.

Хотя ваша модель очень странная.Зачем разделять два подкласса на два отдельных отношения?Иметь его было бы намного эффективнее.Или, если вы их разделите, вы должны использовать разные внешние ключи, а не один и тот же.Совместное использование одного и того же внешнего ключа для двух разных отношений, вероятно, не очень хорошая идея.

...