Картирование карты
Карта карты-это коллекция Java, которая хранит элементы в парах ключевых значений и не допускает дублирующих элементов в списке. Интерфейс карты содержит три представления сбора, что позволяет рассматривать содержимое карты как набор коллекций клавиш-значений, или устанавливать отношения сопоставления ключей и значения.
Карта отображается с элементом <Map> в таблице отображения, а неупорядоченная карта может быть инициализирована в java.util.hashmap.
Определите таблицу RDBMS:
Рассмотрим ситуацию, когда нам нужно хранить записи сотрудников в таблице работников, которая будет иметь следующую структуру:
Создание таблицы сотрудники (id int not null auto_increment, first_name varchar (20) по умолчанию NULL, last_name varchar (20) по умолчанию NULL, зарплата int по умолчанию NULL, первичный ключ (ID));
Кроме того, предполагается, что у каждого сотрудника может быть один или несколько сертификатов, связанных с ним/ней. Мы храним соответствующую информацию сертификата в отдельной таблице со следующей структурой:
Создать сертификат таблицы (id int not null auto_increment, сертификат_type varchar (40) null по умолчанию, сертификат_name varchar (30) null по умолчанию, employee_id int по умолчанию, первичный ключ (id));
Существуют отношения между сотрудником и объектом сертификата.
Определите класс POJO:
Давайте внедрим сотрудника POJO Class, который будет использоваться для сохранения коллекции объектов в таблице сотрудников и переменной списка с сертификатами.
Import java.util.*; Public Class Employee {Private Int ID; частная строка FirstName; частная строка Lastname; частный int зарплата; Сертификаты частной карты; public employee () {} public employee (string fname, string lname, int arary) {this.firstname = fname; this.lastName = lname; это .salary = зарплата; } public int getId () {return id; } public void setId (int id) {this.id = id; } public String getFirstName () {return FirstName; } public void setFirstName (string first_name) {this.firstName = first_name; } public String getLastName () {return LastName; } public void setlastName (String last_name) {this.lastName = last_name; } public int getSalary () {return Parlary; } public void setSalary (int Parlary) {this.Salary = зарплата; } public Map getCertificates () {вернуть сертификаты; } public void setCertificates (MAP сертификаты) {this.certificates = сертификаты; }}Нам нужна соответствующая таблица сертификатов для определения другого класса POJO, такой объект сертификата может хранить и извлекать таблицу сертификатов.
Сертификат открытого класса {Private Int ID; Приватное название строки; public sertifice () {} public serfitiate (string name) {this.name = name; } public int getId () {return id; } public void setId (int id) {this.id = id; } public String getName () {return name; } public void setName (string name) {this.name = name; }} Определите файл отображения Hibernate:
Давайте разработаем отображение файла, который инструктирует спячку, как определить класс, отображенный в таблице базы данных. Элемент <Ap> будет использоваться для определения правил для используемой карты.
<? xml version = "1.0" Encoding = "UTF-8"?> <! Doctype Hibernate Mapping Public "-// Hibernate/Hibernate Mapping dtd // en" "http://www.hibernate.org/dtd/hibernate mapping-3.0.dtd"> <hibernate-mapping> hampaplion> "nameeeee nameee nameee nameee nameee nameeee nameeee nameeee nameeee 'nameeee nameeee nameeee' nameeee namele <Meta attruity = "class-description"> Этот класс содержит детали сотрудника. </meta> <id name = "id" type = "int" column = "id"> <generator/> </id> <map name = "сертификаты" cascade = "all"> <ключ Column = "employee_id"/> <index column = "sertive_type" type = "string"/> <One-to-many/> </map> <properation name = "firstnam name = "lastname" column = "last_name" type = "string"/> <name = "alary" column = "alary" type = "int"/> </class> <class name = "sertiate" table = "Сертификат"> <meta attribute = "class-description"> Содержит записи сертификата. </meta> <id name = "id" type = "int" column = "id"> <generator/> </id> <name = "name" column = "sertiate_name" type = "string"/> </class> </hibernate-mapping>
Формат <classname> .hbm.xml в файле отображения, который следует сохранить. Мы сохраняем файл employee.hbm.xml в файле отображения. Уже знакомы с большинством деталей отображения, но давайте снова посмотрим на все элементы в файле отображения:
Сопоставленный документ-это XML-документ с <Hibernate Mapping> в виде корневого элемента, соответствующего каждому классу, содержащему 2 <Class> элементы.
Элемент <class> используется для определения специфического отображения таблицы базы данных из класса Java. Имя класса Java Определяет атрибут имени элемента класса, а также имя таблицы базы данных таблицы.
Элемент <Meta> - это необязательный элемент, который можно использовать для создания описания класса.
Элемент <id> отображает уникальный атрибут ID в классе с первичным ключом таблицы базы данных. Атрибут имени элемента идентификатора относится к классу атрибута, а атрибут столбца относится к столбцам в таблице базы данных. Атрибут типа сохраняет тип картирования Hibernate, который будет преобразован из Java в тип данных SQL.
Элемент <Generator> в элементе ID используется для автоматического генерации значения первичного ключа. Установите атрибут класса сгенерированного элемента, чтобы он был нативным, чтобы позволить Hibernate забрать алгоритм в качестве идентификации, последовательности или HILO, чтобы создать первичные ключи в соответствии с возможностями поддержки базовой базы данных.
Элемент <Fotry> используется для картирования свойств класса Java в столбцы в таблице базы данных. Атрибут имени элемента относится к классу атрибута, а атрибут столбца относится к столбцам в таблице базы данных. Атрибут типа сохраняет тип картирования Hibernate, который будет преобразован из Java в тип данных SQL.
Элемент <Map> используется для установления взаимосвязи между сертификатом и классом сотрудника. Мы используем элемент <Ap> каскадного атрибута, чтобы сказать Hibernate, чтобы сохранить объект сертификата, а также объект сотрудника. Атрибут имени установлен для определения MapVariable в родительском классе, в нашем случае сертификат.
Элемент <dindex> используется для представления пары ключей/значения ключей и значений. В этом ключе будет использоваться тип строки, хранящийся в столбце Сертификат_тип.
Элемент <Key> - это родительский объект, содержащий внешний ключ, то есть столбец в таблице сертификатов. Столовый сотрудник.
Элемент <One-Many> указывает, что объект сотрудника включает в себя множество объектов сертификата, и, следовательно, объект сертификата должен быть связан с родительским классом сотрудника. Вы можете использовать элементы <One-to-One>, <-Mane-One> или <много-много-many> по мере необходимости.
Создайте класс приложений:
Наконец, создайте метод Main () класса приложения для запуска приложения. Используйте это приложение для сохранения записей сотрудников вместе со списком сертификатов, а затем выполните записи в операции CRUD в приложении.
Импорт java.util.*; Импорт org.hibernate.hibernateException; Импорт org.hibernate.session; Импорт org.hibernate.transaction; import org.hibernate.sessionFactory; импорт org.hibernate.cfg.configuration; Public Class Managemployee {Private Static SessionFactory Factory; public static void main (string [] args) {try {factory = new configuration (). configure (). buildsessionFactory (); } catch (throwable ex) {System.err.println ("Не удалось создать объект SessionFactory." + ex); бросить новый ExceptionInitializerError (Ex); } ManageMployee me = new ManageMployee (); / * Позвольте нам иметь набор сертификатов для первого сотрудника */ hashmap set = new hashmap (); set.put ("Computerscience", новый сертификат ("MCA")); set.put ("Business Management", новый сертификат ("MBA")); set.put ("ProjectManagement", новый сертификат ("PMP")); / * Добавить записи сотрудников в базу данных */ integer empid = me.addemployee ("manoj", "kumar", 4000, set); / * Перечислите всех сотрудников */ me.listemployee (); / * Обновить записи о зарплате сотрудника */ me.updateemployee (Empid, 5000); / * Перечислите всех сотрудников */ me.listemployees (); } / * Метод для добавления записи сотрудника в базе данных * / public Integer AddEmployee (String fname, String lname, int заработная плата, Hashmap cert) {session session = factory.opensession (); Транзакция tx = null; Целое число сотрудников = null; try {tx = session.beginTransaction (); Сотрудник сотрудника = новый сотрудник (fname, lname, зарплата); employee.setCertificates (CERT); employeeeid = (целое число) сессия. SSAVE (сотрудник); tx.commit (); } catch (hibernateException e) {if (tx! = null) tx.rollback (); e.printstacktrace (); } наконец {session.close (); } return employeeid; } / * Метод, чтобы перечислить все подробности сотрудников * / public void listemployees () {session session = factory.opensession (); Транзакция tx = null; try {tx = session.beginTransaction (); Список сотрудников = session.createequery ("от сотрудника"). List (); for (iterator iterator1 = сотрудники.iterator (); iterator1.hasnext ();) {employtee employee = (employtee) iterator1.next (); System.out.print («Имя:» + employee.getFirstName ()); System.out.print («Фамилия:» + employee.getlastname ()); System.out.println ("Зарплата:" + employee.getsalary ()); Map ec = employee.getCertificates (); System.out.println ("Сертификат:" + (((((сертификат) ec.get ("computerscience")). GetName ()); system.out.println ("Сертификат:" + (((сертификат) ec.get ("BusinessManagement"). GetName ()); System.out.println ("Сертификат:" + ((((Сертификат) ec.get ("ProjectManagement")). GetName ()); E.printstacktrace (); Employeeid); Employeid) e.printstacktrace (); Скомпилируйте и выполните:
Вот шаги для компиляции и запуска вышеуказанного приложения. Пожалуйста, убедитесь, что вы установили путь и группу класса соответствующим образом перед компиляцией и выполнением.
Следующие результаты будут получены на экране, а записи созданы как в формах сотрудников, так и в формах сертификата.
$ java Managemployee
..... Различные сообщения журнала будут отображаться здесь .........
Имя: Манодж Фамилия: Кумар Зарплата: 4000certificate: McaCertificate: Mbaceritificate: Pmpfirst Название: Манодж Фамилия: Кумар Зарплата: 5000certificate: McaCertificate: MbacerTificate: PMP
Если вы проверьте форму сотрудника и сертификата, вы должны записать ее:
mysql> выберите * от сотрудника;
+-----------------------------+------------+| id | first_name | last_name | Зарплата |+--------------------------------------+---------------+| 60 | Манодж | Кумар | 5000 |+---------------------------------+---------+1 строка в наборе (0,00 с)
mysql> выберите * из сертификата;
+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------.
Картирование сортировки
SortedMap-это элемент, хранящийся в паре ключевых значений, и обеспечивает общий вид клавиш, похожий на коллекции Java для отображений. Дублирующие элементы не допускаются в картировании. Карта сортируется в естественном порядке своих ключей или путем предоставления сравнения обычно во время создания упорядоченной карты.
Элементы <Map> и упорядоченные карты, которые сортируются в таблице отображения, могут быть инициализированы в java.util.treemap.
Мы по -прежнему используем таблицу RDBMS и класс POJO, определенный выше, чтобы проиллюстрировать следующий пример:
Определите файл отображения Hibernate:
Давайте разработаем отображение файла, который инструктирует спячку, как определить класс, отображенный в таблице базы данных. Элемент <Ap> будет использоваться для определения правил для используемой карты.
<? xml version = "1.0" Encoding = "UTF-8"?> <! Doctype Hibernate Mapping Public "-// Hibernate/Hibernate Mapping dtd // en" "http://www.hibernate.org/dtd/hibernate mapping-3.0.dtd"> <hibernate-mapping> hampaplion> "nameeeee nameee nameee nameee nameee nameeee nameeee nameeee nameeee 'nameeee nameeee nameeee' nameeee namele <Meta attruity = "class-description"> Этот класс содержит детали сотрудника. </meta> <id name="id" type="int" column="id"> <generator/> </id> <map name="certificates" cascade="all" sort="MyClass"> <key column="employee_id"/> <index column="certificate_type" type="string"/> <one-to-many/> </map> <property name="firstName" column="first_name" type = "string"/> <name = "lastname" column = "last_name" type = "string"/> <name = "заработная плата" column = "parlary" type = "int"/> </class> <class name = "table" table = "Сертификат"> <meta attribute = "class-description"> Этот класс содержит записи сертификата. </meta> <id name = "id" type = "int" column = "id"> <generator/> </id> <name = "name" column = "sertiate_name" type = "string"/> </class> </hibernate-mapping>
Формат <classname> .hbm.xml в файле отображения, который следует сохранить. Мы сохраняем файл mapping employee.hbm.xml. Уже знакомы с большинством деталей отображения, но давайте снова посмотрим на все элементы в файле отображения:
Сопоставленный документ-это XML-документ с корневым элементом <Hibernate Mapping>, соответствующий каждому классу, содержащему 2 <Class> элементы.
Элемент <class> используется для определения специфического отображения таблицы базы данных из класса Java. Имя класса Java Определяет атрибут имени элемента класса, а также имя таблицы базы данных таблицы.
Элемент <Meta> - это необязательный элемент, который можно использовать для создания описания класса.
Элемент <id> отображает уникальный атрибут ID в классе с первичным ключом таблицы базы данных. Атрибут имени элемента идентификатора относится к классу атрибута, а атрибут столбца относится к столбцам в таблице базы данных. Атрибут типа сохраняет тип картирования Hibernate, который будет преобразован из Java в тип данных SQL.
Элемент <Generator> в элементе ID используется для автоматического генерации значения первичного ключа. Установите атрибут класса сгенерированного элемента, чтобы сделать Hibernate, соответствующий алгоритму в идентификации, последовательности или HILO для создания первичных ключей в соответствии с возможностями поддержки базовой базы данных.
Элемент <Fotry> используется для картирования свойств класса Java в столбцы в таблице базы данных. Атрибут имени элемента относится к классу атрибута, а атрибут столбца относится к столбцам в таблице базы данных. Атрибут типа сохраняет тип картирования Hibernate, который будет преобразован из Java в тип данных SQL.
Элемент <Map> используется для установления взаимосвязи между сертификатом и классом сотрудника. Мы используем элемент <Ap> каскадного атрибута, чтобы сказать Hibernate, чтобы сохранить объект сертификата, а также объект сотрудника. Атрибут имени установлен на переменную SortedMap, определенную в родительском классе, в нашем случае это сертификат. Свойство сортировки может быть установлено на естественную сортировку, или оно может быть установлено для пользовательской реализации класса в качестве Java.util.comparator. Мы использовали класс MyClass, который реализует его как java.util.comparator, чтобы отменить порядок сортировки реализации класса сертификатов.
Элемент <dindex> используется для представления ключевой части карты пары клавиш/значения. В этом ключе будет использоваться тип строки, хранящийся в столбце Сертификат_тип.
Элемент <Key> - это родительский объект, содержащий внешний ключ, то есть столбец в таблице сертификатов. Столовый сотрудник.
Элемент <One-Many> указывает на то, что объект сотрудника включает в себя множество объектов сертификата, и, следовательно, объект сертификата должен быть связан с родителем-сотрудником. Вы можете использовать элементы <One-to-One>, <-Mane-One> или <много-много-many> по мере необходимости.
Если вы используете Sort = "Natural", то нам не нужно создавать отдельный класс, потому что класс сертификатов реализовал сопоставимый интерфейс, а Hibernate будет использовать CompareTo в классе сертификата, определенного как метод sortedMap (). Тем не менее, мы используем пользовательский класс компаратора MyClass в нашем файле отображения, поэтому мы должны создать этот класс на основе нашего алгоритма сортировки. Давайте сделаем сортировку ключей, которая доступна на карте.
Импорт java.util.comparator; открытый класс MyClass реализует компаратор <string> {public int compare (String O1, String O2) {final int int = -1; окончательный int после = 1; / * Чтобы отменить порядок сортировки, несколько на -1 */ if (o2 == null) {вернуть перед * -1; } Сопоставимо ThisCertificate = O1; Сопоставимо, что сертификат = O2; if (thisCertificate == null) {вернуть после * 1; } else if (thatCertificate == null) {return до * -1; } else {return thisCertificate.compareto (thatcertificate) * -1; }}}Наконец, мы создадим метод Main () класса приложения для запуска приложения. Мы будем использовать это заявление для сохранения некоторых записей сотрудников вместе с сертификатом, а затем отправим операцию CRUD выше записей.
Импорт java.util.*; Импорт org.hibernate.hibernateException; Импорт org.hibernate.session; Импорт org.hibernate.transaction; import org.hibernate.sessionFactory; импорт org.hibernate.cfg.configuration; Public Class Managemployee {Private Static SessionFactory Factory; public static void main (string [] args) {try {factory = new configuration (). configure (). buildsessionFactory (); } catch (throwable ex) {System.err.println ("Не удалось создать объект SessionFactory." + ex); бросить новый ExceptionInitializerError (Ex); } ManageMployee me = new ManageMployee (); / * Позвольте нам иметь набор сертификатов для первого сотрудника */ treeMap set1 = new TreeMap (); set1.put ("Computerscience", новый сертификат ("MCA")); set1.put («Бизнес -управление», новый сертификат («MBA»)); set1.put ("ProjectManagement", новый сертификат ("PMP")); / * Добавить записи сотрудников в базу данных */ integer empid1 = me.addemployee ("manoj", "kumar", 4000, set1); / * Еще один набор сертификатов для второго сотрудника */ treeMap set2 = new TreeMap (); set2.put ("Computerscience", новый сертификат ("MCA")); set2.put («Бизнес -управление», новый сертификат («MBA»)); / * Добавить еще одну запись сотрудника в базу данных */ integer EmpiD2 = me.addemployee ("diLip", "kumar", 3000, set2); / * Перечислите всех сотрудников */ me.listemployee (); / * Обновить записи о зарплате сотрудника */ me.updateemployee (Empid1, 5000); / * Удалить сотрудника из базы данных */ me.deleteemployee (Empid2); / * Перечислите всех сотрудников */ me.listemployees (); } / * Метод для добавления записи сотрудника в базе данных * / public Integer AddEmployee (String fname, String lname, int заработная плата, Cert TreeMap) {session = factory.opensession (); Транзакция tx = null; Целое число сотрудников = null; try {tx = session.beginTransaction (); Сотрудник сотрудника = новый сотрудник (fname, lname, зарплата); employee.setCertificates (CERT); employeeeid = (целое число) сессия. SSAVE (сотрудник); tx.commit (); } catch (hibernateException e) {if (tx! = null) tx.rollback (); e.printstacktrace (); } наконец {session.close (); } return employeeid; } / * Метод, чтобы перечислить все подробности сотрудников * / public void listemployees () {session session = factory.opensession (); Транзакция tx = null; try {tx = session.beginTransaction (); Список сотрудников = session.createequery ("от сотрудника"). List (); for (iterator iterator1 = сотрудники.iterator (); iterator1.hasnext ();) {employtee employee = (employtee) iterator1.next (); System.out.print («Имя:» + employee.getFirstName ()); System.out.print («Фамилия:» + employee.getlastname ()); System.out.println ("Зарплата:" + employee.getsalary ()); SortedMap <String, сертификат> map = employee.getCertificates (); for (map.Entry <String, сертификат> entry: map.EntrySet ()) {System.out.print ("/tcertificate type:" + entry.getKey ()); System.out.println (", имя:" + (entry.getValue ()). GetName ()); }} tx.commit (); } catch (hibernateException e) {if (tx! = null) tx.rollback (); e.printstacktrace (); } наконец {session.close (); }} / * Метод для обновления зарплаты для сотрудника * / public void updatemployee (Integer employeeid, int заработная плата) {session session = factory.opensession (); Транзакция tx = null; try {tx = session.beginTransaction (); Сотрудник сотрудника = (работник) Session.get (employtee.class, employeeid); сотрудник.setsalary (зарплата); Session.Update (сотрудник); tx.commit (); } catch (hibernateException e) {if (tx! = null) tx.rollback (); e.printstacktrace (); } наконец {session.close (); }} / * Метод удаления сотрудника из записей * / public void deleteemployee (Integer employeeid) {session session = factory.opensession (); Транзакция tx = null; try {tx = session.beginTransaction (); Сотрудник сотрудников сотрудника = (работник) Session.get (employtee.class, employeeeid); session.delete (сотрудник); tx.commit (); } catch (hibernateException e) {if (tx! = null) tx.rollback (); e.printstacktrace (); } наконец {session.close (); }}} Скомпилируйте и выполните:
Вы можете видеть, что сертификаты были отсортированы в противоположном порядке. Вы можете попробовать его, изменив файл отображения, просто установите Sort = "Natural" и выполните программу и сравните результаты.
$ java Managemployee
..... Различные сообщения журнала будут отображаться здесь ......... Имя: Манодж Фамилия: Кумар Зарплата: 4000 Тип сертификата: управление проектом, имя: PMP Тип сертификата: Computerscience, имя: MCA Тип сертификата: бизнесмен, имя: MBAFIRS Кумар зарплата: 5000 Тип сертификата: управление проектом, имя: PMP Тип сертификата: Computerscience, имя: MCA Тип сертификата: бизнесмен, имя: MBA
Если вы проверьте форму сотрудника и сертификата, вы должны записать ее:
mysql> выберите * от сотрудника;
+----+--------------------+---------+| id | first_name | last_name | Зарплата |+------------------------------------+-------------+------------+| 74 | Манодж | Кумар | 5000 |+--------------------------------+---------+1 строка в наборе (0,00 с)
mysql> выберите * из сертификата;
+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------.