вторник, 13 января 2009 г.

Решение проблемы с Lazy loading при использовании Hibernate через Spring


Hibernate поддерживает несколько стратегий загрузки связанных объектов из БД. Одной из самых популярных стратегий является т.н. ленивая загрузка - lazy loading. Предположим, что у нас есть сущность "блог", которая содержит свойство, представляющее собой коллекцию опубликованных постов (коллекцию сущностей типа "пост"). Согласитесь, что незачем выбирать из БД посты, если мы хотим всего лишь получить название блога. Добиться такого поведения нам и помогает ленивая загрузка - коллекция постов будет загружена из БД только, если мы захотим к ней обратиться.

Все операции с БД в Hibernate осуществляются через HibernateSession. В случае ленивой загрузки возможна ситуация, что после получения объекта типа "блог" сессия закроется. Тогда, при попытке обратиться к коллекции постов данного блога мы получим эксепшн. Hibernate не сможит вытянуть эту коллекцию из БД, потому что сессия уже закрыта.

вторник, 16 декабря 2008 г.

Создаем веб-приложение на базе Tapestry в Eclipse WTP


Здравствуйте, уважаемые читатели. Суровый челябинский программист все еще жив, он по прежнему очень суровый и временами даже челябинский.

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

Вообще есть плагин под эклипс для работы с Tapestry, но плагин очень старый, для 3й версии фреймворка. Соответственно, никаких преимуществ в его использовании я не вижу, поэтому работать будем без специальных tapestry-плагинов.

Начнем с того, что определимся с инструментарием. Итак, будем иметь:

  • Eclipse 3.4 (впрочем не принципиально, 3.2 и 3.3 тоже подойдут) с установленным WTP

  • Tapestry 5.0.15

  • Tomcat 6 (хотя работать будет и на 5-й версии)



Для тестового приложения я создаю отдельный воркспэйс. Также устанавливаю томкат, просто распаковывая zip-архив в отдельную папку (это под Windows). Папка с томкатом находится, естественно, вне воркспэйса.

вторник, 25 ноября 2008 г.

Интегратор vs Вендор


Бывают моменты когда перед человеком встают вопросы, которые можно отнести к философским. Например, куда идти работать - в интегратор или в вендор? Кто-то может дать ответ на этот вопрос сходу, кому-то же приходится долго и мучительно думать.

Так получилось, что сейчас я работаю в компании Naumen, которая совмещает эти две бизнес-модели. Мы являемся вендорами таких решений, как Naumen Service Desk (который кстати недавно прошел сертификацию на соответствие ITIL), Naumen Call Center и конечно же Naumen DMS (в группе разработки которого я и тружусь рук своих не покладая). Чем хорошо жить вендору? Он разрабатывает некую "коробку" и все силы разработчиков тратит только на это. Соответственно, внедрением этой "коробки" занимаются или его партнеры (не знаю была ли Майкрософт на этом пути первой, но успешность подхода очевидна), либо вообще сами клиенты. Цимес тут в том, что одну разработанную "коробку" можно продавать многократно.

Но у любой медали, как известно, две стороны. Минусами вендорства является то, что пока ты не разработал эту самую "коробку" тебе надо на что-то жить. Пока ты не вывел ее на рынок - тебе надо на чтото жить. Пока ты не оброс жирком, т.е. сетью партнеров, ну тут вы уже поняли... Выхода 2 - или привлечь венчурный капитал, или получать деньги с интеграторства.

среда, 29 октября 2008 г.

Включаем логирование в веб-приложении, основанном на Spring, через Log4j


Развивая тему использования Spring-фреймворка поговорим сегодня об одной из самых важных для разработчика вещей - о логгировании. Для ведения логов многие Java-программисты используют замечательную и очень мощную библиотеку Log4J.

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

Для того, чтобы подключить log4j к веб-приложению необходимо указать спрингу где лежит файл с настройками библиотеки. Для этого в дескриптор развертывания (web.xml) необходимо добавить строки, устанавливающие параметр сервлет-контекста log4jConfigLocation и подключить Log4jConfigListener. Выглядит все это примерно так:

    <context-param>

        <param-name>log4jConfigLocation</param-name>

        <param-value>/WEB-INF/log4j.properties</param-value>

    </context-param>

   

    <listener>

        <listener-class>

            org.springframework.web.util.Log4jConfigListener

        </listener-class>

    </listener>

 


После этого можно корректно использовать log4j в своих классах.

Если хочется посмотреть, что происходит в самом Spring фреймворке возникают сложности. Дело в том, что spring использует не log4j, а commons-logging. Но commons-logging обладает приятной особенностью - она позволяет делегировать логгирование log4j. Для такого делегирования необходимо в classpath приложения (в случае веб-приложения - в /WEB-INF/classes/) создать файл commons-logging.properties, содержащий следующую строку:

org.apache.commons.logging.Log=org.apache.commons.logging.impl.Log4JLogger


Ну и конечно же, нужно не забыть в log4j.properties указать нужный уровень логгирования для Spring, например такой:

log4j.logger.org.springframework=debug


Все, после этого можно увидеть много нового и интересного о том, как работает Spring-фреймворк.

Если есть вопросы или пожелания - прошу оставлять их в комментариях.

Понравилось сообщение - подпишись на блог

понедельник, 27 октября 2008 г.

Подключаем Hibernate Interceptor через Spring


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

Сегодня суровый челябинский программист расскажет о том, как подключить свой интерцептор через Spring и о том, какие при этом возникают проблемы.

вторник, 15 июля 2008 г.

Тестируем Spring-приложение с помощью JUnit


В рамках разработки своей социальной сети решил освоить такую замечательную вещь как юнит-тесты. Точнее не столько освоить (с концепцией юнит-тестирования и базисом использования JUnit я знаком), сколько научиться повсеместно применять для тестирования многоуровневого Spring-приложения (DAO, сервисы, страницы и компоненты веб-интерфейса).

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

суббота, 12 июля 2008 г.

Совместное использование Tapestry и Spring


Давно задумывал написать что-то полезное для блоггеров и вконце-концов родилась идея конечно же социальной сети. Да, да, можете ругать за очередной велосипед, но как говорится у своего велосипеда колеса круглее. Собственно вопрос на чем реализовывать особо не стоял, т.к. решено было реализовывать на Java, заодно и получить опыт проектирования с нуля пусть не очень сложного, но все же J2EE приложения. Единственная проблема, которую я сейчас вижу это проблема последующего развертывания - нужно будет выбрать java-хостинг (скорее всего буржуйский) и как-то залить туда приложение. Впрочем проблему деплоя на виртуальный хостинг я еще опишу.

Впрочем выбор Java в качестве платформы для реализации приложения ставит перед нами еще одну проблему выбора - проблему выбора библиотек и фреймворков. Так как я имею опыт работы с Tapestry (не сильно большой, но все же) и этот опыт положительный, для реализации веб-части я выбрал именно данный фреймворк. Tapestry основан на IoC-контейнере Hivemind, но я отказался от его использования в пользу более мощного Spring. Почему Spring, а не например Guice? Потому что Spring позволяет не изобретать велосипед - определение источников данных, подключение Hibernate, AOP, управление транзакциями - это все есть в Spring (точно так же как и возможность определения Generic DAO, интерцепторов и многих других вкусностей). Собственно разобраться со Spring это тоже одна из целей моего проекта.

Так же не маловажную роль сыграл тот факт, что Spring поддерживается Tapestry "из коробки". А вот о том, как подключить Spring к Tapestry и инъектить эти бины на страницы и в компоненты, мы и поговорим.