Концепция виртуальной машины имеет ряд следствий, важных для применения Java в сети:
- прежде всего, виртуальная машина позволяет решить проблемы безопасности компьютера, на котором исполняется Java-программа; последняя видит только виртуальную машину и ничего не знает о физической среде исполнения, а, следовательно, мы можем четко определить полномочия данной программы по доступу к файлам, каталогам составляющим операционной среды;
- поскольку Java-программа хранится в виде байт-кодов, сервер может передать ее на компьютер-клиент, а тот немедленно запустить ее исполнение, разумеется, при условии, что на клиенте установлена виртуальная Java-машина. Именно так работают аплеты, что и обеспечило их популярность;
- виртуальная Java-машина устроена так, что позволяет собирать программы по кусочкам во время исполнения – это называется динамическим связыванием модулей. Поскольку исполняющая система Java содержит помимо самой виртуальной машины большую библиотеку стандартных модулей, динамическое связывание позволяет нам передавать по Сети только написанные нами для конкретной задачи модули, что резко сокращает объем передаваемой информации.
В основу Java был положен синтаксис C++, но в некоторых отношениях эти два языка существенно различаются. Можно сказать, что Java представляет собой C++, из которого убраны все потенциально опасные конструкции и добавлены несколько идей из других языков программирования. В частности, Java не имеет препроцессора, запрещает прямой доступ к памяти и арифметику указателей, не допускает переопределения операторов и не поддерживает множественного наследования классов. С другой стороны, Java является строго типизированным языком, поддерживает динамическое управление памятью, включая сборку мусора, и многопотоковое выполнение программ.
Java – это объектно-ориентированный язык программирования, основанный на классах. КлассJava – это тип данных, состоящий из некоего набора данных и методов, манипулирующих этими данными. В процессе работы программы создаются объекты, которые являются экземплярами реализации данного класса. Новые классы описываются как наследники существующих классов и тем самым образуют иерархию. Взаимосвязанные наборы классов Java объединяются в пакеты, которые являются самостоятельно компилируемыми единицами.
Программа на языке Java – это текст, состоящий из идентификаторов, ключевых слов, констант, разделителей, символов операций и комментариев. Приведем классический пример, эта программа выводит на экран строку «Hello, world»:
class Test {public static void main(String args[]) {
System.out.println("Hello, world");}}
Комментарии в Java могут быть однострочными и многострочными. Однострочные комментарии начинаются с символов // и продолжаются до конца текущей строки. Многострочные комментарии заключаются в маркеры /* и */, например:
/* Это пример комментария,
содержащего несколько строк. */
Многострочные комментарии не могут быть вложены друг в друга. Текст комментария полностью игнорируется при выполнении программы.
Java поддерживает специальную форму многострочного комментария вида /** … */. Такие комментарии называются документирующими и используются для автоматического документирования библиотек классов утилитой javadoc.
Следующие имена являются ключевыми словами языка Java и не могут употребляться в качестве идентификаторов: abstract, default, if, private, throw, boolean, do, implements, protected, throws, break, double, import, public, transient, byte, else, instanceof, return, try, case, extends, int, short, void, catch, final, interface, static, volatile, char, finally, long, super, while, class, float, native, switch, const, for, new, synchronized, continue, goto, package, this.
Отметим, что ключевые слова const и goto в Java не используются, но являются зарезервированными.
Язык Java является строго типизированным. Это значит, что тип каждой переменной должен быть объявлен. В языке Java есть восемь основных типов данных. Четыре из них представляют целые числа, два – действительные числа с плавающей точкой, один – символ в формате Unicode и последний – логические значения.
Целочисленные типы используются для представления как положительных, так и отрицательных чисел, не имеющих дробной части. В большинстве случаев тип int наиболее удобен. Если нужно задать количество жителей в самой густо заселенной стране, нет ни какой необходимости прибегать к типу long. Типы byte и short в основном используются в специализированных приложениях, например, при низкоуровневой обработке файлов или с целью экономии памяти при формировании больших массивов. В языке Java диапазон целочисленных типов не зависит от машины, на которой выполняется. Это существенно упрощает перенос программного обеспечения с одной платформы на другую.
Типы с плавающей точкой представляют значения, имеющих дробную часть. Имя double означает, что точность этих чисел вдвое превышает точность чисел float в большинстве приложений тип double является наиболее удобным. Ограничение точности чисел типа float во многих случаях попросту недостаточно. Причины по которой тип float все еще используется, – это скорость обработки чисел и экономия памяти при хранении.
Для того чтобы правильно использовать символьный тип char, надо иметь представление о принципах кодировки Unicode. До появления Unicode существовало несколько различных стандартов: ASCII, ISO 8859-1, KOI-8 и т.д. При этом возникали две проблемы:
- один и тот же код в разных кодировках соответствовал различным символам;
- в языках с большим набором символов использовался код различной длины: часто употребляющиеся символы представлялись одним байтом, другие знаки – двумя, тремя и большим количеством байтов.
Для решения этих проблем была разработана кодировка Unicode. В результате исследований, направленных на унификацию кодов символов, выяснилось, что двухбайтового кода более чем достаточно для представления всех символов, использующихся во всех языках, при этом создавался достаточный резерв для любых мыслимых расширений.
Для типа boolean предусмотрены два значения: false и true. Они соответствуют результатам вычисления логических выражений. Преобразование логических переменных в целочисленные и наоборот невозможно.
В языке Java каждая переменная имеет тип. При объявлении переменной сначала указывается ее тип, а затем ее имя. Ниже приведены несколько примеров объявления переменных:
double salary;
int vacationDays;
char yesChar;
boolean done;
long earthPopulation;
2.2 Среда программирования IDE NetBeans
Бесплатная интегрированная среда разработки с открытым исходным кодом для разработчиков программного обеспечения. Она предоставляет все средства, необходимые для создания профессиональных приложений рабочей среды, корпоративных, мобильных и веб-приложений на языке Java, а также C/C++, PHP, JavaScript, Groovy и Ruby. Среда легко устанавливается и сразу же готова к работе во многих операционных системах, в том числе в Windows, Linux, Mac OS X и Solaris.
Среда IDE NetBeans 6.8 является первой интегрированной средой разработки, предоставляющей полную поддержку платформ Java EE 6 и GlassFish Enterprise Server v3. На рисунке 2.5 изображено окно начальной страницы среды программирования NetBeans 6.8. Разработчики, размещающие свои проекты с открытым исходным кодом на портале kenai.com, могут использовать усовершенствованную интеграцию функции отправки мгновенных сообщений и системы отслеживания ошибок со средой IDE, включая полную поддержку JIRA. Кроме того, к улучшенным возможностям относятся новая эффективная функция профилирования C/C++, функция поддержки разработки веб-приложений на базе языка PHP 5.3 и платформы Symfony, усовершенствованная функция автозавершения кода, подсказки и перехода по проектам JavaFX.
Основные функции IDE NetBeans:
- приложения рабочей среды Java. Создание надежных приложений рабочей среды Java Swing при помощи платформы NetBeans поможет сэкономить годы работы. При использовании среды в сочетании с отмеченным наградами средством NetBeans Swing GUI Builder открывается возможность создания профессионального графического интерфейса пользователя;
- приложения Java Enterprise и веб-приложения. Создание веб-приложения с помощью CSS, JavaScript и JSP. Поддержка платформ включает в себя компоненты JSF (Facelets), Struts, Spring и Hibernate. Предоставлен полный набор инструментальных средств Java EE 6, GlassFish, EJB и функция разработки веб-служб;
- визуальная разработка мобильных приложений. Создание, тестируйте и отлаживайте приложения с графическим пользовательским интерфейсом, которые запускаются на мобильных телефонах, телевизионных компьютерных приставках и карманных компьютерах. Среда IDE NetBeans поддерживает JavaFX Mobile и платформу Java ME SDK 3.0;
- динамические языки. Мощный редактор для языков JavaFX, JavaScript, CSS, PHP и Symfony, Groovy и Grails, Ruby и Ruby on Rails, а также Python. Включает в себя семантическую и синтаксическую подсветку, интеллектуальное автозавершение кода, всплывающие окна документации и интеграцию отладки;
- разработка C и C++. Редактор C/C++ с полным набором функций, средство профилирования, отладчик, шаблоны проекта, поддержка нескольких настроек проекта, удаленная разработка и упаковка выполненных проектов.
Поддерживающий различные языки программирования редактор NetBeans обнаруживает ошибки по мере ввода текста и помогает разработчику, показывая всплывающие подсказки и осуществляя автозавершение кода – и все это со скоростью и простотой текстового редактора.
Редактор NetBeans делает отступы строк, проверяет соответствие скобок и слов и подсвечивает синтаксис и семантику исходного кода. Редактор поддерживает несколько языков, включая Java, Ruby, C/C++, XML, HTML, RHTML, PHP, Groovy, документацию Javadoc, JavaScript и JSP. Существует возможность расширения функций редактора с целью поддержки любого другого языка. В среде IDE NetBeans выполняется анализ исходного кода непосредственно во время ввода. Таким образом, реализуется возможность немедленного выявления ошибок и определения того, какие элементы необходимо выделить. Всплывающие подсказки и специальные знаки редактора обеспечивают соответствующее отображение подсказок компилятора, вариантов быстрого исправления ошибок, предупреждений и фрагментов документации по требуемому языку программирования. В среде IDE используется подсветка сходных элементов, парных скобок, точек выхода методов и точек передачи исключений. Если установить курсор на каком-либо элементе, например, поле или переменной, то все случаи вхождения этого элемента будут подсвечены. На рисунке 2.6 показан пример использования подсветки.
Рисунок 2.5 – Начальное окно NetBeans 6.8
Рисунок 2.6 – Использование подсветки в редакторе NetBeans
Действия по переработке кода IDE позволяют реструктурировать код без нарушения его работоспособности. Например, в случае переименования идентификатора или перемещения класса в другой пакет не требуется использовать функции поиска и замены: немедленная идентификация и обновление во всех соответствующих случаях выполняется редактором IDE автоматически.
Редактор обеспечивает автоматическое дополнение кода на нескольких языках, включая Java, Ruby, C/C++, PHP, Groovy, HTML, RHTML, JSP, JavaScript и документацию Javadoc. Во время ввода данных на экране появляется список возможных подстановок для дополнения введенного кода: самые очевидные и общие варианты выбора приведены в верхней части списка, однако всегда остается возможность выбора из полного набора вариантов, в т.ч. из представленных в нижней части списка. Ввод первых букв в слове формата CamelCase активирует автозавершение кода. На рисунке 2.7 показан пример работы автозавершения кода для языка Java.
Рисунок 2.7 – Автозавершения кода для языка Java
Редактор может генерировать стандартные фрагменты кода на Java или других языках. Появляется диалоговое окно, обеспечивающее полное управление созданием методов и их доступом к определенным атрибутам класса. На рисунке 2.8 показан пример генерирования кода. Среда IDE помогает при переопределении методов и генерировании динамических блоков кода, таких как циклы, блоки try-catch, комментарии документации Javadoc и средства доступа. Имеется возможность автоматического удаления концевых пробелов из строк.
Рисунок 2.8 – Генерирования кода на языке Java
Иерархию и членов любого класса Java можно просматривать в удобном всплывающем окне, в котором отображаются базовые классы, производные классы и интерфейсы. Предоставляет возможность использования фильтров для управления уровнем детализации отображаемой информации. На рисунке 2.9 показан пример окна навигации.
Полностью настраиваемый интерфейс пользователя. Кроме того, можно определить размещение окон на экране, а также их горизонтальное или вертикальное разделение. Установите сочетания клавиш или щелкните значки настраиваемой панели управления, чтобы обратиться к средствам компиляции, реорганизации, профилированию, отладке и тестированию. Поведение при автозавершении кода, всплывающие подсказки документации, сочетания клавиш, шрифты редактора и цвета могут полностью настраиваться. Экспортируйте и импортируйте свойства NetBeans для создания резервных копий параметров или их совместного использования в команде.
Рисунок 2.9 – Окно навигации
Локальный журнал файла обеспечивает возможность просмотра последних изменений и возврата к предыдущей версии даже в том случае, если файл не обрабатывается системой управления версиями.
В состав пакета среды IDE входят драйверы для серверов баз данных MySQL и PostgreSQL. В комплекте с базой данных Java DB поставляется сервер приложений Glassfish и комплект JDK 6 от корпорации Sun, так что для создания веб-приложений и корпоративных приложений на основе баз данных имеется все необходимое. Кроме того, в среде IDE можно зарегистрировать любой драйвер JDBC, с помощью которого можно подключиться практически к любой базе данных, имеющей драйвер JDBC.
Работать с MySQL в среде IDE NetBeans очень просто, поскольку она автоматически обнаруживает существующие базы данных MySQL. Зарегистрируйте сервер MySQL и запускайте или останавливайте локальные серверы напрямую из среды IDE. Используйте проводник баз данных для подключения, обзора, создания или удаления баз данных. Можно также зарегистрировать внешние средства администрирования, например, phpMyAdmin, и напрямую вызывать их из среды IDE.
Функция автозавершения кода в редакторе SQL позволяет быстрее вставлять в него названия схем, таблиц и столбцов. Редактор позволяет просматривать историю всех запросов SQL, фильтровать их по поисковым запросам и/или по URL-адресам подключения, а затем вставлять выбранный оператор. Результаты запроса можно отсортировать в редакторе SQL и загружать крупные возвращаемые наборы данных постранично. Возможно напрямую изменять значения возвращаемых результатов, а также вставлять и удалять строки.
С помощью платформы для визуальной разработки приложений JSF можно перетащить таблицы непосредственно из проводника баз данных на компоненты, отображаемые на веб-странице в режиме конструктора, и этот компонент будет автоматически привязан к таблице. Это значительно увеличивает производительность создания веб-приложений, ориентированных на использование баз данных. Разрабатывание переносимых, надежные, масштабируемые и безопасные серверные приложения Java. Приложения Java Enterprise развертываются на серверах, и доступ к ним можно осуществить с помощью веб-обозревателя.
Таблица 2.1 – Комплект стандартных сборок среды IDE NetBeans 6.8
Поддерживаемые технологии
Название сборки
Java SE
JavaFX
Java
Ruby
C/C++
PHP
Все
Java SE
+
+
+
+
JavaFX
+
+
Java Web и Java EE
+
+
Java ME
+
+
Ruby
+
+
C/C++
+
+
Groovy
+
+
+
PHP
+
Поставляемые серверы:
Sun GlassFish
Enterprise Server v3
+
+
+
Apache Tomcat 6.0.20
+
+
Среда IDE NetBeans является первой средой, предоставляющей полную поддержку новейших стандартов Java EE 6, включая новую версию Java EE 6 Web Profile, JSF 2.0 и аннотации, а также платформ Java EE 5 и J2EE 1.4. Используя среду IDE NetBeans для разработки с использованием интерфейса Java Persistence API, JavaServer Pages, Enterprise JavaBeans и веб-служб. Среда IDE работает с любым стандартным контейнером Java Enterprise Edition, среда протестирована на серверах приложений Sun Java System Application Server PE 8.2, GlassFish v3, WebLogic 11g, Apache Tomcat 5.5 и 6, JBoss 5.0. В таблице 2.1 приведены сведения о комплектации стандартных сборок среды IDE NetBeans 6.8. Среда IDE NetBeans поддерживает Facelets, официальную технологию управления представлением JSF 2.0. Можно создавать новые проекты веб-приложений на основе платформы Facelets и работать со стандартными элементами демонстрационной реализации JSF.
Так же добавить или удалить компоненты можно позднее с помощью менеджера плагинов среды.
2.3 Веб-cервер Apache Tomcat
Tomcat – программа-контейнер сервлетов, написанная на языке Java и реализующая спецификацию сервлетов и спецификацию JSP, которые являются стандартами для разработки веб-приложений на языкеJava. Tomcat позволяет запускать веб-приложения, содержит ряд программ для самоконфигурирования. В таблице 2.2 приведено сравнение спецификации сервлетов, JSP,JSTL и версии Tomcat.
Таблица 2.2 – Сравнение спецификаций
Версия сервлетов
2.3
2.4
2.5
Версия JSP
1.2
2.0
2.0
Версия JSTL
1.0
1.1
1.1
Версия Tomcat
4.x
5.x
6.x
Сервер базы данных MySQL
База данных – это организованная структура, предназначенная для хранения информации. Данные и информация – понятия взаимосвязанные, но не тождественные. Сегодня большинство систем управления базами данных (СУБД) позволяют размещать в своих структурах не только данные, но и методы, с помощью которых происходит взаимодействие с потребителем или с другими программно-аппаратными комплексами.
Классифицируют базы данных по модели данных на четыре основных типа:
- иерархические. Иерархическая модель базы данных состоит из объектов с указателями от родительских объектов к потомкам, соединяя вместе связанную информацию. Иерархические базы данных могут быть представлены как дерево, состоящее из объектов различных уровней. Верхний уровень занимает один объект, второй – объекты второго уровня и т.д. Между объектами существуют связи, каждый объект может включать в себя несколько объектов более низкого уровня. Такие объекты находятся в отношении предка, объект более близкий к корню, к потомку, объект более низкого уровня, при этом возможна ситуация, когда объект-предок не имеет потомков или имеет их несколько, тогда как у объекта-потомка обязательно только один предок. Объекты, имеющие общего предка, называются близнецами;
- сетевые. К основным понятиям сетевой модели базы данных относятся: уровень, узел, связь. Узел – это совокупность атрибутов данных, описывающих некоторый объект. На схеме иерархического дерева узлы представляются вершинами графа. В сетевой структуре каждый элемент может быть связан с любым другим элементом. Сетевые базы данных подобны иерархическим, за исключением того, что в них имеются указатели в обоих направлениях, которые соединяют родственную информацию. Несмотря на то, что эта модель решает некоторые проблемы, связанные с иерархической моделью, выполнение простых запросов остается достаточно сложным процессом. Также, поскольку логика процедуры выборки данных зависит от физической организации этих данных, то эта модель не является полностью независимой от приложения. Другими словами, если необходимо изменить структуру данных, то нужно изменить и приложение;
- реляционные. Реляционная база данных представляется пользователю как совокупность таблиц и ничего кроме таблиц;
- объектно-ориентированные. Объектно-ориентированная база данных – база данных, в которой данные оформлены в виде моделей объектов, включающих прикладные программы, которые управляются внешними событиями. Результатом совмещения возможностей баз данных и возможностей объектно-ориентированных языков программирования являются объектно-ориентированные системы управления базами данных. Объектно-ориентированные системы управления базами данных позволяют работать с объектами баз данных также, как с объектами в программировании в объектно-ориентированных языков программирования. Объектно-ориентированные системы управления базами данных расширяют языки программирования, прозрачно вводя долговременные данные, управление параллелизмом, восстановление данных, ассоциированные запросы и другие возможности.
Сервер баз данных MySQL относится к реляционным базам данных. Достоинствами реляционного подхода принято считать следующие свойства:
- реляционный подход основывается на небольшом числе интуитивно понятных абстракций, на основе которых возможно простое моделирование наиболее распространенных предметных областей; эти абстракции могут быть точно и формально определены;
- теоретическим базисом реляционного подхода к организации баз данных служит простой и мощный математический аппарат теории множеств и математической логики;
- реляционный подход обеспечивает возможность ненавигационного манипулирования данными без необходимости знания конкретной физической организации баз данных во внешней памяти.
Выделим следующие основные понятия реляционных баз данных: тип данных, домен, атрибут, кортеж, отношение, первичный ключ.
Для начала покажем смысл этих понятий на примере отношения «Служащие», содержащего информацию о служащих некоторого предприятия, показано на рисунке 2.10.
Рисунок 2.10 – Соотношение основных понятий реляционного подхода
Значения данных, хранимые в реляционной базе данных, являются типизированными, т. е. известен тип каждого хранимого значения. Понятие типа данных в реляционной модели данных полностью соответствует понятию типа данных в языках программирования. Традиционное определение типа данных состоит из трех основных компонентов:
– определение множества значений данного типа;
– определение набора операций, применимых к значениям типа;
– определение способа внешнего представления значений типа.
Обычно в современных реляционных базах данных допускается хранение символьных, числовых данных, точных и приблизительных, специализированных числовых данных, таких, как «деньги», а также специальных «темпоральных» данных: дата, время, временной интервал. Кроме того, в реляционных системах поддерживается возможность определения пользователями собственных типов данных.
Понятие домена более специфично для баз данных, хотя и имеются аналогии с подтипами в некоторых языках программирования. В общем виде домен определяется путем задания некоторого базового типа данных, к которому относятся элементы домена, и произвольного логического выражения, применяемого к элементу этого типа данных. Элемент данных является элементом домена в том и только в том случае, если вычисление этого логического выражения дает результат истина. С каждым доменом связывается имя, уникальное среди имен всех доменов соответствующей базы данных.
Наиболее правильной интуитивной трактовкой понятия домена является его восприятие как допустимого потенциального, ограниченного подмножества значений данного типа. Например, домен «ИМЕНА» в нашем примере определен на базовом типе символьных строк, но в число его значений могут входить только те строки, которые могут представлять имена, в частности, для возможности представления русских имен такие строки не могут начинаться с мягкого или твердого знака и не могут быть длиннее, например, 20 символов. Если некоторый атрибут отношения определяется на некотором домене, как атрибут «СЛУ_ИМЯ» определяется на домене «ИМЕНА», то в дальнейшем ограничение домена играет роль ограничения целостности, накладываемого на значения этого атрибута.
Следует отметить также семантическую нагрузку понятия домена: данные считаются сравнимыми только в том случае, когда они относятся к одному домену. В нашем примере значения доменов «НОМЕРА ПРОПУСКОВ» и «НОМЕРА ОТДЕЛОВ» относятся к типу целых чисел, но не являются сравнимыми.
Понятие отношения является наиболее фундаментальным в реляционном подходе к организации баз данных, поскольку n-арное отношение является единственной родовой структурой данных, хранящихся в реляционной базе данных. Это отражено и в общем названии подхода – термин реляционный происходит от relation (отношение). Однако сам термин отношение является исключительно неточным, поскольку, говоря про любые сохраняемые данные, мы должны иметь в виду тип этих данных, значения этого типа и переменные, в которых сохраняются значения. Соответственно, для уточнения термина отношение выделяются понятия заголовка отношения, значения отношения и переменной отношения. Кроме того, нам потребуется вспомогательное понятие кортежа.
Заголовком отношения называется конечное множество упорядоченных пар вида <A, T>, где A называется именем атрибута, а T обозначает имя некоторого базового типа или ранее определенного домена. По определению требуется, чтобы все имена атрибутов в заголовке отношения были различны.
Если все атрибуты заголовка отношения определены на разных доменах, то, чтобы не плодить лишних имен, разумно использовать для именования атрибутов имена соответствующих доменов.
Кортежем, соответствующим заголовку, называется множество упорядоченных триплетов вида <A, T, v>, по одному такому триплету для каждого атрибута в заголовке. Третий элемент v триплета <A, T, v> должен являться допустимым значением типа данных или домена T. Телом отношения называется произвольное множество кортежей. Одно из возможных тел отношения «СЛУЖАЩИЕ» показано на рисунке 2.10.
Значением отношения называется пара множеств заголовка и тела отношения.
В изменчивой реляционной базе данных хранятся отношения, значения которых изменяются во времени. Переменной называется именованный контейнер, который может содержать любое допустимое значение. Естественно, что при определении любой переменной требуется указывать соответствующий заголовок отношения.
Операция обновления базы данных:
– вставка кортежа в переменную отношения;
– удаление кортежа из значения-отношения переменой отношения;
С модельной точки зрения эти операции является операцией присваивания переменной отношения некоторого нового значения-отношения.
По определению, степенью заголовка отношения, кортежа, соответствующего этому заголовку, тела отношения, значения отношения и переменной отношения является мощность заголовка отношения. Например, степень отношения «СЛУЖАЩИЕ» равна четырем.
В классических реляционных базах данных после определения схемы базы данных могли изменяться только значения переменных отношений. Однако теперь в большинстве реализаций допускается и изменение схемы базы данных: определение новых и изменение заголовков существующих переменных отношений. Это принято называть эволюцией схемы базы данных.
По определению, первичным ключом переменной отношения является такое подмножество S множества атрибутов ее заголовка, что в любое время значение первичного ключа в любом кортеже тела отношения отличается от значения первичного ключа в любом другом кортеже тела этого отношения, а никакое собственное подмножество S этим свойством не обладает.
2.5 Объектно-реляционное отображение Hibernate
Object-relational mapping (ORM) – технология программирования, которая связывает базы данных с концепциями объектно-ориентированных языков программирования, создавая «виртуальную объектную базу данных».
В объектно-ориентированном программировании объекты в программе представляют объекты из реального мира. В качестве примера можно рассмотреть адресную книгу, которая содержит список людей вместе с нулем или более телефонов и нулем или более адресов. В терминах объектно-ориентированного программирования они будут представляться объектами класса «Человек», которые будут содержать следующий список полей: имя, список телефонов и список адресов.
Суть проблемы состоит в преобразовании таких объектов в форму, в которой они могут быть сохранены в файлах или базах данных, и которые легко могут быть извлечены в последующем, с сохранением свойств объектов и отношений между ними. Эти объекты называют «хранимыми».
Решение проблемы хранения данных существует – это реляционные системы управления базами данных. Использование реляционной базы данных для хранения объектно-ориентированных данных приводит к семантическому провалу, заставляя программистов писать программное обеспечение, которое должно уметь как обрабатывать данные в объектно-ориентированном виде, так и уметь сохранить эти данные в реляционной форме. Эта постоянная необходимость в преобразовании между двумя разными формами данных не только сильно снижает производительность, но и создает трудности для программистов, так как обе формы данных накладывают ограничения друг на друга.
Реляционные базы данных используют набор таблиц, представляющих простые данные. Дополнительная или связанная информация хранится в других таблицах. Часто для хранения одного объекта в реляционной базе данных используется несколько таблиц; это, в свою очередь, требует применение операции JOIN для получения всей информации, относящейся к объекту, для ее обработки. Например, в рассмотренном варианте с записной книгой, для хранения данных, скорее всего, будут использоваться как минимум две таблицы: люди и адреса, и, возможно, даже таблица с телефонными номерами.
Так как системы управления реляционными базами данных обычно не реализуют реляционного представления физического уровня связей, выполнение нескольких последовательных запросов может быть слишком затратным. В частности, один запрос вида «найти такого-то пользователя и все его телефоны и все его адреса и вернуть их в таком формате», скорее всего, будет выполнен быстрее серии запросов вида «Найти пользователя. Найти его адреса. Найти его телефоны». Это происходит благодаря работе оптимизатора и затратам на синтаксический анализ запроса.
Некоторые реализации ORM автоматически синхронизируют загруженные в память объекты с базой данных. Для того чтобы это было возможным, после создания объект-в-SQL-преобразующего SQL-запроса полученные данные копируются в поля объекта, как во всех других реализациях ORM. После этого объект должен следить за изменениями этих значений и записывать их в базу данных.
Системы управления реляционными базами данных показывают хорошую производительность на глобальных запросах, которые затрагивают большой участок базы данных, но объектно-ориентированный доступ более эффективен при работе с малыми объемами данных, так как это позволяет сократить семантический провал между объектной и реляционной формами данных.
При одновременном существовании этих двух разных миров увеличивается сложность объектного кода для работы с реляционными базами данных, и он становится более подвержен ошибкам. Разработчики программного обеспечения, основывающегося на базах данных, искали более легкий способ достижения постоянства их объектов.
Разработано множество пакетов, устраняющих необходимость в преобразовании объектов для хранения в реляционных базах данных.
Некоторые пакеты решают эту проблему, предоставляя библиотеки классов, способных выполнять такие преобразования автоматически. Имея список таблиц в базе данных и объектов в программе, они автоматически преобразуют запросы из одного вида в другой. В результате запроса объекта «человек», из примера с адресной книгой, необходимый SQL-запрос будет сформирован и выполнен, а результаты «магическим» образом преобразованы в объекты «номер телефона» внутри программы.
С точки зрения программиста система должна выглядеть как постоянное хранилище объектов. Он может просто создавать объекты и работать с ними как обычно, а они автоматически будут сохраняться в реляционной базе данных.
На практике все не так просто и очевидно. Все системы ORM обычно проявляют себя в том или ином виде, уменьшая в некотором роде возможность игнорирования базы данных. Более того, слой транзакций может быть медленным и неэффективным. Все это может привести к тому, что программы будут работать медленнее и использовать больше памяти, чем программы, написанные вручную.
Но ORM избавляет программиста от написания большого количества кода, часто однообразного и подверженного ошибкам, тем самым значительно повышая скорость разработки. Кроме того, большинство современных реализаций ORM позволяют программисту при необходимости самому жестко задать код SQL-запросов, который будет использоваться при тех или иных действиях, сохранение в базу данных, загрузка, поиск, с постоянным объектом.
Hibernate – библиотека для языка программирования Java, предназначенная для решения задач объектно-реляционного проецирования. Она представляет собой свободное программное обеспечение с открытым исходным кодом, распространяемое на условиях GNU Lesser General Public License. Данная библиотека предоставляет легкий в использовании каркас для отображения объектно-ориентированной модели данных в традиционные реляционные базы данных.
Целью Hibernate является освобождение разработчика от значительного объема сравнительно низкоуровнего программирования по обеспечению хранения объектов в реляционной базе данных. Разработчик может использовать Hibernate как в процессе проектирования системы классов и таблиц с нуля, так и для работы с уже существующей базой данных.
Hibernate не только решает задачу связи классов Java с таблицами базы данных, и типов данных Java с типами данных SQL, но также предоставляет средства для автоматической генерации и обновления набора таблиц, построения запросов и обработки полученных данных и может значительно уменьшить время разработки, которое обычно тратится на ручное написание SQL- и JDBC-кода. Hibernate автоматизирует генерацию SQL-запросов и освобождает разработчика от ручной обработки результирующего набора данных и преобразования объектов, максимально облегчая перенос приложения на любые базы данных SQL.
Hibernate обеспечивает прозрачную поддержку сохранности данных для «POJO», то есть для стандартных Java-объектов; единственное строгое требование для сохраняемого класса – наличие конструктора по умолчанию.
Hibernate используется как в standalone Java-приложениях, так и в приложениях на платформе Java EE, использующих сервлеты или EJB.
2.6 Операционная система Mandriva Linux 2010
Компания Mandriva, европейский производитель Linux-решений, выпустила новую версию своего дистрибутива GNU/Linux – Mandriva Linux 2010. Новая версия стала более быстрой, простой и более безопасной, чем все предыдущие, а также приобрела новую функциональность.
Основная инновация в версии 2010 – «Умный рабочий стол», технология, позволяющая динамически получать доступ к файлам, отмечая и классифицируя фотографии, документы, почту и видео.
Программа установки стала проще и удобнее: усовершенствована система переразбиения жесткого диска во время установки, файловой системой по умолчанию теперь является Ext4, загрузка установленной системы занимает теперь менее 15 с.
В качестве основного рабочего стола используется наиболее стабильная версия новейшего рабочего окружения – KDE 4.3.2, с возможностью переноса данных из KDE 3. На рисунке 2.11 показан присер рабочего стола KDE 4. Она включает последние стабильные версии новых и привычных приложений: Amarok 2.2, ПО для обмена мгновенными сообщениями KMess MSN Live instant messenger 2.0.0, офис KOffice 2.0.1, Digikam 1.0, Skrooge. Кроме того, включено инновационное рабочее окружение GNOME 2.28.1, для нетбуков и мобильных Интернет-устройств (MID) включено рабочее окружение Moblin 2.1. Mandriva Linux является первым дистрибутивом, полностью включающим в себя среду рабочего стола Moblin, разработанную специально для мобильных платформ. Целью разработки данного окружения являлось применение на нетбуках, но использовать его везде, где требуется эргономичная и простая среда для решения повседневных задач. На рисунке 2.12 и 2.13 показан пример рабочего стола Moblin и GNOME соответственно.
С помощью центра управления Mandriva Linux можно управлять конфигурацией установленного ПО и устанавливать дополнительное ПО из репозитория Mandriva, включающего более 20 тыс. пакетов, настраивать оборудование, подключаться к Интернет, конфигурировать системы защиты.
Доработана система родительского контроля: теперь можно управлять доступом ребенка к приложениям и настраивать возможность подключения к Интернету в зависимости от времени.
Рисунок 2.11 – Рабочий стол KDE 4
Рисунок 2.12 – Рабочий стол Moblin
В версию Mandriva 2010 входит офисный пакет OpenOffice.org в виде ветки Go-OO, включающей такие преимущества, как поддержка SVG, 3D-эффектов на существующих изображениях, поддержка VBA, более тесная интеграция с KDE 4 и дополнительные пользовательские расширения. На рисунке 2.14 показано окно OpenOffice.
Новые возможности в OpenOffice.org 3.1.1:
- улучшенный внешний вид со сглаживанием графиков и диаграмм;
- улучшенные фильтры для Microsoft Office 2007;
- улучшенные механизмы захвата файлов совместной работе в сети;
- улучшенный механизм комментирования;
- улучшенная интеграция проверки грамматики (доступна при установке дополнения LanguageTool, находящегося в репозиториях Mandriva).
- поддержка масштабирования в OpenOffice.org Calc;
- улучшенная производительность в модуле Calc.
Рисунок 2.13 – Рабочий стол GNOME
Что касается возможностей виртуализации, в Mandriva 2010 включены Virtualbox 3.0.8, теперь поддерживающий виртуальные машины SMP, более производительный и с улучшенной поддержкой 3D, а также Xen kernel 2.6.30, qemu-kvm.
Рисунок 2.14 – Окно приветствия в OpenOffice
Mandriva Linux 2010 доступна в трех редакциях:
– Powerpack – коммерческая редакция, включающая дополнительное ПО, кодеки для работы с видеоформатами и техническую поддержку;
– One – дистрибутив на одном CD-диске, который работает и прямо с диска в режиме LiveCD, и допускает установку на жесткий диск. Включает только пользовательские приложения;
– Free – дистрибутив на одном DVD, содержащий только свободное ПО, причем как пользовательские, так и серверные приложения.