Java на habrahabr

Апрель 12, 2012

 

Магический Репозиторий: интеграция Spring Data-JPA и Google Guice

Хабы: JAVA

Не так давно на Хабре был хороший пост посвященный проекту Spring Data-JPA.
Проект меня очень впечатлил, т.к. он предлагал хорошо продуманное решение для работы с репозиториями.
Собственные наработки на эту тему у нас имелись, однако Spring Data-JPA был намного более элегантным и функциональным решением.
Была одна загвоздка — проекты с которыми я работаю построены с применением Google Guice.
В свое время это был мой осознанный выбор и в целом он до сих пор устраивает как команды проектов, так и заказчиков.

… но концепция репозиториев от Spring Data-JPA была слишком вкусной…
Читать дальше →

Java на habrahabr

Март 5, 2012

 

JAVA / [Из песочницы] Spring Data на примере JPA

Введение


Spring Data позволяет легче создавать Spring-управляемые приложения которые используют новые способы доступа к данным, например нереляционные базы данных, map-reduce фреймворки, cloud сервисы, а так же уже хорошо улучшенную поддердку реляционных баз данных.

Java на habrahabr

Ноябрь 1, 2011

 

JAVA / JPA: Хранение перечислений в базе данных

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

Суть её очень проста: если хранить перечисления как сущности (@Entity), то с ними получается крайне неудобно работать и база данных нагружается лишними запросами даже несмотря на кэширование. Если же перечисление определять как enum, то с ними становится удобно работать, но возникает проблема синхронизации с базой данных и отслеживания ошибок таковой синхронизации.

Особенно актуально это в том случае, когда поле, содержащее перечисление, аннотировано как @Enumerated(EnumType.ORDINAL) — всё мгновенно ломается при смене порядка объявления значений. Если же мы храним значения в строковом виде — как @Enumerated(EnumType.STRING) — возникает проблема скорости доступа, так как индексы по строковым полям менее эффективны и занимают больше места. Более того, вне зависимости от способа хранения значения поля при отсутствии в базе данных таблицы со списком допустимых значений мы никак не защищены от некорректных или устаревших данных и, как следствие, проблем.

Однако сама идея хранения в базе данных заманчива простотой построения запросов в ручную, очень ценной при отладке ПО или решении сложных ситуаций. Когда можно написать не просто SELECT id, title FROM product WHERE status = 5, а, скажем, SELECT id, title FROM product JOIN status ON status.id = product.status_id WHERE status.code = 'NEW' — это очень ценно. В том числе и тем, что мы всегда можем быть уверены в том, что status_id содержит корректное значение, если поставим FOREIGN KEY.

На самом деле, существует очень простое и изящное решение этой проблемы, убивающее сразу всех зайцев.

Java на habrahabr

Февраль 20, 2011

 

JAVA / [Из песочницы] Metawidget — инструмент, гнерирующий Java формы

Привет читатель.
Хочу рассказать про инструмент для Java на который я недавно наткнулся и не нашел на хабре ни одного упоминания о нем. Называется он Metawidget и его предназначение — генерировать формы в Java.

Java на habrahabr

Февраль 14, 2011

 

JAVA / Multitenancy через JPA+Hibernate

Центральной идеей SaaS-модели обслуживания является очень простой фокус. Нужно всего лишь запустить для всех пользователей один экземпляр приложения и этим шагом категорически снизить все мыслимые затраты на инфраструктуру. Такой принцип “коммунальной квартиры” — одна из основных особенностей SaaS; она называется multitenancy.

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

Но такой «ночной кошмар программиста» тяжело развивать и поддерживать. Тяжело из-за того, что весь бизнес-код должен быть построен с учетом контекста выполнения. Из контекста выполнения приложение должно знать о том, для кого выполняется в настоящий момент код и использовать это знание для работы с хранилищем данных. А работа с хранилищем данных в терминах реляционной СУБД — это запросы SQL. В небольшом приложении их немного и издержками на их поддержание можно пренебречь, создав более-менее стабильную обертку. Но в приложении со сложной бизнес логикой необходимо построить масштабируемое решение, которое бы скрывало от разработчика multitenancy настолько, насколько это является возможным.

Итак, что у нас есть? J2EE приложение, использующее для работы с БД прослойку в виде JPA и его реализация — Hibernate. Эти замечательные программные средства содержат все средства для того, чтобы сделать жизнь программиста бизнес-логики беззаботной, а архитектора — насыщенной. Ниже вы найдете описание необходимых для этого шагов.