Набор
Набор коллекций - это коллекция Java, которая не содержит никаких дублирующих элементов. Более формально, SET не содержит никаких элементов на E1 и E2, так что E1.Equals (E2) и не более одного пустого элемента. Таким образом, добавление в набор объектов должен реализовать методы equals () и hashcode (), чтобы Java могла определить, являются ли какие -либо два элемента/объекты одинаковыми.
Наборы отображаются с элементами <Set> в таблице карт и инициализируются в java.util.hashset. Вы можете использовать набор коллекций, чтобы иметь элементы в коллекции, которые не нужно повторять при использовании класса.
Определите таблицу 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, sertiate_name varchar (30) по умолчанию null, employee_id int default null, первичный ключ (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 set getCertificates () {вернуть сертификаты; } public void setCertificates (установить сертификаты) {this.certificates = сертификаты; }} Теперь давайте определим сертификат другого класса POJO, соответствующего таблице, такой объект сертификата может хранить и получить таблицу сертификатов. Этот класс также должен реализовать методы equals () и hashcode () одновременно, чтобы Java могла определить, являются ли какие -либо два элемента/объекты одинаковыми.
Сертификат открытого класса {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; } public boolean equals (Object obj) {if (obj == null) вернуть false; if (! this.getClass (). Equals (obj.getClass ())) вернуть false; Сертификат obj2 = (сертификат) obj; if ((this.id == obj2.getId ()) && (this.name.equals (obj2.getName ()))) {return true; } вернуть false; } public int hashcode () {int tmp = 0; tmp = (id + name) .hashcode (); вернуть TMP; }} Определите файл отображения Hibernate:
Давайте разработаем файл отображения, в котором указывается, как Hibernate определяет файл отображения, который отображает в таблице базы данных. Элемент <Set> будет использоваться для определения правил, используемых для установки коллекции.
<? 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> <set name = "сертификаты" cascade = "all"> <key column = "employee_id"/> <One-to-many/> </set> <name = "firstname" column = "first_name" type = "/> <property name =" lastname "" lastmame "=" lastmame "=" lastmame "=" lastmame "=" lastMame "=" type = "string"/> <name = "" Зарплата "Column =" Parlary "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.
Элемент <Set> является новым и был введен для установления взаимосвязи между сертификатом и классом сотрудников. Мы используем элемент <set> в атрибуте каскада, чтобы сказать Hibernate, чтобы сохранить объект сертификата и объект сотрудника. Атрибут имени установлен для установки переменной в определении в родительском классе, в нашем случае это сертификат. Для каждого набора переменных нам нужно определить отдельный набор элементов в файле отображения.
Элемент <Key> - это родительский объект, содержащий внешний ключ, то есть столбец в таблице сертификатов. Столовый сотрудник.
Элемент <One-Many> указывает, что объект сотрудника включает в себя множество сертификатов, и, следовательно, объект сертификата должен быть связан с родительским работником. Вы можете использовать любые и <One-to-One>, <-Many-One> или <Mary-Many> Elements по мере необходимости.
Создайте класс приложений:
Наконец, мы создадим метод 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 (); / * Позвольте нам иметь набор сертификатов для первого сотрудника */ hashset set1 = new hashset (); set1.add (новый сертификат ("MCA")); set1.add (новый сертификат ("MBA")); set1.add (новый сертификат ("MBA")); set1.add (новый сертификат ("PMP")); / * Добавить записи сотрудников в базу данных */ integer empid1 = me.addemployee ("manoj", "kumar", 4000, set1); / * Еще один набор сертификатов для второго сотрудника */ hashset set2 = new hashset (); set2.add (новый сертификат ("bca")); set2.Add (новый сертификат ("ba")); / * Добавить еще одну запись сотрудника в базу данных */ integer EmpiD2 = me.addemployee ("diLip", "kumar", 3000, set2); / * Перечислите всех сотрудников */ me.listemployee (); / * Обновить записи о зарплате сотрудника */ me.updateemployee (Empid1, 5000); / * Удалить сотрудника из базы данных */ me.deleteemployee (Empid2); / * Перечислите всех сотрудников */ me.listemployee (); } / * Метод для добавления записи сотрудника в базе данных * / public Integer AddEmployee (String fname, String lname, int заработная плата, SET 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 ()); Установить сертификаты = employee.getCertificates (); for (iterator iterator2 = сертификат.iterator (); iterator2.hasnext ();) {сертификат сертификат = (сертификат) iterator2.next (); System.out.println ("Сертификат:" + certname.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, employeeeid); сотрудник.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 (); }}} Скомпилируйте и выполните:
Вот шаги для компиляции и запуска вышеуказанного приложения. Убедитесь, что Path и Classpath устанавливаются надлежащим образом перед компиляцией и выполнением.
Следующие результаты будут получены на экране, а записи будут созданы в таблицах сотрудников и сертификатов.
$ java Managemployee
..... Различные сообщения журнала будут отображаться здесь ......... Имя: Манодж Фамилия: Кумар Зарплата: 4000certificate: Mbacertificate: Pmpcertificate: McAfirst Название: Dilip Faste
Если вы проверьте форму сотрудника и сертификата, вы должны записать ее:
mysql> выберите * от сотрудника;
+----------------------------+----------+| id | first_name | last_name | Зарплата |+------------------------------------+------------+-----------+| 1 | Манодж | Кумар | 5000 |+--------------------------------+---------+1 строка в наборе (0,00 с)
mysql> выберите * из сертификата;
+----+------------------+-------------+| id | сертификат_name | employee_id |+----+------------------+-------------+| 1 | MBA | 1 || 2 | PMP | 1 || 3 | MCA | 1 |+----+------------------+-------------+3 ряда в комплекте (0,00 с)
mysql>
Сортируемый
SortedSet - это коллекция Java, которая не содержит каких -либо дублирующих элементов и элементов, которые используют их естественный порядок или отсортированы компаратором.
Карта сортировки, инициализированная в таблице отображения <Set> element и java.util.treeset. Атрибут сортировки может быть установлен на компаратор или естественный порядок. Если используется естественный порядок, то его итератор пересекает установленные элементы, расположенные в порядке возрастания.
Мы по -прежнему используем таблицу RDBMS, определенную в приведенном выше примере, и между множественными объектами сотрудников и сертификатами будет взаимосвязь, и класс POJO также определен выше.
Давайте реализуем сотрудник POJO Class Class будет использоваться для сохранения коллекции объектов в таблице сотрудников и сертифицированной переменной SortedSet.
Теперь давайте определим сертификат для другого класса POJO, соответствующего таблице сертификатов, такой объект сертификата может хранить и получить таблицу сертификатов. Этот класс также должен реализовать сопоставимый интерфейс, и метод сравнения будет использоваться для установки Sort = "Natural" в случае отображения файлов (см. Файлы карты ниже), элементы отсортируются.
Сертификат открытого класса реализует сопоставимый <сертификат> {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; } public int compareto (сертификат этого) {final int int = -1; окончательный int после = 1; if (это == null) {return stere; } Сопоставимо thisCertificate = this.getName (); Сопоставимо thatCertificate = that.getName (); if (thisCertificate == null) {return после; } else if (thatCertificate == null) {return of; } else {return thisCertificate.compareto (thatcertificate); }}} Определите файл отображения Hibernate:
Давайте разработаем файл отображения, в котором указывается, как Hibernate определяет файл отображения, который отображает в таблице базы данных. Элемент <Set> будет использоваться для определения правил используемой коллекции SortedSet.
<? 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> <set name = "сертификаты" cascade = "all" sort = "myClass"> <ключевой Column = "employee_id"/> <One-to-many/> </set> <property name = "FirstName" column = "first_name" type = "string"/> <protember "=" name "=" name "=" name "=" name "=" name "=" name "=" name "=" name "=" name "=" name "= name". column = "last_name" type = "string"/> <name = "name =" зарплата "column =" parlary "type =" int "/> </class> <class name =" sertiate "table =" certiate "> <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.
Элемент <Set> используется для установления взаимосвязи между сертификатом и классом сотрудника. Мы используем элемент <set> в атрибуте каскада, чтобы сказать Hibernate, чтобы сохранить объект сертификата, а также для объекта сотрудника. Атрибут имени устанавливается на переменную сортируемого набора, определенного в родительском классе, в нашем случае это сертификат. Свойство сортировки может быть установлено на естественную сортировку, или оно может быть установлено для пользовательской реализации класса в качестве Java.util.comparator. Мы использовали класс MyClass, который реализует его как java.util.comparator, чтобы отменить порядок сортировки реализации класса сертификатов.
Элемент <Key> - это родительский объект, содержащий внешний ключ, то есть столбец в таблице сертификатов. Столовый сотрудник.
Элемент <One-Many> указывает, что объект сотрудника включает в себя множество объектов сертификата, и, следовательно, объект сертификата должен быть связан с родительским работником. Вы можете использовать любые и <One-to-One>, <-Many-One> или <Mary-Many> Elements по мере необходимости.
Если вы используете настройку SORT = "Natural", вам не нужно создавать отдельный класс, потому что класс сертификатов реализовал сопоставимый интерфейс, а Hibernate будет использовать CompareTo (определено как имя сертификата сравнения в классе сертификата). Тем не менее, мы используем пользовательский класс компаратора MyClass в нашем файле отображения, поэтому мы должны создать этот класс на основе алгоритма сортировки. Используйте этот класс, чтобы сортировать в порядке убывания.
Import java.util.comparator; открытый класс MyClass реализует компаратор <сертификат> {public int compare (сертификат O1, сертификат O2) {окончательный int int = -1; окончательный int после = 1; / * Чтобы отменить порядок сортировки, несколько на -1 */ if (o2 == null) {вернуть перед * -1; } Сопоставимо thisCertificate = o1.getName (); Сопоставимо thatcertificate = o2.getName (); 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 (); / * Позвольте нам получить набор сертификатов для первого сотрудника */ reeset set1 = new Treeset (); set1.add (новый сертификат ("MCA")); set1.add (новый сертификат ("MBA")); set1.add (новый сертификат ("MBA")); set1.add (новый сертификат ("PMP")); / * Добавить записи сотрудников в базу данных */ integer empid1 = me.addemployee ("manoj", "kumar", 4000, set1); / * Еще один набор сертификатов для второго сотрудника */ reeset set2 = new Treeset (); set2.add (новый сертификат ("bca")); set2.Add (новый сертификат ("ba")); / * Добавить еще одну запись сотрудника в базу данных */ integer EmpiD2 = me.addemployee ("diLip", "kumar", 3000, set2); / * Перечислите всех сотрудников */ me.listemployee (); / * Обновить записи о зарплате сотрудника */ me.updateemployee (Empid1, 5000); / * Удалить сотрудника из базы данных */ me.deleteemployee (Empid2); / * Перечислите всех сотрудников */ me.listemployee (); } / * Метод для добавления записи сотрудника в базе данных * / public Integer AddEmployee (String fname, String lname, int заработная плата, cordetset 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 ()); SortedSet Sertifits = employee.getCertificates (); for (iterator iterator2 = сертификат.iterator (); iterator2.hasnext ();) {сертификат сертификат = (сертификат) iterator2.next (); System.out.println ("Сертификат:" + certname.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, employeeeid); сотрудник.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
..... Различные сообщения журнала будут отображаться здесь ......... Имя: Манодж Фамилия
Если вы проверьте форму сотрудника и сертификата, вы должны записать ее:
mysql> выберите * от сотрудника;
+----------------------------+----------+| id | first_name | last_name | Зарплата |+------------------------------------+------------+-----------+| 1 | Манодж | Кумар | 5000 |+--------------------------------+---------+1 строка в наборе (0,00 с)
mysql> выберите * из сертификата;
+----+------------------+-------------+| id | сертификат_name | employee_id |+----+------------------+-------------+| 1 | MBA | 1 || 2 | PMP | 1 || 3 | MCA | 1 |+----+------------------+-------------+3 ряда в комплекте (0,00 с)