Что может привести к тому, что аннотации JPA будут игнорироваться при выполнении запросов? - PullRequest
0 голосов
/ 25 сентября 2019

У меня проблема с отображением @OneToMany, неправильно применяющим параметры принадлежащих ему аннотаций.Чтобы быть более конкретным, у меня есть Parent_Table с отношением @OneToMany к Subjects_Table.При правильной работе и доступе к Темам он генерирует и распечатывает на сервер протоколы запросов, например:

SELECT id, other, random, column, names, parent_id FROM Subjects WHERE (parent_id = ?) ORDER BY id DESC
    bind => [66]

Проблема, с которой я сталкиваюсь, иногда заключается в том, что выводится в журнал буквально:

SELECT id, other, random, column, names, parent_id FROM Subjects

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

Таким образом, в подавляющем большинстве случаев используется предложение WHERE, содержащее информацию аннотаций mappedBy (часть @OneToMany) и @OrderBy, и очень редко она загружает всю таблицу.Это предположение основано на просмотре сети из БД и сети на сервере приложений. Я никогда не воспроизводил вручную то, что, по словам журналов, происходит.По-видимому, он также не зависит от фактических данных базы данных (т. Е. Если у родительского идентификатора 1 возникла проблема, у родительского идентификатора 1 может не возникнуть проблема во второй раз с максимально близкими переменными среды).

Запрос фактически запускает вызов for (Subjects subject: entity.getSubjects ()) "при первом входе в цикл (если инструментам отладки нужно доверять), как и следовало ожидать для медленно загруженныхсвойство.Я полагаю, что фактический запрос выполняется где-то в org.eclipse.persistence.indirection.IndirectList.buildDelegate, но я не уверен на 100%, потому что кажется, что отладка там прерывает печать журналов сервера.

EclipseLink 2.7.4

Пример Parent_Table:

@Entity
@Table(name = "parent")
@Inheritance(strategy = InheritanceType.JOINED)
@DiscriminatorColumn(name = "dtype")
public abstract class Parent_Table extends Another_Table implements Parent {


    @OneToMany(mappedBy = "entity", cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.LAZY)
    @OrderBy("id DESC")
    @DetailColumn(Subjects.class)
    private List<Subjects_Table> subjects;


    @Override
    public DetailList<Subjects_Table> getsubjects() {
        if (subjects == null) {
            subjects = Lists.newArrayList();
        }
        return DetailLists.newDetailArrayList(Subjects_Table.class, subjects);
    }

    @Override
    public void setSubjects(List<? extends Subjects> subjects) {
        this.subjects = CollectionUtils.copy(subjects);
    }

}

Пример Subjects_Table:

@Entity
@Table(name = "subjects")
public class Subjects_Table implements Subjects {

    @ManyToOne(fetch = FetchType.LAZY)
    @ParentColumn
    @JoinColumn(name = "parent_id", nullable = false)
    private Subjects_Table entity;

}

Я попытался упростить приведенный выше код дотолько то, что может быть актуально.

Я ожидаю, что аннотации будут всегда применяться к запросу, даже когда он "терпит неудачу", у меня нет никаких сообщений об ошибках, так как ошибка просто загружает всю таблицу.

...