1. Двусторонняя ассоциация первичных ключей
Двунаправленная первичная ключевая ассоциация на самом деле является особым случаем ассоциации первичных ключей один к одному. Тем не менее, <One-to-One> конфигурация должна выполняться в файлах отображения на обоих концах связанного объекта, и, кроме того, атрибут ассоциации иностранных ключей должен использоваться на одном конце первичного ключа основной карты.
Здесь мы также используем человека и idcard для обсуждения. Человек соответствует уникальной идентификационной карте, а удостоверение личности также однозначно отображает человека, так что это создает двусторонние отношения ассоциации. Основной ключ человека также является основным ключом IDCARD, которые являются основными ключами и иностранными ключами. Эта связь между ассоциацией становится двусторонним отображением один к одному, которое может быть выражено в модели взаимосвязи, как показано ниже:
Две таблицы на рисунке используют ассоциацию первичного ключа. Основной ключ человека является основным ключом IDCARD, поэтому они формируют взаимосвязь между иностранными ключами Чжу и обеспечивают уникальность, сочиняют ее в модель объекта и преобразуют его в взаимосвязь между человеком и классом IDCARD, как показано на рисунке ниже:
Эта связь один к одному также упоминался в предыдущей статье, что используется тег <One-To-One>, и это отображение одного к одному является двунаправленным, поэтому нам нужно настроить <One-to-One> между двумя объектами одновременно. Во -первых, давайте посмотрим на код класса и сопоставление кода файла, соответствующего IDCARD.
1. Информация, соответствующая idcard
Существуют отношения между один на один между классом idcard.java, классом IDCARD и классом человека. Следовательно, соответствующий атрибут человека должен быть добавлен в класс IDCARD. Это должно добавить соответствующие атрибуты в иностранные ключи в файле отображения и установить соответствующий класс Ассоциации иностранных ключей.
пакет com.src.hibernate; открытый класс idcard {// атрибут id private int id; public int getId () {return id; } public void setId (int id) {this.id = id; } // Атрибут номера карты Private String cardno; public String getCardno () {return cardno; } public void setCardno (String cardno) {this.cardno = cardno; } // люди, соответствующие номеру карты частного лица; публичный человек getPerson () {return Person; } public void setperson (человек) {this.person = person; }}Файл отображения idcard.hbm.xml добавляет атрибута иностранного ключа в файл отображения и добавляет соответствующий тег <One-One>>. Цель состоит в том, чтобы заставить класс ограничения человека для достижения отношений картирования один к одному. Наконец, установите ограниченный атрибут True в отображении, чтобы обеспечить принудительное отношение ограничения.
<? 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-15 23:47:00 по Hibernate 34.0. <Hibernate Mapping> <class name = "com.src.hibernate.idcard" table = "idcard"> <id name = "id" type = "int" column = "personid"> <generator> <param name = "свойство"> Person </param> </generator> </id> <property name = "cardno" type = "string" callno 'cardno "> </name'" ine-to '"cardno> <One-to" </name "</One-to-". Resdented = "true"> </one-to-One> </class> </hibernate-mapping>
2. Лицо, соответствующее информации
В классе Person.java, в дополнение к добавлению основных атрибутов, соответствующий класс IDCARD должен быть добавлен в качестве атрибутов, поскольку они представляют собой двустороннюю связь с двусторонней ассоциацией, поэтому класс IDCARD также должен быть добавлен в класс человека. Та же причина заключается в том, что атрибуты класса человека также добавляются в класс IDCARD.
пакет com.src.hibernate; Public Class Person {// идентификационный номер частный 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; } // idcard private idcard idcard; public idcard getIdcard () {return idcard; } public void setIdcard (idcard idcard) {this.idcard = idcard; }}Файл отображения Person.hbm.xml, стратегия первичной генерации ключей в этом файле не имеет особых требований, поскольку он взаимно ограничен классом IDCARD. Его основной ключ и внешний ключ являются основным ключом IDCARD. Кроме того, поскольку это отношение один к одному, тег <One-One> должен быть добавлен в файл отображения, чтобы указать его.
<? 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-15 23:47:00 по Hibernate 34.0. <hibernate mapping> <class name = "com.src.hibernate.person" table = "person"> <id name = "id" type = "int" column = "personid"> <generator> </Generator> </id> <name = "name" type = "string" colub = "personname"> </property> <!-one-to-tag tag whats hibernate ateberte obstrate obstrate obletas ateberto. По умолчанию он загружается в соответствии с первичным ключом, то есть получает значение поля взаимоотношений и загружает связанный объект в соответствии с первичным ключом противника-> <One-to-One name = "idcard"> </one-to-One> </class> </hibernate mapping>
3. Файл отображения Hibernate
После того, как приведенный выше класс и файл сопоставления настроена, информация о картировании базы данных в hibernate.cfg.xml необходима для добавления двух файлов конфигурации в файл конфигурации Hibernate, чтобы соответствующие элементы генерации можно было найти при создании соответствующей базы данных.
<? xml version = "1.0" Encoding = "UTF-8"?> <! Doctype hibernate-configuration public "-// конфигурация Hibernate/Hibernate DTD 3.0 // en" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtdd"> <hibrence-configuration> <hibrence-configuration> <hibrernate-configuration-3.0.dtdd "> <hibrence-configuration-3.0.dtd" <name = "hibernate.connection.driver_class"> com.mysql.jdbc.driver </property> <property name = "hibernate.connection.url"> jdbc: mysql: // localhost: 3306/hibernate_one2one_pk1 </properate> <properation> <properation = "hibernate.connection.costnect.costene.corne.connect. name = "hibernate.connection.password"> 1234 </property> <name = "hibernate.dialect"> org.hibernate.dialect.mysqlidialect </property> <картирование ресурса = "com/src/hibernate/person.hbm.xml"/> <картирование = "com/src/hibernatehm.xml"/> <картирование = "com/src/hibernatehm.xml"/> <картирование = "src/hibernatehm.xm. > </mapping> </session-factory> </hibernate-configuration>
4. генерировать результаты
После завершения конфигурации вы можете генерировать соответствующую базу данных из приведенного выше контента. В базе данных он будет генерировать соответствующую структуру таблицы в соответствии с настроенным контентом, и в таблице существуют соответствующие поля иностранных ключей и первичных ключей. При создании структуры таблицы Hibernate выведет соответствующий оператор SQL в консоли следующим образом:
ALTER TABLE IDCARD DROP Иностранный ключ FK806F76ABAC038CD8. FK806F76ABAC038CD8 (PersonID), добавьте ограничение FK806F76ABAC038CD8 Внешний ключ (персонал) Ссылки (PersonID)
Сформированная структура таблицы, как показано на рисунке:
Первичный ключ Personid генерируется в обеих таблицах одновременно, и это также соответствующий внешний ключ. Это также ограничивает основные ключи двух таблиц одновременно и является уникальным.
5. Напишите и загружайте тест
После создания таблицы запишите данные таблицы и считывайте данные из таблицы, запишите соответствующий тестовый класс, а тест использует модульные тесты и записывает соответствующие методы испытаний.
5.1 Записать тест
При записи в базу данных обязательно отметьте, что оба написания объекта должны быть преобразованы в соответствующее состояние по подготовке к индивидуальному заказу, в противном случае возникнет ошибка преобразования состояния. Тестовый код заключается в следующем:
public void testSave1 () {Session Session = null; try {// Создать сеанс сеанса session = hibernateutils.getsession (); // включить сеанс сеанса сеанса .beginTransaction (); // Создать объект человека и сохранить человека = новый человек (); Person.SetName ("Zhangsan"); Session.save (человек); // Создать объект IDCARD и сохранить iDcard idcard = new idcard (); idcard.setCardno ("1111111111111"); idcard.setperson (человек); session.save (idcard); // отправлять транзакции и изменить сеанс базы данных.getTransaction (). Commit (); } catch (Exception e) {// Печать сообщения об ошибке e.printstacktrace (); // Business Oflback Session.getTransaction (). Rollback (); } наконец {// закрыть сеанс hibernateutils.closesession (session); }} Вставленные данные показаны ниже:
5.2 Загрузочный тест
Напишите метод загрузки. Поскольку соотношение ассоциации является двунаправленной, соответствующая операция загрузки должна заключаться в загрузке другого конца через один конец, то есть для получения соответствующего класса человека и получения соответствующей информации IDCARD через класс человека. Противоположность также должно быть правдой, код выглядит следующим образом:
public void testload1 () {Session Session = null; try {// Создать сеанс сеанса session = hibernateutils.getsession (); // включить сеанс сеанса сеанса .beginTransaction (); // Получить личность объект и сохранить человека = (человек) session.load (person.class, 5); System.out.println ("idcard.id:"+person.getidcard (). GetId ()); System.out.println ("idcard.cardno:"+person.getidcard (). GetCardno ()); // Создать объект idcard и сохранить idcard idcard = (idcard) session.load (idcard.class, 5); System.out.println ("Person.id:"+idcard.getPerson (). GetId ()); System.out.println ("person.name:"+idcard.getPerson (). GetName ()); // отправлять транзакции и изменить сеанс базы данных.getTransaction (). Commit (); } catch (Exception e) {// Печать сообщения об ошибке e.printstacktrace (); // Business Oflback Session.getTransaction (). Rollback (); } наконец {// закрыть сеанс hibernateutils.closesession (session); }} Запустите приведенный выше метод испытания и распечатайте соответствующее содержимое на консоли следующим образом:
2. Двусторонние отношения иностранных ключей
Двунаправленная иностранная ключевая ассоциация может быть понята как особый случай ассоциации иностранных ключей. Эта специальность в основном потому, что это двунаправленная переписка. В предыдущей статье было упомянуто, что если вы хотите добавить поле иностранного ключа в таблицу, вы можете использовать тег <много-один>>, который будет генерировать соответствующий столбец иностранного ключа в модели отношения. Этот тег должен использоваться, если вы хотите достичь двусторонней ассоциации иностранных ключей.
1. Объектная модель
Давайте сначала посмотрим на модель объекта. Люди и удостоверения личности-это отношения один на один. Один человек соответствует идентичности, поэтому мультиплексы между ними один к одному, и это соответствие двустороннее. Следовательно, его объектная модель такая же, как и двунаправленный первичный ключ один к одному, как показано на рисунке ниже:
2. Реляционная модель
Соответствующая модель отношений сильно изменится. Отношение иностранного ключа один к одному будет генерировать соответствующий внешний ключ в таблице. Когда вы получите человека и удостоверение личности, это означает, что в модели взаимосвязи будет составлен столбец первичного ключа номера идентификационной карты, а между ними образуется двухсторонняя ситуация, как показано на рисунке ниже:
Переписка между ними, как видно на рисунке выше. В таблице человека есть основной ключ таблицы IDCARD, образуя отношения ассоциации иностранного ключа, и это является двунаправленным. То есть IDCARD может быть получен через человека, и человека также можно получить через IDCARD.
Код в объекте «Человек» и объект IDCARD совпадает с кодом объекта в предыдущей статье. Это не указано в коде. Единственная разница - это проблема конфигурации в файле отображения.
3. Картирование файлов
idcard.hbm.xml Файл отображения. Таблица IDCARD не является основной таблицей отображения, поэтому при выполнении индивидуального отображения вам необходимо использовать тег <One-One>> для его настройки, и вам необходимо сформулировать атрибуты иностранных ключей в модели отношения человека. Конкретный код заключается в следующем:
<? 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-18 22:27:43. <hibernate mapping> <class name = "com.src.hibernate.idcard" table = "idcard"> <id name = "id" type = "int"> <generator /> < /id> <name = "cardno" type = "java.lang.string"> name = "cardno" /> < /properation> <One-to-name = "person" = "person" = "person" = "person" = "person" = "person" = "person" = "person" = "person" = "person" = "person" = "person". Property-ref = "idcard"> </one-to-One> </class> </hibernate-mapping>
Файл отображения человека. Столбец атрибута иностранного ключа должен быть добавлен в таблицу, чтобы указать таблицу IDCARD. Следовательно, здесь необходимо использовать тег <много-один> для генерации соответствующего иностранного ключа в объекте человека, и уникальный также должен использовать уникальный, чтобы указать, что атрибут является уникальным.
<? 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-18 22:27:43. <hibernate mapping> <class name = "com.src.hibernate.person" table = "person"> <id name = "id" type = "int" column = "personid"> <generator /> < /id> <name = "name" type = "java.lang.string"> name = " /name" /> < /properation> <многочисленное имя идентификатором = "IDCard" = "=" IDCARD "=" IDCARD "=" IDCARD "=" IDCARD "=" IDCARD "=" IDCARD "=" IDCARD ". уникальный = "true" not null = "true"> </many-to-one> </class> </hibernate-mapping>
Конфигурация файла отображения объекта завершена, а затем генерируется реляционная модель. Заявление SQL выглядит следующим образом:
ALTER TABLE PENSOR DROSE FOREANDEAR KEY FK8C768F55794A52CA DROP TABLE Если существует таблица DROP IDCARD, если существует человек, создавая таблицу IDCARD (ID INTEGER NOT NULL AUTO_INCREMEN (PersonId)) Альтер Таблица Периос. Добавить индекс FK8C768F55794A52CA (iDCARDNO), добавить ограничение FK8C768F55794A52CA Иностранный ключ (IDCARDNO) Ссылки IDCARD (ID)
Сгенерированный оператор SQL является первым созданным таблицей. При создании таблицы указан столбец первичного ключа. После того, как создание завершено, две таблицы изменяются, чтобы указать атрибуты иностранного ключа, чтобы сформировать отношения один к одному.
Запишите метод испытаний, принимайте модульные тесты, загрузите объекты двух классов и получите другой объект с одного конца объекта соответственно
// Загрузите объект и загрузите объект человека, используя объект idcard public void testload1 () {session = null; try {session = hibernateutils.getSession (); session.beginTransaction (); // Получить объект idcard и получить объект человека, уникально связанный с объектом в idcard idcard idcard = (idcard) session.load (idcard.class, 1); System.out.println ("person.id ="+idcard.getPerson (). GetId ()); System.out.println ("idcard.person.name ="+idcard.getPerson (). GetName ()); // getPerson объект и получить объект idcard, который уникально связан с ним в лице объект Person = (Person) Session.load (Person.class, 1); System.out.println ("idcard.id:"+person.getidcard (). GetId ()); System.out.println ("idcard.cardno:"+person.getidcard (). GetCardno ()); // COMMITE SESSION. GetTransaction (). Commit (); } catch (Exception e) {e.printstackTrace (); session.getTransaction (). Rollback (); } наконец {hibernateutils.closesession (Session); }} Сгенерированный контент:
Сравнивая два отношения картирования, первичные отношения ключа и внешнее картирование являются отношениями, которые являются двунаправленными отношениями картирования, и отношения картирования должны быть настроены одновременно на обоих концах объекта. Разница заключается в том, что первичный ключ должен использовать только <One-To-One>, поскольку ему не нужно генерировать столбцы атрибутов, но иностранная стратегия генерации первичных ключей должна использоваться для первичного ключа таблицы, а объект иностранного ключа отмечается; Стратегия генерации иностранных ключей должна использовать тег <-one-one> для генерации новых столбцов иностранных ключей.
Заключение
Отображение одного к одному в двусторонней ассоциации обсуждалось до сих пор. Две статьи в основном обсуждают два использования двусторонней ассоциации. На самом деле, это все еще очень просто. Не забудьте использовать тег <-many-one>, если вы хотите генерировать внешний ключ. Если он уникален, добавьте уникальный атрибут. Тег <One-To-One> указывает только на отношения один к одному. Это только указывает, как один объект загружает другой объект и не добавляет новый столбец в модель отношений. В следующей статье будут обсуждаться отношения с одним ко многим.