1. Одно код одностороннее картирование ассоциации
Объектная модель отношений с одним ко многим часто наблюдается в повседневной жизни. Возьмите студентов и занятия в качестве примера. В классе есть несколько учеников, поэтому взаимосвязь между классом и студентами-это отношения от одного ко многим, отображаемые в объектно-модель, как показано на рисунке ниже:
Объектная модель показывает, что эта связь от одного ко многим поддерживается одним концом, поэтому картирование в модель отношений означает, что в области класса будет несколько учеников, которые формируют отношения от одного ко многим. Информацию о студентах можно получить через класс. Соответствующая модель отношений выглядит следующим образом:
1. Базовая конфигурация
С моделью объекта, затем сопоставьте их в соответствующий код отношений. При выполнении картирования отношений вам нужно добавить тег <One-Many> на одном конце. Кроме того, вам нужно добавить атрибут SET на одном конце. Он поддерживает ленивую загрузку, а затем добавляет установленную тег в файл отображения и указывает отношения с одним ко многим, чтобы вы могли запросить и получить несколько конец на одном конце.
Классы и картирование файлов:
Это самый важный конец модели. С этой целью необходимо добавить соответствующий атрибут SET и добавить тег SET в файл конфигурации. Вы можете настроить соответствующий объект <One-Many> в теге SET. Конкретные классы. Объектный код Java выглядит следующим образом:
пакет com.src.hibernate; импортировать java.util.set; Общедоступные классы {private Int ID; 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; } private String name; // SET поддерживает ленивую загрузку студентов частного набора; public set getStudents () {возвращать студентов; } public void setstudents (установить студентов) {this.students = студенты; }}Атрибут SET используется в объекте классов, но он только объясняет атрибуты задержки загрузки и не настраивает соответствующий объект для атрибута. Объект атрибута должен быть настроен в файле отображения. Вам нужно добавить тег SET и добавить тег <One-Many> в тег SET. Конкретный код заключается в следующем:
<? xml version = "1.0"?> <! Doctype Hibernate Mapping Public "-// Hibernate/Hibernate Mapping DTD 3.0 // en" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <some. name = "com.hibernate.class. <id name = "id"> <generator // id> <name = "name"/> <set name = "Студенты"> <ключ = "classeId"> </key> <One-Many> </one-to-many> </set> </class> </hibernate-mapping>
Кодовые и отображающие файлы в соответствующем объекте Студента не требуют никакой специальной конфигурации, их необходимо писать только в соответствии с обычным методом записи. Конкретный метод конфигурации не будет подробно описан, он очень просто. После конфигурации необходимо генерировать соответствующий оператор SQL. При преобразовании объектной модели в реляционную модель Hibernate генерирует соответствующее утверждение следующим образом:
ALTER TABLE TABLE T_STUDENT DROD Foreign Key FK4B9075705E0AFEFE TABLE, если существует T_CLASSE DOPLASS, если существует T_STUDENT TABLE TABLES T_CLASSES (ID INTEGER NOT NULL AUTO_INCREME, Имя VARCHAR (255), Первичный ключ (ID) Создайте таблицу t_student (ID INTEGER NOT NULL AUTO_INCRENCRECTRER (ID). Первичный ключ (ID)) Альтер Таблица T_STUDENT INDEX FK4B9075705E0AFEFE (ClasseID), добавьте ограничение FK4B9075705E0AFEFE Foreign Key (ClassesID) Ссылки T_CLASSES (ID)
Соответствующая модель взаимосвязи показана ниже:
Сравнивая операторы SQL и модели взаимосвязи, связь между соответствующими таблицами поддерживается через иностранные ключи. Во-первых, создайте две таблицы, укажите первичный ключ таблицы и, наконец, добавьте отношения ассоциации иностранных ключей от одного ко многим.
2. Основные операции
Операции в базе данных - это не что иное, как чтение и запись, а модификация также является типом записи. Затем давайте посмотрим, как написать и прочитать операции в базу данных.
(1) Написать данные:
При написании данных вам необходимо обратить внимание на отношения от одного ко многим, поэтому вам нужно добавить несколько классов учеников при их добавлении. Кроме того, поскольку соответствующий набор атрибут добавляется в классы, вы должны использовать Hashset для добавления при добавлении объектов студентов, чтобы вы могли реализовать отношения от одного ко многим. Конкретный код заключается в следующем:
public void testSave2 () {session session = null; try {session = hibernateutils.getSession (); session.beginTransaction (); Студент 1 = новый студент (); Студент1.setName ("Чжангсан"); Session.save (Student1); Студент Студент2 = новый студент (); Студент2.setname ("LISI"); Session.save (Student2); Классы классов = новые классы (); Classe.SetName ("classone"); Установить студенты = новый хэшсет (); Студенты. Адд (Студент1); Студенты. Адд (Студент2); Classes.SetStudents (студенты); // Данные могут быть успешно сохранены //, но дополнительное заявление об обновлении будет выпущено для поддержания отношений, потому что это один ко многим разум. session.getTransaction (). Commit (); } catch (Exception e) {e.printstackTrace (); session.getTransaction (). Rollback (); } наконец {hibernateutils.closesession (Session); }} Затем, после того, как в базу данных записывается соответствующие данные, сгенерированные при выполнении приведенного выше тестового примера, следующее рисунок выглядит следующим образом:
(2) Читать данные:
Операция записи относительно проста. Вам нужно только добавить все загруженные объекты в переходное состояние и запустить соответствующий метод для вставки содержимого. Однако соответствующая операция чтения будет немного сложнее. Поскольку необходимо итерацию, чтобы получить все объекты студентов, эти отношения от одного ко многим не очень эффективны. Конкретный код заключается в следующем:
пакет com.test.hibernate; импортировать java.util.iterator; импортировать java.util.set; Импорт com.src.hibernate.*; Импорт junit.framework.testcase; Импорт org.hibernate.session; открытый класс One2mytest Extends testcase {public void testload1 () {session session = null; try {session = hibernateutils.getSession (); session.beginTransaction (); // Получить информацию класса с первичным ключом 5 классов = (классы) Session.load (Classes.Class, 5); // Печать информационной системы класса. // Установите набор студентов и загрузите набор студентов через класс Set STUTYD = Classes.GetStudents (); // Итерация набора и распечатайте информацию о студенте в наборе для (iterator iter = Student.iterator (); iter.hasnext ();) {Student = (студент) iter.next (); System.out.println ("Student.name ="+study.getName ()); } session.getTransaction (). Commit (); } catch (Exception e) {e.printstackTrace (); session.getTransaction (). Rollback (); } наконец {hibernateutils.closesession (Session); }}}Соответствующие операторы и сгенерированная информация следующие:
Hibernate: выберите Classes0_ID AS ID1_0_, Classes0_.name As name1_0_ из T_CLASSES Classe0_ где Classes0_D =? class.name = classone hibernate: select Student0_.classesid as classid1_, студенты 0_.id as id1_, студенты 0_.id как id0_0_, студенты 0_.name как name0_0_ от T_STUDENT Students0_, где студенты0_.ClassED =? Студент.name = lisi Student.name = Zhangsan
2. Однозначальное картирование двунаправленной ассоциации
Здесь мы продолжаем использовать студентов и классы в качестве примеров. Существуют отношения между классом и студентами. В классе есть несколько учеников. В отличие от предыдущей статьи, отношения здесь являются двусторонними, то есть один конец и один конец поддерживают отношения одновременно, поэтому ее объектная диаграмма выглядит следующим образом:
Соответствующая диаграмма модели отношений не сильно меняется, потому что взаимосвязь между ними является двунаправленной, поэтому оба конца модели взаимосвязи поддерживают отношения одновременно и отображают ее с моделью отношений, как показано на рисунке ниже:
В ассоциации с одним к одному одностороннему пути файл отображения должен быть специально настроен только на одном конце. Используйте конфигурацию <One-Many> и используйте итератор SET в модели Object, чтобы установить модель намеченного объекта. Тем не менее, разница в том, что в двусторонней ассоциации соответствующая ассоциация иностранных ключей на другом конце должна быть добавлена на множественном конце. В настоящее время взаимосвязь <много-один> должен использоваться на множественном конце, чтобы указать эту двунаправленность.
1. Картирование
Занятия и студенты также используются в качестве примеров здесь. Содержание на конец классах такого же, что и выше, и не будет изменяться, но конфигурация учащихся на нескольких концах изменится, то есть тег <-one-one> необходимо добавить в файл отображения.
Конфигурация картирования File Student.hbm.xml требует добавления столбца иностранного ключа <много-один-один>, и имя столбца должно соответствовать имени столбца иностранного ключа Class.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"> <hibernate-mapping> <net name/‘com.src.shiberte st.src.shiberte. TABLE = "T_STUDENT"> <ID name = "ID"> <Generator/Generator/> </id> <name = "name"/> <!-Добавить столбец новых классов в студент с одной стороны, а имя столбца должно быть таким же, как и список классов.
Конфигурация файла отображения Class.hbm.xml такая же, как в предыдущей статье. Следует отметить, что отображение атрибутов SET добавляется в файл Class.java и соответствует объекту студента. Следовательно, установленная метка должна быть добавлена в файл отображения, чтобы указать, что итератор SET используется в модели объекта. Конкретная конфигурация заключается в следующем:
<? xml version = "1.0"?> <! Doctype Hibernate Mapping Public "-// Hibernate/Hibernate Mapping Dtd 3.0 // en" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <net nelive/‘com. TABLE = "T_CLASSES"> <ID NAME = "ID"> <Generator // ID> <name = "name"/> <set name = "Студенты" upverse = "true"> <ключ Column "> </key> <One-Many> </One-to-Many> </set> </class> </hibernate many>
2. Класс
Конфигурация файла отображения напрямую соответствует классу, поэтому с файлом отображения вы можете написать соответствующий класс. С тем же классом вы можете знать, как написать соответствующий файл отображения. Давайте посмотрим, как написать соответствующий код класса.
Студент. Класс Java требует добавления атрибутов объекта класса в класс, и вы можете получить информацию, связанную с классами при загрузке студента.
пакет com.src.hibernate; открытый класс студент {// ассоциированные объекты класса частные классы классов; публичные классы getClasses () {return Classe; } public void setClasses (классы классов) {this.classes = classes; } // ID студента Private INT ID; 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; }} Конкретный кодовый содержимое файла Class.java показан в предыдущей статье и не будет подробно описан здесь.
С помощью объектной модели генерируется модель отношений. Сгенерированный оператор SQL выглядит следующим образом:
ALTER TABLE TABLE T_STUDENT DROD FERTER KEY FK4B907570FC588BF4 TABLE, если существует T_CLASSE TABLE, если существует T_STUDENT CREATE TABLE T_CLASSES (ID INTEGER NOT NULL AUTO_INCREM Integer, первичный ключ (id)) alter table t_student add index fk4b907570fc588bf4 (classeId), добавить ограничение FK4B907570fc588bf4 Истоверный ключ (ClassesID) Ссылки T_CLASSES (ID)
3. Операция данных
После установления структуры таблицы я написал метод испытаний для проверки работы данных. Во -первых, давайте посмотрим на вставку данных и вставьте данные в структуру таблицы. При написании данных есть две ситуации. Одним из них является сначала создать объект классов, написать объект в базу данных, затем создать объект студента и добавить объект студента в объект классов; Другой - сначала создать объект студента, написать объект студента в базу данных, а затем создать объект классов, чтобы добавить объект студента в объект классов. Эти два типа операций в конце концов различаются, поэтому давайте сравним.
3.1 Напишите класс сначала, а затем напишите студентам
Сначала после написания класса в базу данных объект классов входит в переходное состояние и имеет строку в базе данных. Затем напишите объект студента. Студенческий объект будет искать соответствующий класс первичного ключа и написать его в таблицу. Следовательно, данные в модели взаимоотношений не являются пустыми, а сохраненный код выглядит следующим образом:
public void testSave () {session = null; try {// Создать сеанс объекта сеанса = hibernateutils.getsession (); // Открыть сеанс транзакции.beginTransaction (); // Создать объект класса и записать объект класса в классах базы данных Classs = new Classes (); classe.setName ("class"); session.save (классы); // Создать студент 1 объект и написать объект студента в базу данных Student1 = New Student (); Студент1.setName ("Чжангсан"); Student1.setClasses (классы); Session.save (Student1); // Создать объект студента 2 и написать объект студента в базу данных Student2 = new Student (); Студент2.setname ("LISI"); Студент2.SetClasses (классы); Session.save (Student2); session.getTransaction (). Commit (); } catch (Exception e) {e.printstackTrace (); session.getTransaction (). Rollback (); } наконец {hibernateutils.closesession (Session); }} Соответствующий список информации в базе данных записи выглядит следующим образом:
3.2 Напишите студентов сначала, а затем класс
Сначала напишите студентов в базу данных. В настоящее время, поскольку таблица студентов должна получить основную ключевую информацию соответствующего столбца класса, но поскольку информация класса будет преобразована в переходное состояние, при написании информации о студенте будет нулевое значение. Код заключается в следующем:
Соответствующее представление базы данных после написания следующее:
Сравнивая две операции записи, появляются разные результаты, потому что порядок двух записей отличается, но поскольку это двунаправленная ассоциация, во время письма не происходит исключения.
4. Прочтите операцию
По сравнению с написанием данных, чтение данных становится очень простым. Поскольку это двунаправленная ассоциация, чтение данных также является двунаправленным. Информацию с другого конца можно прочитать с любого конца, как показано в следующем коде:
public void testload1 () {Session Session = null; try {session = hibernateutils.getSession (); session.beginTransaction (); // Читать информацию о студенте через классы классы классов = (классы) Session.load (Classes.Class, 1); System.out.println ("classe.name ="+classe.getName ()); Установить студенты = classe.getStudents (); for (iterator iter = studies.iterator (); iter.hasnext ();) {студент студента = (студент) iter.next (); System.out.println ("Student.name ="+study.getName ()); } // Читать информацию о классе через студенческую информацию студент Stu = new Student (); stu = (студент) session.load (student.class, 1); System.out.println ("Загрузить информацию класса через ученики class.id ="+stu.getClasses (). GetId ()); session.getTransaction (). Commit (); } catch (Exception e) {e.printstackTrace (); session.getTransaction (). Rollback (); } наконец {hibernateutils.closesession (Session); }}Запустите приведенный выше оператор теста, и сгенерированная информация о соответствующем операторе выглядит следующим образом:
Hibernate: выберите Classes0_ID AS ID1_0_, Classes0_.name As name1_0_ из T_CLASSES Classe0_ где Classes0_D =? class.name = class hibernate: select students0_.classesid as classid1_, студенты 0_.id as ad1_, студенты 0_.id как id0_0_, студенты 0_.name as name0_0_, студенты 0_.classesid как classid0_0_ от t_student students0_, где студенты0_.classesid =? Студент.name = lisi Student.name = Zhangsan
Загрузка информации о классе студентами классы.id = 1