Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Наследование сущностей и сервис классы / 6 сообщений из 6, страница 1 из 1
24.12.2012, 01:04:39
    #38090081
oson
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наследование сущностей и сервис классы
Подскажите пожалуйста правильный способ имплементации.

Например есть интерфейс Person с полями FirstName И SecondName.
Этот интерфейс имплементируют domain entities - Manager и Customer, у которых есть доп поля, отличающиеся между собой, ну например у Manager есть поле Team, а у Customer есть поле Company.
Ну и соотв они мэппятся в разные таблицы.
Теперь нужно создать service layer для работы с этими сущностями.
Например на странице create-person можно создать и Manager, и Customer.
И например на этой странице только 2 обязательных поля - FirstName и SecondName.
Как правильно создавать Service классы?

Должен быть ManagerService и CustomerService?
Или должен быть только PersonService, а внутри должна быть проверка в каждом методе, что это за имплементация - Manger или Customer - и вызывается соответствующий метод в persistence layer, соответствующий классу. Я использую Spring JPA Data, и там каждый persistence класс привязан к определенной domain entity.

Как-то не хочется вызывать
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
 if(person instane of Manager) 
   {
        managerRepository.save((Manager)p);
    }
    else if(person instane of Customer) 
   {
        customerRepository.save((Customer)p);
    }



Как правильно должны соотноситься в таком случае сервис классы и доменные ентати?
...
Рейтинг: 0 / 0
24.12.2012, 05:20:24
    #38090127
IDVsbruck
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наследование сущностей и сервис классы
Надо полагать, "person instane of Manager" - это "person instanceof Manager", а под условием "р" - это "person"?
Думаю, проблема разделения сервис-слоя относится к предпочтениям работы с объектами. Хотя, надо полагать, у тебя веб-проект (раз речь об страницах, а не, скажем, об окнах), следовательно, раз person знает, что он Manager или Customer, то где-то произошла сериализация данных с запроса. Поэтому логично было бы не спрашивать в очередной раз у объекта "чьих он", а разделить логику, тем более, что она может разростаться. А ДАО-методам, в принципе, все равно - используй более универсальный репозиторий и скармливай его методам Object, а он сам разберется с сущностями и на какую таблицу персистировать (по крайней мере, Хибернейт это делает без указания класса сущности).

Кстати, ты можешь модифицировать структуру, сделав Person не интерфейсом, а сущностью с @javax.persistence.Inheritance(strategy = javax.persistence.InheritanceType.JOINED) с полями firstName/lastName, а Manager и Customer - "extends Person", но уже без пересекающихся полей. Правда, это не касается поставленного вопроса ...
...
Рейтинг: 0 / 0
24.12.2012, 11:53:39
    #38090395
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наследование сущностей и сервис классы
oson,

У вас ошибка где-то раньше. Например в контроллере, если вы используете MVC. Выбирать правильный workflow нужно там же где вы формируете объект и решаете будет это Manager или Customer. Там у вас есть какие-то явные признаки, которые вы уже используете. И оттуда каждая из сущностей идёт уже своей транзакцией. А когда нужно реализовать общее поведение, то приходится делать паралельную иерархию (GoF Bridge). В этом как раз проявляется недостаток анемичной модели. Через rich можно реализовать всё в той же иерархии, но вылезут проблемы сильной связности.
...
Рейтинг: 0 / 0
24.12.2012, 12:34:44
    #38090474
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наследование сущностей и сервис классы
oson,
вот у тебя вопрос вроде бы по БЛ.
Но код-пример ты привёл совсем не Бизнес-логие (сервисного слоя).
Не можешь реальный Hello World привести?
...
Рейтинг: 0 / 0
03.01.2013, 01:05:57
    #38099026
oson
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наследование сущностей и сервис классы
Вот пример логики - Employe и Manager.
Такая иерархия

Код: 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.
@Entity
@Inheritance(strategy = InheritanceType.JOINED)
public abstact class Person()
{
  private String name;
}

@Entity
public class Employe extends Person
{
    Department departmentWhereHeWorks;
}

@Entity
public class Manager extends Person
{
    Department departmentThatHeManages;
}

@Entity
public class Department
{
    Manager departmentManager;
    List<Employe> employes;
}





На странице можно выбрать из списка сотрудника и выбрать из второго списка отдел.
Нажимаем Save.
Если это простой сотрудник, то должен быть вызван метод save(Employe employe), в котором сотрудник добавляется в список
List<Employe> employes у класса Department.
Если это Manager, то вызывается метод save(Manager manager), в котором этот сотрудник становится полем
Manager departmentManager у класса Department.

Как располагать эти методы в классах Service layer.
Можно например создать класс PersonService и сделать такую иерархию

Код: 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.
@Service
public class PersonService
{
   public save(Person person);
   
}

@Service
public class ManagerService
{
    @Override
    public save(Person person)
   {
       //сохранить как директора департамента 
   }
}

@Service
public class EmployeService
{
    @Override
    public save(Person person)
   {
       //сохранить как сотрудника департамента 
   }
}



То есть структура сервис классов будет повторять структуру доменных сущностей.
Делается так? Удобно это или это абсурд?
...
Рейтинг: 0 / 0
03.01.2013, 12:36:34
    #38099192
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наследование сущностей и сервис классы
osonТакая иерархия
приведи пример Модели. Т.е. маппинг DAO без сеттеров и геттеров.
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Наследование сущностей и сервис классы / 6 сообщений из 6, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]