Я знаю, что это, вероятно, вековой вопрос, но какова лучшая практика? Использование объекта модели домена на всех уровнях вашего приложения и даже привязка значений непосредственно к ним в JSP (я использую JSF). Или преобразовать объект модели домена в DTO на уровне DAO или Service и отправить легкий DTO на уровень представления.
Мне сказали, что нет смысла использовать DTO, потому что изменения в базе данных приведут к изменениям ко всем вашим DTO, тогда как использование объектов модели везде потребует изменений в затронутом объекте модели. Тем не менее, легкость использования и легкий характер DTO, кажется, перевешивают это.
Я должен отметить, что мое приложение использует Hibernate Model Objects и использует свои собственные объекты модели, созданные пользователем (что не связано с какой-либо сессией БД, всегда отделяется). Является ли любой из вышеперечисленных сценариев более полезным для строгой модели объекта модели? Использование Hibernate было огромным PITA в отношении таких вещей, как Lazy Initialization Exceptions.
Я редактирую этот вопрос в надежде на продолжение обсуждения (не уверен, что я делаю это правильно):
Проблема с объектами модели заключается в том, что они не являются гибкими вообще. В приведенном ниже комментарии говорится, что приложение должно быть спроектировано таким образом, чтобы объекты модели могли использоваться на всех уровнях. Зачем? Если пользователь хочет кусочек смешной функциональности, я должен сказать им: "Хорошо, что не будет работать с объектами модели"?
Обычный и простой, есть только раз, когда объекты модели не будут работать. У вас может быть:
public class Teacher {
List<Student> students;
[tons of other Teacher-related fields]
}
public class Student {
double gpa;
[tons of other Student-related fields]
}
но, возможно, вам не нужна вся эта информация. Вам просто нужна фамилия преподавателя, количество учеников, которых они учат в этом году, и средний показатель по ГПД для всех студентов. Что бы вы сделали в этом случае? Получите полную информацию о преподавателях и студенческих отношениях, а затем ваш код получает счет в списке учеников, а затем вычисляет общее среднее значение всех gp внутри? Это похоже на waaaay больше усилий, чем просто создание DTO с "String lastName", "int numStudents" и "double combinationGpa;
Может показаться, что мой разум был составлен на них, но мне еще предстоит работать в приложении, где объекты модели могут быть полностью использованы в каждом конкретном случае. Обычные приложения реального мира с нестандартными пользовательскими запросами просто не работают.