Hibernate провел классификацию и интеграцию и обнаружил, что Hibernate фактически разделен на три части: основной объект, картирование и HQL. Эти три части чаще всего используются в процессе разработки. Предыдущие статьи обсуждают методы преобразования между основными объектами и объектами. Далее обсудите методы использования картирования.
Важной функцией Hibernate является отображение, которое может преобразовать между объектной моделью и реляционной моделью. Это защищается объектно-ориентированными идеями программирования. Разработчики, которые используют программы картирования, должны только заботиться о написании кода в объектной модели. Картирование между объектом и реляционной базой данных обычно определяется с помощью XML -документа. Этот сопоставленный документ предназначен для чтения и может быть изменен вручную. Я суммирую это отношение отображения, как показано на следующем рисунке:
Картирование определяется через XML, управляется с использованием сеанса, созданного Hibernate, и, наконец, сеанс использует JTA для отправки изменений в базу данных. Сессия можно понимать как менеджер по настойчивости, который управляет объектами в слое постоянства. Он создан SessionFactory. При программировании с Hibernate вы должны сначала подключиться к базе данных, поэтому вы должны сначала проверить конфигурацию подключения к базе данных в XML, создать SessionFactory в соответствии с конфигурацией документа (который можно понять как зеркало базы данных), а затем создать SessionFactory. Наконец, сеанс будет представлена в базу данных равномерно, которые завершат все операции.
Процесс использования
1. Создайте файл отображения, а файл отображения суффикс.
2. Зарегистрируйте класс объектов в файле отображения и добавьте свойства класса объекта в класс отображения. При добавлении свойств вы должны указать два значения: ID и свойство. Идентификатор указывает, что это единственный идентификатор объекта, и свойство указывает, что это полевой столбец таблицы;
3. Отправить модификации и синхронизировать данные.
ПРИМЕЧАНИЕ. Разработчики, которые разработали данные XML в базу данных, скоро поймут, что это отображение на самом деле является процессом обновления партий и создания партии, а отображение не является исключением. Hibernate предусматривает набор стандартов картирования, которые могут быть преобразованы в соответствии со стандартами. Его внутренняя реализация все еще мертва, поэтому она только относительно гибкая и простая в использовании.
Простой процесс картирования класса сущности:
1. Код свойства класса объекта пользователь1:
пакет com.hibernate; импортировать java.util.date; открытый класс user1 {private String Id; Приватное название строки; Private String Password; частная дата создания времени; Частная дата истекает время; public String getId () {return id; } public String getName () {return name; } public void setName (string name) {this.name = name; } public String getPassword () {return пароль; } public void setPassword (String password) {this.password = password; } public date getCreatetime () {return createTime; } public void setCreatetime (дата CreateTime) {this.createTime = createTime; } public date getExpireTime () {return expiretime; } public void setExpireTime (date extireTime) {this.expiretime = expiretime; }}
2. Внутренняя реализация пользователя1.hbm.xml файла отображения user1.java:
Настройки, которые могут быть установлены в основной базе данных, также представлены в Hibernate. Вы можете использовать атрибуты метки для установки конкретных отношений со картинами.
Класс-> Таблицы используют теги класса, обычно используемые свойства:
(1) Имя: класс объектов карты, его значение должно быть установлено на имя класса объектов, которое необходимо преобразовать в таблицу. Во время синхронизации соответствующий класс объектов будет найден на основе этого атрибута.
(2) Таблица: Сопоставьте имя таблицы базы данных. Если имя таблицы, которая будет отображаться, отличается от имени класса объекта, используйте это свойство, чтобы указать таблицу сопоставления. Если его не существует, будет создана таблица на основе значения свойства.
Проверьте структуру таблицы, сгенерированную конфигурацией на рисунке выше, как показано ниже:
Имя таблицы изменено на T_USER1; Поле ID изменяется на user_id, а длина поля составляет 32 бита; Свойство CreateTime сопоставлено с полем базы данных create_time и изменено на тип настоящего типа.
Свойство -> Поля Используйте идентификатор или теги свойств, обычно используемые свойства:
(1) Имя: функция аналогична имени тега класса, и значение определяет имя атрибута отображения класса Entity;
(2) Столбец: Аналогично таблице тега класса объекта, указав имя столбца таблицы отображения и будет создана, если он не существует;
(3) Тип: укажите тип данных, отображенный с полями в базе данных, и просмотреть документ по мере необходимости;
(4) Генератор, который является необязательным, используется для создания уникального идентификатора для постоянного класса.
<id name = "id" type = "long" column = "cat_id"> <generator> <param name = "table"> uid_table </param> <param name = "column"> next_hi_value_column </param> </generator> </id>
Все генераторы реализуют интерфейс org.hibernate.id.identifiergenerator. Это очень простой интерфейс; Некоторые приложения могут выбрать свою собственную конкретную реализацию. Конечно, Hibernate предоставляет много встроенных реализаций. Вот несколько часто используемых типов:
(1) Идентичность: возвращенный идентификатор имеет тип длинного, короткого или инт. Аналогично полю самостоятельного введения базы данных.
(2) Последовательность: используйте последовательности в DB2, PostgreSQL, Oracle, SAP DB, MCKOI и генераторах в межбазе. Возвращенный идентификатор имеет тип длинного, короткого или инт. Во всей базе данных, вместо того, чтобы самостоятельно увеличить в одной таблице, вам необходимо добавить, что необходимо добавить самостоятельное увеличение в одной таблице.
(3) UUID: используйте 128-битный алгоритм UUID для генерации идентификатора типа строки, который уникален в сети (с использованием IP-адреса). UUID кодируется как строка 32-битных шестнадцатеричных чисел. Аналогично серийному номеру, сгенерированному .NET.
(4) Нативно: выберите одну из идентичности, последовательности или HILO на основе возможностей базовой базы данных. Гибко используемый тип идентификации будет определяться на основе используемой базы данных. MySQL выберет Identity, а Oracle выберет последовательность.
(5) назначено: вручную создать идентификационный идентификатор для класса сущности. Это политика генерации по умолчанию, когда элемент <Generator> не указан.
(6) Иностранные: используйте другой связанный идентификатор объекта. Обычно используется в сочетании с <One-to-One>.
Разработчики часто используются для метода ручной конфигурации для записи свойств конфигурации в соответствии с инструкциями документации. Это очень примитивно. Новички рекомендуют использовать метод ручной конфигурации, чтобы помочь мышлению. Существует также много сторонних инструментов, которые используют визуальные методы для настройки и генерации документов конфигурации XML, что повышает эффективность разработки. Подобные инструменты, такие как Xdoclet, Middlegen и Andormda.
Ассоциативные отображения много к одному
Основное отображение Hibernate обсуждается выше. Класс объектов соответствует таблице и использует отображение тега <class> в соответствующем файле отображения Hibernate. И нормальные свойства в классе объектов соответствуют поле таблицы и отображаются с использованием тега <property>. Кроме того, при построении классов сущностей вы должны обратить внимание на: конструктор по умолчанию без параметров должен быть реализован в классах объектов, и должна быть предоставлена этикетка. Рекомендуется не использовать окончательный для изменения класса объектов и генерировать методы Getter и Setter для класса Entity. Наконец, вводятся несколько основных стратегий первичного поколения, и следующий шаг-обсудить картирование многих к одному.
Это картирование корреляции для многих к одному отражено в объектной модели. Это отношения агрегации. Пользователь является частью группы. В группе есть пользователи. Их жизненные циклы разные и могут быть отражены на следующем рисунке:
Так как же картирование отношений с множеством на одном в Hibernate? Следующее введет два метода: используйте тег <много-один> для карты напрямую, или используйте каскад <-one-one> для изменения таблицы.
1. Прямое отображение много-к одному <br /> можно понять из буквального значения, что оно относится к отношению к многим к одному. Многие относится к более конец, и один относится к меньшему конец. При его использовании тег часто используется в HBM более конца, а атрибут имени <-Man-to-One> устанавливается на атрибут одного конца одного в соответствующем классе отображения файла, такого как: <MANDO-ONE name = "Group" COLMON = "GroupId"> </mogo-to-One>. Этот тег добавляется в user.hbm.xml, что соответствует многим; Значение имени в теге - группа для карты первой, и в user.java будет атрибут группы. Java. Затем давайте посмотрим на конкретный класс кода, который реализует реализацию.
(1) Код класса user.java, который имеет свойство, называемое группой, которое будет использоваться в качестве значения имени одного конца <-one-one>.
Пользователь открытого класса {Private String name; public String getName () {return name; } public void setName (string name) {this.name = name; } частная группа группа; public Group getGroup () {return Group; } public void setGroup (группа группа) {this.group = group; }}(2) Значение имени <-many-one> in user.hbm.xml является значением свойства односторонней в user.java. Он генерирует новый столбец в базе данных, который можно понимать как внешний ключ пользовательской таблицы.
<? xml version = "1.0"?> <! Doctype hibernate mapping public "-// Hibernate/Hibernate Mapping Dtd 3.0 // en" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <!-сгенерировано 2014-5-14 23:39:25. <hibernate mapping> <class name = "com.hibernate.user" table = "user"> <id name = "id" type = "java.lang.long"> <column name = "id" /> <generator /> < /id> <!-Значение имени является свойством в соответствующем в user.java. Он будет автоматически генерировать столбец в таблице, поэтому столбец переименован в Column-> <Many-to-One name = "Group" Column = "GroupId"> </mogy-to-One> </class> </hibernate mapping>
(3) Протестируйте вышеупомянутые отношения со отображением, запишите два пользовательских объекта в таблицу, назвать IT user1 и user2, назвать его Zhang San и Li Si, используйте сеанс, чтобы сохранить объект, записать данные в базу данных, код выглядит следующим образом:
public void testSave1 () {Session Session = null; try {session = getsession.getSession (); session.beginTransaction (); Группа Group = New Group (); Group.SetName ("Узел питания"); Пользователь пользователь1 = новый пользователь (); user1.setname ("Zhang San"); user1.setGroup (группа); Пользователь пользователь2 = новый пользователь (); user2.setname ("li si"); user2.setGroup (группа); session.save (user1); session.save (user2); // Ошибка TransientObjectException будет сообщена // Ошибка возникает при очистке кэша TransientObjectException // Поскольку группа является переходным состоянием, оно не сессии, и нет соответствующих данных в базе данных // Когда пользователь является постоянным состоянием, Hibernate не может найти объект группы в CACHE //. session.getTransaction (). Commit (); } catch (Exception e) {e.printstackTrace (); session.getTransaction (). Rollback (); } наконец {getSession.Closesession (Session); }}Однако при использовании вышеуказанного кода будет сообщено о переписи при выполнении записей. Это связано с тем, что при сохранении пользовательского объекта он будет искать объекты группы в памяти в соответствии с группой, добавленной в <многие к одному>. Однако в приведенном выше коде объект группы всегда находился в переходном состоянии и не управляется сеансом, что означает, что объект сеанса не может быть найден, а объект пользователя входит в постоянное состояние, поэтому сообщается об этой ошибке. Правильный код заключается в следующем:
public void testSave2 () {session session = null; try {session = getsession.getSession (); session.beginTransaction (); Группа Group = New Group (); Group.SetName ("Узел питания"); Session.save (группа); // Установите объект группы здесь на постоянный объект пользователь пользователя1 = new user (); user1.setname ("Zhang San"); user1.setGroup (группа); Пользователь пользователь2 = новый пользователь (); user2.setname ("li si"); user2.setGroup (группа); session.save (user1); session.save (user2); // Данные можно сохранить правильно //, потому что группа и пользователь являются объектами в постоянном состоянии // Связанный объект можно найти в сеансе, когда Hibernate очищает сеанс Cache.getTransaction (). Commet (); } catch (Exception e) {e.printstackTrace (); session.getTransaction (). Rollback (); } наконец {getSession.Closesession (Session); }} 2. Каскадное картирование
В дополнение к преобразованию как группового объекта, так и объекта пользователя в постоянный объект, упомянутый выше, вы также можете использовать атрибуты каскадного картирования каскадного картирования, добавить атрибут каскада в атрибуте <-one> и скопировать его в сохранение. Вы можете написать в базу данных, когда объект группы не находится в постоянном состоянии. Таким образом, вам нужно только установить атрибуты группы двух объектов пользователя в один и тот же групповой объект, чтобы достичь отношения со картинами для многих к одному. В настоящее время соответствующий контент в user.hbm.xml является следующим кодом:
<? xml version = "1.0"?> <! Doctype hibernate mapping public "-// Hibernate/Hibernate Mapping Dtd 3.0 // en" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <!-сгенерировано 2014-5-14 23:39:25. <hibernate mapping> <class name = "com.hibernate.user" table = "user"> <id name = "id" type = "java.lang.long"> <column name = "id"/> <generator/> </id> <!-Таблица модификации Cascade-> <mosy-to-one = "group" colund = "groupd" cascade = "saveupdate" </many-to-one = "many-ty-t-to- </hibernate mapping>
ПРИМЕЧАНИЕ. После того, как Cascade настроен на сохранение обновления, он может быть каскадной модификацией, добавлением и удалением в базу данных, но конкретная операция каскадного запроса не может быть выполнена.
Соответствующий метод файла конфигурации тестовой конфигурации заключается в следующем:
// каскадный каскадный public void testsave3 () {session session = null; try {session = getsession.getSession (); session.beginTransaction (); Группа Group = New Group (); Group.SetName ("Узел питания"); Пользователь пользователь1 = новый пользователь (); user1.setname ("Zhang San"); user1.setGroup (группа); Пользователь пользователь2 = новый пользователь (); user2.setname ("li si"); user2.setGroup (группа); session.save (user1); session.save (user2); // TransientObjectException не было выброшено //, поскольку используется каскад // Hibernate сначала сохранит связанную группу объектов пользователя // группа и пользователь являются объектами в постоянном состоянии. } catch (Exception e) {e.printstackTrace (); session.getTransaction (). Rollback (); } наконец {getSession.Closesession (Session); }} 3. Сравнительная сублимация
Два метода также реализуют метод отображения многих к одному, и результаты одинаковы, но они очень разные в реализации. Независимо от того, использует ли первый или второй тип <Most-to-One> для добавления тега в файл сопоставления во многих концах, и назначить атрибут имени тега значению атрибута одного конца класса, зарегистрированного файлом картирования, что завершает основное отображение множества, что одинаково. Разница в том, что отношения прямого отображения не используют атрибуты поля Hibernate, что более гибко в реализации. Он не только поддерживает добавление, удаление и модификацию, но также позволяет запросить; Вторая каскадная модификация каскада принимает метод, предоставленный Hibernate. Этот метод поддерживает только добавление, удаление и модификацию и не поддерживает запросы.