Форум программистов, компьютерный форум, киберфорум
Java EE (J2EE)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.61/18: Рейтинг темы: голосов - 18, средняя оценка - 4.61
2 / 2 / 0
Регистрация: 10.10.2018
Сообщений: 63

Нужна ли модель, если есть Entity

13.01.2019, 13:13. Показов 4031. Ответов 17
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем доброго времени суток. Подскажите, пожалуйста. У меня подключен хибернейт и под него есть сущности Entity. Информацию с этих сущностей нужно вывести в фронт . Насколько правильная практика выводить сразу из Entity или нужно создавать модель, из entity выгружать в модель, и из модели уже в фронт ?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
13.01.2019, 13:13
Ответы с готовыми решениями:

Entity Framework - Code first. Если есть навигационное свойство в классе, то зачем еще внешний ключ?
public class Author { public int AuthorId { get; set; } public string Name { get; set; } public string...

Нужна ли консоль, если есть Workbench?
Если можно создавать БД и делать связи таблиц в Workbench, то появляется вопрос: зачем нам консоль MySQL если все можно сделать без...

Модель отдельно от Entity Framework
Припустим, есть сгенеррированая Entity Framework Как можно сделать модель к Entity Framework, чтобы обращатся можна было к базе...

17
Эксперт Java
 Аватар для KEKCoGEN
2399 / 2224 / 565
Регистрация: 28.12.2010
Сообщений: 8,672
13.01.2019, 15:58
Цитата Сообщение от newComerJ Посмотреть сообщение
Насколько правильная практика выводить сразу из Entity или нужно создавать модель, из entity выгружать в модель, и из модели уже в фронт ?
Если под моделью имеется в виду DTO, то да. Правильно создавать отдельный класс, а не передавать Entity
1
19 / 19 / 1
Регистрация: 12.03.2018
Сообщений: 252
16.02.2019, 20:34
Цитата Сообщение от KEKCoGEN Посмотреть сообщение
Если под моделью имеется в виду DTO, то да. Правильно создавать отдельный класс, а не передавать Entity
Почему? Есть куча инструментов для инкапсуляции данных с фронтом JsonIgnore например.
Если мы делаем DTO то тогда из Entity надо будет мапить в DTO в Factory. А это два новых класса! И много лишней логики...

Это плохо когда создается много лишних структур, вместо использования одной строки JsonIgnore над password-ом или еще каким полем.
1
Эксперт Java
 Аватар для KEKCoGEN
2399 / 2224 / 565
Регистрация: 28.12.2010
Сообщений: 8,672
17.02.2019, 09:57
Artyr2, классы модели принадлежат к архитектурному слою модели и не должны никак взаимодействовать со слоем представления чтобы не создавать сильное связывание элементов. Нет никаких проблем сделать хоть два хоть 22 новых класса если этого требует правильная архитектура, а маппинг в 90% случаев осуществляется одной строкой при помощи modelMapper
1
Эксперт Java
378 / 370 / 114
Регистрация: 30.06.2010
Сообщений: 1,445
17.02.2019, 12:12
Artyr2, о боже, 2 новых класса. Начнем с того что управляемые сущности нельзя выпускать за пределы транзакционного контекста, который ограничивается сервисным слоем. Маппинг в DTO и обратно с кучей настраиваемых правил делается в пару строк маппером, например mapstruct
1
Эксперт функциональных языков программированияЭксперт Java
 Аватар для korvin_
4575 / 2774 / 491
Регистрация: 28.04.2012
Сообщений: 8,779
17.02.2019, 12:15
Цитата Сообщение от Artyr2 Посмотреть сообщение
Это плохо когда создается много лишних структур, вместо использования одной строки JsonIgnore над password-ом или еще каким полем.
Наоборот. Пихать всё в один класс — нарушение SRP, и вообще создание сильной связности. Множество типов DTO может вообще сильно отличаться от множества типов модели и тем более структур хранения данных.

Если используется ORM, то, по-хорошему, должно быть три разных множества типов данных: DTO, (т.н. “Business-Logic”) Model и ORM Entity.
2
Эксперт функциональных языков программированияЭксперт Java
 Аватар для korvin_
4575 / 2774 / 491
Регистрация: 28.04.2012
Сообщений: 8,779
17.02.2019, 13:41
Artyr2, примерно так:
Миниатюры
Нужна ли модель, если есть Entity  
3
19 / 19 / 1
Регистрация: 12.03.2018
Сообщений: 252
17.02.2019, 18:20
Я с вами не согласен. Много классов, кода = много багов, больше читать.

Внутри одной системы я всегда использую model-ки. Если мне надо общаться с другими микросервисами то делаю pojo,DTO. А с фронтом я всегда общаюсь именно моделями, если необходимо отправлять или принимать специфичные данные то тогда делаю новый pojo.

Для запросов getAll, create, update, getById, делать DTO кажется излишним, это просто дублирование кода.

Цитата Сообщение от korvin_ Посмотреть сообщение
и ORM Entity.
тут я использую model. Потому что моделька отражает содержимое базы, делать 2 100% одинаковых класса безумие... Поэтому model и Entity делают в одном классе и это я считаю хорошей практикой.

Цитата Сообщение от KEKCoGEN Посмотреть сообщение
и не должны никак взаимодействовать со слоем представления
то что мы отправляем на фронт (или от него принимаем) это просто JSON-ка, мы ни как не зашиваемся на model если используем ее в контроллере. Любую модель можно безболезненно заменить на что угодно с теми же полями. Если мы общаемся с микросервисами то тут я согласен, потому что если вы передаете целые модели, значит ваша архитектура отстой, и смысл микросервисной архитектуры теряется.
1
Эксперт Java
378 / 370 / 114
Регистрация: 30.06.2010
Сообщений: 1,445
17.02.2019, 19:34
Artyr2, ахах, а теперь сделай две сущности, связанных один ко многим с обратной ссылкой, да и еще связи как LAZY
1
19 / 19 / 1
Регистрация: 12.03.2018
Сообщений: 252
17.02.2019, 19:54
Цитата Сообщение от LeX Посмотреть сообщение
Artyr2, ахах, а теперь сделай две сущности, связанных один ко многим с обратной ссылкой, да и еще связи как LAZY
О госпади, вы меня все тут идиотом считаете?

Я всегда так делаю! Нужно правильно настраивать проект, для работы.

Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.datatype.hibernate5.Hibernate5Module;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateDeserializer;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateSerializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
 
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
 
@Configuration
public class JacksonConfig {
 
    @Bean
    @Primary
    public ObjectMapper serializingObjectMapper() {
        return createObjectMapper();
    }
 
    private ObjectMapper createObjectMapper() {
 
        ObjectMapper objectMapper = new ObjectMapper();
        JavaTimeModule javaTimeModule = new JavaTimeModule();
        javaTimeModule.addSerializer(LocalDate.class, new LocalDateSerializer(DateTimeFormatter.ISO_DATE));
        javaTimeModule.addDeserializer(LocalDate.class, new LocalDateDeserializer(DateTimeFormatter.ISO_DATE));
        javaTimeModule.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(DateTimeFormatter.ISO_DATE_TIME));
        javaTimeModule.addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(DateTimeFormatter.ISO_DATE_TIME));
        objectMapper.registerModule(javaTimeModule);
 
        objectMapper.registerModule(new Hibernate5Module().configure(
                Hibernate5Module.Feature.FORCE_LAZY_LOADING, true));
 
        objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
        objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
        objectMapper.configure(DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT, true);
        objectMapper.enable(SerializationFeature.INDENT_OUTPUT);
        objectMapper.enable(SerializationFeature.WRITE_ENUMS_USING_TO_STRING);
        objectMapper.enable(DeserializationFeature.READ_ENUMS_USING_TO_STRING);
 
        return objectMapper;
    }
}


Вот эта строка

Java
1
2
        objectMapper.registerModule(new Hibernate5Module().configure(
                Hibernate5Module.Feature.FORCE_LAZY_LOADING, true));
Делает так что внутри проекта все модели действительно LAZY, а когда вызываются с фронта они подтягиваются полностью.

Добавлено через 12 минут
Об этом и речь, есть ОЧЕНЬ много механизмов и способов, для работы которые позволяют не делать огромное количество лишних классов. IT это очень динамичная среда, те парадигмы которые были актуальные вчера не будут актуальны завтра. Да, есть определенные правила, но если слепо следовать им вы не будите развиваться. Да, возможны проблемы когда делаешь такие эксперименты, но если просто делать по правилам далеко не уедешь.

Те же @Autowired у нас просто замененны @AllArgsConstructor, или @RequiredArgsConstructor и кода намного меньше... И таких примеров много.
1
Эксперт функциональных языков программированияЭксперт Java
 Аватар для korvin_
4575 / 2774 / 491
Регистрация: 28.04.2012
Сообщений: 8,779
17.02.2019, 20:20
Цитата Сообщение от Artyr2 Посмотреть сообщение
тут я использую model. Потому что моделька отражает содержимое базы
Model-объекты не должны отображать содержимое базы, они должны отображать объекты предметной области.

Цитата Сообщение от Artyr2 Посмотреть сообщение
делать 2 100% одинаковых класса безумие
Они не одинаковые, если, конечно, ты пишешь не HelloWorldREST-интерфейс доступа к БД, а что-то более сложное.

Цитата Сообщение от Artyr2 Посмотреть сообщение
Поэтому model и Entity делают в одном классе и это я считаю хорошей практикой.
Это ужасная практика.

Цитата Сообщение от Artyr2 Посмотреть сообщение
Да, возможны проблемы когда делаешь такие эксперименты
Это не эксперименты, а давно «considered harmful» практика времён появления ORM. Поэтому, в данном случае, у тебя ни разу не развитие.
1
Эксперт Java
378 / 370 / 114
Регистрация: 30.06.2010
Сообщений: 1,445
17.02.2019, 21:13
Hibernate5Module
О боже какой костылище. Видимо про fetch ты не знаешь и о производительности не задумываешься. Мне интересно где рамки транзакционного контекста у тебя

А constructor injection через ломбок по-моему уже давно стандарт
0
19 / 19 / 1
Регистрация: 12.03.2018
Сообщений: 252
18.02.2019, 04:06
Цитата Сообщение от LeX Посмотреть сообщение
О боже какой костылище. Видимо про fetch ты не знаешь и о производительности не задумываешься. Мне интересно где рамки транзакционного контекста у тебя
Преждевременная оптимизация корень всех зол. Я просто пытаюсь сократить до минимума исходного кода. И да, я готов жертвовать производительностью ради понятности(особенно с современными мощностями железа). И да если есть модель в которой 10 других моделей, и каждая модель по 10-20 полей, и надо пагинированный лист, то это достаточно большой размер (150+кб). И только тогда когда размер ответа от сервера достигает таких размеров, я занимаюсь оптимизацией, и делаю это например через MyBatis, сразу в pojo, с необходимыми полями, и обычно с 150кб сокращается почти в 10раз.
0
18.02.2019, 21:34

Не по теме:

Artyr2, удачи, рано или поздно ты придешь к истине или тебя научат. Умник)

0
18.02.2019, 22:18

Не по теме:

Цитата Сообщение от LeX Посмотреть сообщение
рано или поздно
От одного до трех месяцев не так уж и много :D

0
19.02.2019, 05:41

Не по теме:

reisal78, боюсь тут клиника, будет дольше)

0
2 / 2 / 0
Регистрация: 10.10.2018
Сообщений: 63
20.02.2019, 17:40  [ТС]
Спасибо за дискуссию. Лично для меня аргументы с разделением чтобы добиться слабой связности оказались более весомые
1
Эксперт PythonЭксперт Java
19530 / 11067 / 2931
Регистрация: 21.10.2017
Сообщений: 23,294
20.02.2019, 18:12
Цитата Сообщение от newComerJ Посмотреть сообщение
Спасибо
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
20.02.2019, 18:12
Помогаю со студенческими работами здесь

Изменить модель в Entity Framework
Пытаюсь изменить вывод названия модели, но ни как не получается, в файле Model.Designer.cs нет кода Как его создать? В чем у меня...

Как описать модель данных, если модель построена в режиме database first?
Например: public class PersonFindExtended { public string FAM { get; set; } ...

Entity framework модель edmx прочитать таблицу
Просто вывести таблицу на dataGridView я могу так context = new BDEntities(); tableBasket.DataSource = context.Device; В данном...

Тригер, проверяющ. есть ли такой ID и если есть обновляющий его, если нет - добавляющий
Сабж. В MSSQL нуб. Есть ситуация. Добавляю товар из каталога поставщика в каталог магазина. Может быть такое, что мы заказываем...

Entity Framework 6.0.1. Модель Code First. Не обновляются данные, вылетает исключение
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru