Шаблон репозитория - как его понять и как он работает со «сложными» сущностями?
Мне трудно понять шаблон репозитория.
Есть много мнений на эту тему, как вШаблон репозитория сделан правильно но и другие вещи, такие какРепозиторий нового Синглтона или снова как вНе используйте DAO используйте репозиторий или просто взятьSpring JPA Data + Hibernate + MySQL + MAVEN где каким-то образом репозиторий выглядит так же, как объект DAO.
Я устал от прочтения этого материала, потому что imho это не может быть такой сложной вещью, как это показано во многих статьях.
Я вижу это так: кажется, что я хочу что-то вроде этого:
------------------------------------------------------------------------
| Server |
------------------------------------------------------------------------
| | | |
Client <-|-> Service Layer <-|-> Repository Layer <-|-> ORM / Database Layer |
| | | |
------------------------------------------------------------------------
Service Layer
принимает*DTO
объекты и передает ихRepository Layer
это в основном не более, чем "парень", который знаеткак сущность может быть сохранена.
Например, предположим, что у вас есть набор некоторых инструментов (обратите внимание, что это просто псевдокод)
@Entity
class ToolSet {
@Id
public Long id;
@OneToOne
public Tool tool1;
@OneToOne
public Tool tool2;
}
@Entity
class Tool {
@Id
public Long id;
@OneToMany
public ToolDescription toolDescription;
}
@Entity
class ToolDescription {
@Id
public Long id;
@NotNull
@OneToOne
public Language language
public String name;
public String details;
}
То, что я не получаю, это та часть, где я получаюToolSetDTO
объект от клиента.
Как я понял до сих пор я мог написатьToolSetRepository
с методомToolSetRepository.save(ToolSetDTO toolSetDto)
тот "умеет хранить"аToolSetDTO
, Но почти каждый учебник не проходит*DTO
ноEntity
вместо.
Что меня беспокоит, так это то, что если ты возьмешьToolSet
Пример сверху я должен был сделать следующие шаги:
toolSetDto
и проверь если нетnull
Для каждогоtool*Dto
принадлежитtoolSetDto
а) Если есть действительный идентификатор, то конвертировать из
DTO
вEntity
в противном случае создайте новую запись в базе данныхб)
toolDescriptionDto
и преобразовать / сохранить его в базе данных или создать новую записьПосле проверки вышеупомянутых экземпляровToolSet
(сущность) и настроить его для сохранения в базе данныхВсе это слишком сложно, чтобы просто позволить сервисной функции (интерфейсу для клиента) справиться с этим.
То, о чем я думал, создавало, например,ToolSetRepository
но вопрос здесь
ToolSet
объект объекта или он используетDTO
объект?В любом случае:*Repository
разрешеноиспользование другие объекты хранилища? Например, когда я хочу сохранитьToolSet
но я должен хранитьTool
а такжеToolDescription
первый - я бы использовалToolRepository
а такжеToolDescriptionRepository
внутриToolSetRepository
?Если так: Почему это не нарушает Шаблон Репозитория? Если этот шаблон в основном является слоем между службой и моей средой ORM, он просто «не чувствует себя правильным» для добавления зависимостей к другим
*Repository
классы по причинам зависимости.Я не знаю, почему я не могу обдумать это. Не звучиттот сложно, но есть еще помощь там, какSpring Data
, Еще одна вещь, которая беспокоит меня, так как я действительно не понимаю, как это делаетчто-нибудь Полегче. Тем более, что я уже использую Hibernate - я не вижу выгоды (но, возможно, это другой вопрос).
Итак ... Я знаю, что это длинный вопрос, но я посвятил этому уже несколько дней. Уже существует код, над которым я сейчас работаю, который начинает становиться беспорядком, потому что я просто не вижу этого шаблона.
Я надеюсь, что кто-нибудь может дать мне более широкую картину, чем большинство статей и учебных пособий, которые не выходят за рамки реализации очень, очень простого примера шаблона репозитория.