У меня проблема с отображением @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;
}
Я попытался упростить приведенный выше код дотолько то, что может быть актуально.
Я ожидаю, что аннотации будут всегда применяться к запросу, даже когда он "терпит неудачу", у меня нет никаких сообщений об ошибках, так как ошибка просто загружает всю таблицу.