Картирование многих к одному
Ассоциации многих к одному являются наиболее распространенными отношениями ассоциации, где объект может быть связан с несколькими объектами. Например, один идентичный объект адреса может быть связан с объектами нескольких сотрудников.
Определите таблицу RDBMS:
Рассмотрим ситуацию, когда нам нужно хранить записи сотрудников в таблице работников, которая будет иметь следующую структуру:
Создать таблицу сотрудника (id int not null auto_increment, first_name varchar (20) по умолчанию NULL, last_name varchar (20) по умолчанию NULL, зарплата int по умолчанию, адрес int int null, первичный ключ (id));
Кроме того, многие сотрудники могут иметь один и тот же адрес, поэтому эта ассоциация может быть представлена с использованием многих ассоциаций один к одному. Мы храним информацию, связанную с адресом в отдельной таблице со следующей структурой:
Создать адрес таблицы (id int not null auto_increment, street_name varchar (40) по умолчанию NULL, City_Name varchar (40) по умолчанию NULL, State_Name varchar (40) по умолчанию, ZipCode varchar (10) по умолчанию NULL, первичный ключ (ID));
Создайте таблицы RBDMS одновременно и позвольте им подготовиться к следующей реализации.
Определите класс POJO:
Давайте внедрим сотрудника POJO класса, который будет использоваться для удержания переменных объекта и его типа адреса с таблицей сотрудников.
Import java.util.*; Public Class Employee {Private Int ID; частная строка FirstName; частная строка Lastname; частный int зарплата; Частный адрес адреса; public employee () {} public employee (string fname, string lname, int заработная плата, адрес адрес) {this.firstname = fname; this.lastName = lname; это .salary = зарплата; this.address = адрес; } 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 Adder getAddress () {return Address; } public void setAddress (адрес Адрес) {this.Address = адрес; }}Нам нужно определить соответствующую таблицу адресов, чтобы объект адреса мог хранить и получить другой класс POJO в таблице адресов.
импортировать java.util.*; адрес открытого класса {private int id; Частная струнная улица; частный строковый город; частное строковое состояние; частная строка ZipCode; public address () {} public Adder (String Street, String City, String State, String ZipCode) {this.street = Street; this.city = city; this.state = состояние; this.zipcode = zipcode; } public int getId () {return id; } public void setId (int id) {this.id = id; } public String getStreet () {return Street; } public void setSteet (String Street) {this.street = Street; } public String getCity () {return City; } public void setCity (String City) {this.city = City; } public String getState () {return State; } public void setState (String state) {this.state = state; } public String getZipCode () {return ZipCode; } public void setzipCode (string zipcode) {this.zipcode = ZipCode; }} Определите файл отображения Hibernate:
Разработайте наш файл отображения, который инструктирует смягчать, как определять карту классов в таблицах базы данных. <Много-один> Элементы обработки будут использоваться для определения правил для установления взаимосвязи между сотрудниками и адресами.
<? 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> <name = "firstname" column = "first_name" type = "string"/> <name = "lastname" column = "type_name" type = "string"/> name "property" Arder "=" заработная плата "=" int "/> <most-t-to-name"/name "=" inder "="/name "/name"/name "/name"/name "inder" = "/> <most-t-to-name". not null = "true"/> </class> <class name = "address" table = "address"> <meta attribute = "class-description"> Этот класс содержит подробную информацию. </meta> <id name="id" type="int" column="id"> <generator/> </id> <property name="street" column="street_name" type="string"/> <property name="city" column="city_name" type="string"/> <property name="state" column="state_name" type="string"/> <property name="zipcode" column="zipcode" 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.
<Много-один-один> Элемент обработки используется для установления взаимосвязи между сотрудником и объектом, который адресуется. Атрибут имени установлен на переменную, определенную в родительском классе, в нашем случае это адрес. Атрибут столбца используется для имен столбцов в наборе сотрудника Parent Table.
Наконец, мы создадим метод 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 (); / * Давайте иметь один объект адреса */ адрес адреса = me.addaddress ("kondapur", "hyderabad", "ap", "532"); / * Добавить записи сотрудников в базу данных */ integer empid1 = me.addemployee ("manoj", "kumar", 4000, адрес); / * Добавить еще одну запись сотрудника в базу данных */ integer empid2 = me.addemployee ("diLip", "kumar", 3000, адрес); / * Перечислите всех сотрудников */ me.listemployee (); / * Обновить записи о зарплате сотрудника */ me.updateemployee (Empid1, 5000); / * Удалить сотрудника из базы данных */ me.deleteemployee (Empid2); / * Перечислите всех сотрудников */ me.listemployees (); } / * Метод для добавления адресной записи в базе данных * / public addressAddress (String Street, String City, String State, String ZipCode) {session = factory.opensession (); Транзакция tx = null; Integer addressId = null; Адрес адрес = null; try {tx = session.beginTransaction (); Адрес = новый адрес (улица, город, штат, ZipCode); addressid = (integer) session.save (адрес); tx.commit (); } catch (hibernateException e) {if (tx! = null) tx.rollback (); e.printstacktrace (); } наконец {session.close (); } возвратный адрес; } / * Метод для добавления записи сотрудника в базе данных * / public Integer AddEmployee (String fname, String lname, int заработная плата, адрес адрес) {session = factory.opensession (); Транзакция tx = null; Целое число сотрудников = null; try {tx = session.beginTransaction (); Сотрудник сотрудника = новый сотрудник (fname, lname, зарплата, адрес); 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 iterator = сотрудники.iterator (); iterator.hasnext ();) {employtee employee = (employtee) iterator.next (); System.out.print («Имя:» + employee.getFirstName ()); System.out.print («Фамилия:» + employee.getlastname ()); System.out.println ("Зарплата:" + employee.getsalary ()); Адрес add = employee.getAddress (); System.out.println ("адрес"); System.out.println ("Street:" + add.getStreet ()); System.out.println ("City:" + add.getCity ()); System.out.println ("state:" + add.getState ()); System.out.println ("zipcode:" + add.getzipcode ()); } 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
..... Различные сообщения журнала будут отображаться здесь ......... Имя: Манодж Фамилия: Кумар Зарплата: 4000Address Улица: Kondapur Город: Хайдарабад Штат: AP ZipCode: 532 Название. УЛИЦА: КОНДАПУР Город: Хайдарабад Штат: AP Zipcode: 532
Если вы проверьте таблицу сотрудников и адреса, вы должны записать его:
mysql> выберите * от сотрудника;
+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------.
mysql> выберите * из адреса;
+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------.
Одно ко многим картирование
Картирование с одним к многим может быть реализовано с использованием набора коллекций Java, которые не содержат дублирующих элементов. Мы видели, как установить карты в Hibernate, поэтому, если вы узнали о сборах набора, то все настройки могут использоваться для отображений от одного до многих.
Набор отображается с элементом <Set> в таблице карт и инициализируется в java.util.hashset. Вы можете использовать набор коллекций в классе с элементом в коллекции, который не требует дублирования.
Мы все еще используем таблицу RDBMS и классы POJO, определенные в приведенном выше примере.
Определите файл отображения Hibernate:
Давайте инструктируем Связанный плавник, как определить класс, отображаемый в файл отображения таблицы базы данных.
<? 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> указывает, что объект сотрудника включает в себя множество сертификатов.
Создайте класс приложений:
Наконец, мы создадим метод 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 (); }}} Скомпилируйте и выполните:
$ java Managemployee
..... Различные сообщения журнала будут отображаться здесь ......... Имя: Манодж Фамилия: Кумар Зарплата: 4000certificate: Mbacertificate: Pmpcertificate: McAfirst Название: Dilip Faste
Если вы проверьте форму сотрудника и сертификата, вы должны записать ее:
mysql> выберите * от сотрудника;
+----------------------------+----------+| id | first_name | last_name | Зарплата |+------------------------------------+------------+----------+| 1 | Манодж | Кумар | 5000 |+--------------------------------+---------+1 строка в наборе (0,00 с)
mysql> выберите * из сертификата;
+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------.