Есть ли шаблоны для модели / классы объекта

Что лучший подход должен взять при получении по запросу объектов модели от нескольких источников данных?

Например, у меня есть приложение, имеет, имеет некоторые данные, хранившие в использовании базы данных MySQL, в спящем режиме. Что, Если я хотел хранить некоторые другие объекты в EC2 или Google App Engine? Я понимаю что краткий обзор ДАО реализация работы с конкретным источником данных, но что относительно самих объектов?

Сначала я думал, аннотируя мои объекты jpa аннотациями, было отличное решение, но теперь кажется, что я действительно привязал свои объекты к конкретной реализации. В случае Механизма Приложения, например, некоторые из этих аннотаций не имеют никакого смысла.

Кажется, что мне нужен чистый класс POJO для представления моих объектов, совершенно свободных от логики персистентности. Если я хотел смоделировать Собаку, например (да хромой выбор, но безотносительно).
Был бы он иметь смысл иметь абстрактный класс Собаки, затем определять подклассы для работы с конкретными решениями для персистентности: HibernateDog, GAEDog, и т.д.

Спасибо.

8
задан D.C. 19 January 2010 в 22:14
поделиться

6 ответов

Реализация сервера REST для GAE-python с открытым исходным кодом доступна здесь .

Я ничего не знаю о данных ядра, но я могу легко сохранить объекты в GAE, если вы можете сериализовать их как двоичные или xml.

Двоичные объекты до 1Mb могут храниться как BlobProperty и последовательности как TextProperty .

Существует также API Blobstore для объектов размером до 50 мегабайт .

-121--4349609-

Не напрямую.

Указатель нестатической функции (известный как указатель члена) имеет скрытый параметр this, поэтому типы не совпадают. Статическая функция не имеет указателя this.

Чтобы обойти это, необходимо иметь возможность передать предмет пользовательских данных, который является указателем «this» объекта, который вы хотите использовать в качестве обратного вызова. Затем укажите статический члена, который передается пользовательским данным, преобразует его в указатель на объект класса и вызывает нестатический члена на нем.

Глядя на код, который вы опубликовали, трудно определить, существует ли объект данных пользователя, возможно, последний, но = один параметр.

-121--3909852-

Это отличный вопрос, даже если проблема не новая. Как индустрия, мы часто меняем «традиционную мудрость» по этому вопросу на протяжении многих лет. Ответы, которые вы получите сегодня, не обязательно такие, какие вы получили бы 5 лет назад или 5 лет в будущем.

Представляя, как я хотел бы справиться с этим элементом, я задаюсь вопросом о некоторых вещах, которые вы не заявили: является ли ваше приложение «системой записи» для объектов Dog? Какие еще подсистемы/слои/приложения должны знать об объектах Dog.

В Java, когда вы пишете совершенно новые типы, такие как Animal > Dog, вы получаете следующий премиальный: возможность написать целую кучу больше кода, который умеет взаимодействовать с объектами Animal и Dog. В 2010 году я был менее убежден, что это хорошая идея, чем пять лет назад.

Отвечаете ли вы за то , чтобы намереваться базы данных, в которой хранится Собачья информация? Раньше мы делали это постоянно, но в настоящее время я обычно интегрируюсь с записями данных, которые фактически управляются другими системами: API Google, LDAP сущностей, хранилища данных, продукты, такие как люди, и т.д.

Если вы не в обвинение определения того, что Собака и как они взаимодействуют с вселенной, я бы посмотрел на доменно-агностический способ моделирования Собачьей информации в памяти. Есть тонны: XML/DOM, JSON, Map и т.д.

Преимуществ перемещения чужих данных в этих форматах много...

  • Вам не нужно писать POJO
  • они богаты функциями, документацией и тестированием
  • Существуют многочисленные API для преобразования, манипулирования и сериализации этих существ
  • Вы можете повторно использовать свой вид/контроллер/другой код в других доменах

С другой стороны... если вы являетесь системой записи данных Dog, рассмотрите возможность использования интерфейсов вместо абстрактных классов. Или, возможно, интерфейсы и абстрактные классы.Java имеет только одно наследование; свяжите свой код ракурса/контроллера/другого кода с интерфейсами, чтобы обеспечить максимальную гибкость в будущем.

4
ответ дан 5 December 2019 в 14:03
поделиться

Аннотации JPA могут быть приятно в том, что они позволяют вам разместить метаданные метаданные объекта-реляционного сопоставления (ORM) в одни и те же файлы, что и ваши классы объектов, но вы абсолютно правильно, что происходит смешивание опасений, когда вы объедините метаданные JPA с "чистыми" пожётами. Это компромисс.

Однако есть альтернатива. Вы можете использовать конфигурацию ORM в XML-файлах, а таким образом сохраняйте эти детали из ваших классов объектов. JPA предоставляет синтаксис конфигурации XML, но для моих проектов я предпочитаю использовать собственные сопоставления XML Hibernate для добавленной гибкости, которую они обеспечивают. Это может быть не так модно, как аннотационный подход, но в моем опыте он работает довольно хорошо.

2
ответ дан 5 December 2019 в 14:03
поделиться

Вы правы в использовании слоя DAO для абстрактных деталей DataSource из других слоев. Таким образом, модельный слой должен на самом деле не иметь знания о том, какие методики хранения данных или какая база данных используется.

Ответ на ваш вопрос будет: использовать сервисный слой. Это слой, в котором вы помещаете весь свой бизнес-код. Какую сущность к созданию экземпляра, который DAO использовать, как подтвердить данные, демаркацию транзакции и т. Д.

, поэтому сервисный слой должен быть загрузке нагрузки / сохранения ваших объектов. И вот где вы должны встроить логику о том, что использовать DataSource / базу данных. Используйте инъекцию зависимости весной, чтобы помочь вам с этим. Введите свой выбор DAO, объектов в сервисный слой.

Классы сущности: Собака, CAT

Услуги Услуги: AnimalCenterservice

DAO Classes: AnimalCenterHibernate, AnimalCenterJDBC

Дайте мне знать, если требуется больше объяснений. Только мои 2 цента

2
ответ дан 5 December 2019 в 14:03
поделиться

Что у вас есть, кажется правильным способом. Хороший дизайн не означает, что сущности не привязаны к технологии, это просто означает, что если вы измените технологию вам только , изменяют 1 слой вашего приложения.

Сущности с JPA являются хорошим решением, если вы используете JPA. Помимо этих организаций, вы можете иметь больше «сущностей» (Pojos), которые связаны с GAE и т. Д.

Об абстрактной собаке и подклассах, которые кажутся излишним, за исключением того, что если вы действительно надо надо. Если вам действительно нужно, пожалуйста, проверьте объекты DTO: http://en.wikipedia.org/wiki/data_transfer_Object

DTOS используются для передачи объекта в верхние слои (выше DAO) в соответствии с последовательным способом (и Сделайте это сериализуемым) даже при работе с несколькими источниками данных / технологиями в слое настойчивости.

1
ответ дан 5 December 2019 в 14:03
поделиться

Одной из проблем с гибернатом является то, что он впрыскивает свою коллекцию Реализации в вашем классе доменов, вызывая проблемы, если вы попытаетесь отправить свой класс через провод, используя сериализацию (например, с сервера к клиенту).

В вашем приведенном выше примере я бы сомневался в необходимости предоставлять подкласс, специфичные для хранения хранилищ:

сделать / если классы действительно содержат состояние, относящиеся к тому, как они были сохранены? I.e. Это концепция центральной к классу и, следовательно, достойна использования вашего «одного выстрела» при наследстве (в Java)? Я бы утвердовал, что более полезная иерархия наследования в вашем примере была бы чем-то вроде:

  • животное
    • млекопитающее
      • Собака
      • CAT

Кроме того, с дизайном вы предлагаете, вы можете столкнуться с проблемами, если, например, вы хотите сохранить экземпляр , чтобы вздрогнул, но не знаю, Собака - Hibernatedog , GAEDOG , и т. Д. И должен выполнять проверки / накладки на данный момент.

2
ответ дан 5 December 2019 в 14:03
поделиться

Вы не захотите, чтобы ваш код настойчивости наследулся от классов сущностей, так как это сделает невозможным использование наследования для классов ваших доменных сущностей. Например, если у вас есть HibernateDog, унаследованный от Dog, то вам не будет разрешено иметь Poodle, унаследованный от Dog, не заставляя Poodle быть Hibernate специфичным.

Один из подходов, который работает, это использование сущностей данных, которые специфичны для персистентности. Классы ваших сущностей домена будут делегировать объекту сущности данных постоянные атрибуты через интерфейс. Затем вы можете заменить различные классы сущностей данных, специфичные для реализации персистентности, при условии, что они соответствуют интерфейсу сущности данных.

Собачьи ссылки (и делегирование) интерфейса DogEntity. Poodle наследует от Dog, PoodleEntity наследует от DogEntity.

HibernateDog реализует DogEntity
. HibernatePoodle реализует PoodleEntity и наследует от HibernateDog.
...
StubDog реализует DogEntity
. StubPoodle реализует PoodleEntity и наследует от StubDog
. ...

Вы можете иметь столько типов сущностей данных, сколько захотите. Объекты данных будут очень тонкими и будут содержать только переменные постоянных членов и аннотации или любой другой код, необходимый для сохранения.

Доменные сущности будут содержать бизнес-логику, специфичную для данной сущности.

1
ответ дан 5 December 2019 в 14:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: