2017-02-14 18 views
0

Я немного борюсь с моделью моих сущностей.@Transient vs decorator

У нас есть сущность с 6-8 переменными экземпляра. Два из них на самом деле не сохраняются в базе данных, а используются только для проверки или отображения в пользовательском интерфейсе. Поэтому, когда мы извлекаем сущность, мы заполняем внешний вид.

Теперь, по словам одного из моих коллег, его лучшая практика использует декоратор вместо использования @Transient. В какой-то степени я согласен. Потому что он разъясняет фактическую модель, которую представляет БД.

Но это добавит дополнительные шаблонное для некоторых случаев (например, для бизнеса, я могу назвать объект как MyEntityBO. Но если я использую его для UI ... снова имя будет немного запутанными.

Моим вопрос, что сценарий лучше использовать @Transient, а не декоратор или наоборот

+1

Ни. Вы не должны использовать объекты непосредственно из пользовательского интерфейса по этой причине. Вы должны скорее иметь определенную для представления модель, представляющую собой модель, специально разработанную для представления. Эта модель просмотра относится к пользовательскому интерфейсу. Модель просмотра может инкапсулировать исходную модель через композицию, но это не будет декоратором как таковым. То есть, если ваше приложение не является простым CRUD, в этом случае просто используйте @Transient. – plalx

+0

можете ли вы показать пример кода, чтобы дать представление о том, как вы можете добавить шаблон декоратора здесь? –

+0

@plalx В моем случае это не всегда пользовательский интерфейс. и объект также используется для другой проверки. состав кажется лучшим способом справиться с этой ситуацией. Создайте 2 объекта. ObjectUI, ObjectBO. так что только getter с тем, что необходимо для UI, будет там. так что случайно, то, что не должно быть видимым для пользовательского интерфейса, но должно быть там в основном объекте, например. id/password можно скрыть. (опять же, аргумент счетчика здесь «@IgnoreJson» :) Я пытаюсь понять, в каких случаях «@Transient» по-прежнему жизнеспособен. Если вы сказали, что приложение - это только CRUD, имеет смысл иметь только «@Transient» –

ответ

0

Это неправдоподобная практика использования объекта для обоих: отображение БД и карта пользовательского интерфейса пинг. Всегда думайте о принципе единой ответственности. Сущность должна быть просто ответственной за отображение БД, не более того. Вы должны создать слой DTO для представления пользовательского интерфейса. Но в этом случае вам также следует создавать конвертеры, это скучно, я предлагаю использовать Mapstruct - http://mapstruct.org. Если вам нужно использовать @Transient, это первый признак того, что smth идет не так, помните об этом. Удачи :)

@Entity 
public class User { 
    @Id 
    Long id; 
    String name; 
} 

public class UserDto{ 
    Long id; 
    String name; 
} 

public class UserConverter{ 
    public UserDto toDto(User user) { 
     if (user == null) return null; 
     UserDto dto = new UserDto(); 
     dto.setId(user.getId()); 
     dto.setName(user.getName()); 
     return dto; 
    } 

    public User toEntity(UserDto dto){...} 
} 

И в DTO объект, который вы можете создать дополнительные поля и методы, необходимые для какой-то цели

+0

проблема поддерживает этот DTO. Он создает ненужный подробный код. Но если я сделаю его состав, он сделает его более удобным. Мое сомнение касалось «@Transient», почему они создали один, если сущность должна была только отображать структуру БД? для чего это мотивация. где его более целесообразно использовать это ... Но я сейчас понимаю ... принцип единой ответственности. –

+0

Я не рекомендую использовать обертку для этого, вы должны выделить ваш слой dao, уровень обслуживания и слой пользовательского интерфейса. В идеале вы должны получить объект из db, сделать бизнес-логику, построить объект, который вам нужен на стороне пользовательского интерфейса, и отправить его.Если вы отправляете оболочку, это означает, что объект находится внутри объекта-оболочки, это неправильно, потому что вы отправляете объект домена в пользовательский интерфейс. И это также может привести к LazyInitException, так как ваш отдельный объект был отправлен в пользовательский интерфейс. Вы должны отправить полностью построенный объект DTO в пользовательский интерфейс. На самом деле шаблон DTO является одним из лучших способов обработки LazyInitException. – idmitriev

+0

Подумайте о своей архитектуре, ваши слои должны быть тесно связаны и работать со своими данными. Это будет отлично, если у вашего DTO нет никаких методов, это просто глупые данные. Пользовательский интерфейс отвечает за обработку данных – idmitriev

-1

Главный недостаток использования шаблона Decorator заключается в том, что обслуживание кода может быть проблемой (по моему опыту). Я настоятельно рекомендую вам пойти с @Transient .

+0

Можете ли вы немного рассказать о «поддержании кода»? какие проблемы или неприличные вы видели, где она создала проблему? –

+0

В нашем проекте Decarator у шаблона было много объектов типа similer. Таким образом, во время обслуживания он становится головной болью. Также в случае, если вы планируете мигрировать (в будущем), это неудобно, чем переходный шаблон. Но также, если у вас мало мелких объектов, это будет не будет проблемой. Я сам столкнулся с проблемами, поэтому предлагаю.Черцы – Akshay