Представление неполных объектов при загрузке из базы данных - PullRequest
0 голосов
/ 12 февраля 2010

Итак, в недавнем проекте (небольшой внутренний инструмент) я хочу поэкспериментировать с , а не , используя инструмент ORM, который мы обычно используем во всех наших проектах. Причина в том, что я особенно не фанат их, особенно в сложных проектах со сложной иерархией объектов и отношений. При использовании ORM становится трудно отлаживать проблемы с производительностью и другие проблемы, возникающие из-за того, что библиотека ORM может делать под прикрытием для «оптимизации».

Так что я думал о способе ленивой загрузки определенных свойств объектов, когда у меня нет помощи инструмента ORM. Предположим пример:

class Student {
private List<Course> courses;

public List<Course> getCourses() {...}
public void setCourses(List<Course> courses) {...}
}

Так что в этом случае мы лениво ставим «курсы». Поэтому мне нужен способ разграничить сценарий, в котором «курсы» не были загружены из базы данных, и когда «курсы» фактически равны нулю даже после извлечения из БД.

Каковы типичные способы, которыми я могу этого достичь. Я думал, что, вероятно, связать специальный пустой объект типа «Курс», что означает, что на самом деле нет никаких данных в БД. А java null будет означать, что данные не извлекаются из БД. Но это немного нарушило бы абстракцию в том смысле, что получатель для таких lazy свойств должен принять решение о доступе к DAO для получения данных.

Ответы [ 2 ]

1 голос
/ 12 февраля 2010

Если вам не нравятся стандартные библиотеки ORM, такие как Hibernate, почему бы вам не использовать такой инструмент, как iBATIS ? iBATIS - это нечто среднее между Hibernate и простым SQL. По сути, он сопоставляет результирующие наборы с объектами Java, однако не пишет для вас SQL.

Мы переключились на него с Hibernate после того, как - как и вы - обнаружили, что Hibernate не очень хорошо работает для более сложных схем.

Он поддерживает динамическое усовершенствование классов, однако также поддерживает избегание выбора N + 1 путем помещения соединения в SQL (извините, это плохо объяснено, но для получения дополнительной информации обратитесь к руководству пользователя ). *

В любом случае, чтобы ответить на ваш реальный вопрос, я бы, вероятно, реализовал это с помощью cglib или чего-то подобного для улучшения класса (создания динамического подкласса). Вы сохраняете карту свойств, которые были загружены или нет, а затем вам не нужны специальные значения.

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

0 голосов
/ 12 февраля 2010

Вы можете различить курсы, которые не загружаются, и courses загружаются, но пустые, используя null для обозначения «не загружено» и пустое Collection для «загруженных, но недоступных курсов».

Однако, я бы предпочел выдать исключение RuntimeException (например, IllegalStateException), если вызывается метод доступа, но данные еще не загружены. Это значительно упрощает отладку и избавляет от необходимости null проверок, засоренных в вашем коде.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...