1. Картирование коллекции
1. Коллекция Введение
Картирование сбора также является базовым отображением, но оно не будет часто использоваться в процессе разработки, поэтому нет необходимости иметь глубокое понимание. Вам нужно только понять основные методы использования. Просто иметь возможность запросить решение, когда вы столкнетесь с такой проблемой в процессе разработки. Соответствующее отображение набора на самом деле относится к отображению набора в Java с соответствующей таблицей. Это картирование объектов сбора. В Java есть четыре типа наборов, а именно, набор, карта, список и обычные массивы. Между ними есть большие различия:
(1) Установить, не должно быть дублирующих объектов, объекты неупорядочены;
(2) список может быть заказан с повторными объектами;
(3) карта, он появляется в парах значений ключей;
(4) Массивы могут быть повторены, и между объектами существует порядок.
Разница между ними определяет, какая коллекция используется во время разработки. Обычно набор используется во время разработки. Объекты внутри него не нужны, и внутренние объекты могут быть получены с использованием итератора. Если эти наборы хотят отобразить соответствующую реляционную модель, необходимо использовать теги отображения, предоставленные Hibernate, <Set>, <sist>, <Map> и <Array>.
2. Картирование введения
Продолжайте обсуждать модель отношений сопоставления наборов. Установка отображения относится к объекту, соответствующему другому сбору объектов. При сохранении Hibernate сохранит набор данных в соответствующей таблице и сохранит данные в таблице данных в соответствии с идентификатором, который он выделяет. Если новая таблица назначена на установку отдельно, идентификатор будет назначен идентификатору установленной таблицы, а соответствующая таблица отношений выглядит следующим образом:
3. Файлы классов
Как набор отображения реализуется через код, и мы подробно проанализируем его дальше. Здесь мы закрываем все коллекции в класс. Мы называем этот класс CollectionMapping.java, поэтому его соответствующий внутренний код заключается в следующем:
пакет com.hibernate; импортировать java.util.list; импортировать java.util.map; импортировать java.util.set; @Suppresswarnings ("rawtypes") открытый класс CollectionMapping {// 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; } // SET Collection Private Set SetValues; public set getSetValues () {return setValues; } public void setSetValues (set setValues) {this.SetValues = setValues; } // СПИСОК КОЛЛЕКЦИЯ ПРИБОРЫ ПРИБОРЫ СПИСКИ; публичный список getListValues () {return ListValues; } public void SetListValues (List ListValues) {this.ListValues = listValues; } // коллекция массива частная строка [] arrayvalues; public String [] getarrayvalues () {return arrayvalues; } public void setarrayValues (string [] arrayvalues) {this.ArrayValues = arrayValues; } // Map Collection Private MapValues; public Map getMapvalues () {return MapValues; } public void setMapValues (map -mapvalues) {this.mapvalues = mapValues; }}Этот класс инкапсулирует несколько часто используемых наборов. Если вы хотите преобразовать их в реляционную модель, вы должны посмотреть на картирование ниже.
4. Картирование коллекции
Картирование коллекции на самом деле довольно просто. Вам нужно только добавить соответствующие теги коллекции. Hibernate предоставляет теги коллекции <set>, <Map>, <sist> и <Array> соответственно. Коллекция отображается в соответствующей таблице отношений с использованием централизованного тега. Кроме того, ассоциация иностранных ключей достигается путем добавления тега <key>, а другие атрибуты добавляются с использованием <element>.
CollectionMapping.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> <-nament name = "com.hibernate.collectionmapping" com.collectionmapping. table="t_collection_mapping"> <id name="id"> <generator//id> <property name="name"/> <set name="setValues" table="t_set_values"> <key column="set_id"></key> <element type="string" column="set_value"></element> </set> <list name="listValues" Table = "T_LIST_VALUES"> <ключевой COLMAN = "LIST_ID"/> <list-index column = "list_index"/> <element type = "string" column = "list_value"/> </list> <map name = "mapValues" table = "string_values"> <ключевой Column = "map_id"/> <map-key toupt = "string"/"capke"/"/" capke "/" capke "/" capke "/" capke "/" capke "/" capke "/" capke "/" map_ letry ". type = "string" column = "map_value"/> </map> <array name = "arrayvalues" table = "t_array_value"> <ключ Column = "array_id"/> <index column = "array_index" type = "integer"> </index> <element type = "string" column_value "/> </array> </array> </array> </array> </array> </array> </array> </array> </array> </array> </array> </array> </array> </array> </andex> <element =" string "=" array_value " </hibernate mapping>
Следует отметить, что тег списка и тег массива. Объекты в этих двух наборах в порядке. Поэтому при добавлении отображающихся тегов вам необходимо использовать теги-индекс или индекс, чтобы указать порядок объектов. Более того, при добавлении подборов вы должны добавить их по порядку. То есть сначала добавьте тег <клавиш>, затем добавьте тег <-index> и, наконец, добавьте тег <lement>, в противном случае появится следующая ошибка:
The content of element type "list" must match "(meta*,subselect?,cache?,synchronize*,comment?,key,(index|list-index),(element|one-to-many|many-to-many|composite-element|many-to-any),loader?,sql-insert?,sql-update?,sql-delete?,sql-delete-all?,filter*)".
5. Реляционная модель
Модель настроенного объекта преобразуется в соответствующую реляционную модель, а генерируемый оператор SQL выглядит следующим образом:
alter table t_array_value drop Иностранный ключ FK2E0DD0C067676B68 Альтер Таблица T_LIST_VALUES Drop Foreign Key FKE01EC98BF4FCB03 ALTER TABLE T_MAP_VALUE Таблица, если существует таблица сброса t_array_value, если существует таблица сброса t_collection_mapp array_index)) Создать таблицу t_collection_mapping (id Integer not null auto_increment, name varchar (255), первичный ключ (id)) Создать таблицу t_list_value varchar (255), list_index integer not nul varchar (255), map_key varchar (255) не null, первичный ключ (map_id, map_key)) создать таблицу t_set_values (set_id integer not nul Fk2e0dd0c067676b68 Иностранный ключ (array_id) Ссылки T_COLLECTION_MAPPAP t_map_values добавить индекс fkd169ba107402b585 (map_id), добавить ограничение fkd169ba107402b585 Иностранный ключ (MAP_ID) Ссылки T_COLLECTION_MAPPIN FK7BB8D04A7E79F8BF Foreign Key (SET_ID) Ссылки t_collection_mapping (id)
Сгенерированное представление о соответствующем базе данных выглядит следующим образом:
2. Работа данных
1. Написание данных
При написании операций данных вам необходимо обратить внимание на создание объектов данных при написании данных. Список, установить и карту необходимо создавать объекты данных и записать объекты данных в базу данных. Поскольку все три из них являются объектными интерфейсами, вам нужно создать объект и написать объект в базу данных. Конкретный код заключается в следующем:
@Suppresswarnings ({"unchecked", "rawtypes"}) public void testsave () {session = null; try {session = hibernateutils.getSession (); session.beginTransaction (); Коллекция CM = New CollectionMapping (); cm.setname ("Zhangsan"); Set set = new hashset (); set.add ("a"); set.add ("b"); cm.setSetValues (set); Список списка = new ArrayList (); list.add ("list1"); list.add ("list2"); cm.setlistvalues (список); String [] str = new String [] {"Array1", "Array2"}; cm.setarrayvalues (str); Карта карта = new hashmap (); map.put ("k1", "v1"); map.put ("k2", "v2"); cm.setmapvalues (карта); session.save (cm); session.getTransaction (). Commit (); } catch (Exception e) {e.printstackTrace (); session.getTransaction (). Rollback (); } наконец {hibernateutils.closesession (Session); }}Сгенерированный оператор SQL выглядит следующим образом:
Hibernate: вставьте в t_collection_mapping (name) значения (?) Hibernate: вставьте в t_set_values (set_id, set_value) значения (?,?) Hibernate: вставьте в t_set_values (set_id, set_value) значения (? values (?,?,?) Hibernate: INSERT INTO T_LIST_VALUES (LIST_ID, LIST_INDEX, LIST_VALUE) значения (?,?,?) hibernate: вставьте в t_list_values (list_id, list_index, list_value) значения (? (?,?,?) Hibernate: вставьте в t_map_values (map_id, map_key, map_value) значения (?,?,?) Hibernate: вставьте в T_MAP_Values (map_id, map_key, map_value) array_value) Значения (?,?,?) Hibernate: вставьте в t_array_value (array_id, array_index, array_value) значения (?,?,?)
2. Загрузка данных
Метод загрузки данных очень прост. Он загрузит данные в таблице в объект в соответствии с набором, а затем вам нужно только получить соответствующий сбор объектов.
public void testload () {session session = null; try {session = hibernateutils.getSession (); session.beginTransaction (); Коллекция cm = (collectionmapping) session.load (collectionmapping.class, 1); System.out.println ("cm.name ="+cm.getName ()); System.out.println ("cm.list ="+cm.getListValues ()); System.out.println ("cm.map ="+cm.getmapvalues ()); System.out.println ("cm.array ="+cm.getarrayvalues ()); System.out.println ("cm.set ="+cm.getSetValues ()); session.getTransaction (). Commit (); } catch (Exception e) {e.printstackTrace (); session.getTransaction (). Rollback (); } наконец {hibernateutils.closesession (Session); }}Сгенерированный результат:
Hibernate: выберите Collection0_.id As ID0_0_, Collection0_.name As name0_0_ из t_collection_mapping collection0_ где collection0_.id =? Hibernate: выберите arrayvalue0_.array_id as array1_0_, arrayvalue0_.array_value as array2_0_, arrayvalue0_.array_index как array3_0_ из t_array_value arrayvalue0_ где arrayvalue0_.array_id =? cm.name = Zhangsan hibernate: Select ListValues0_.List_id AS LIST1_0_, LISTVALUES0_.LIST_VALUE AS LIST2_0_, LISTVALUES0_.LIST_INDEX AS LIST3_0_ из T_LIST_VALUEUS LISTVALUES0_, где ListValues0_.List_ID =? cm.list = [list1, list2] hibernate: выберите mapValues0_.map_id as map1_0_, mapvalues0_.map_value as map2_0_, mapvalues0_.map_key as map3_0_ from t_map_values0_, где mapvalues0_.map_0_? cm.map = {k1 = v1, k2 = v2} cm.array = [ljava.lang.string;@758d8478 Hibernate: Select setValues0_.set_id as set1_0_, setValues0_.set_value as set2_0_ из T_SET_VALUES0_SETEREU cm.set = [b, a] 3. Резюме
Hibernate Can Can Persist Extances следующих коллекций Java, в том числе java.util.map, java.util.set, java.util.sortedmap, java.util.sortedset, java.util.list, и массивы любых постоянных объектов или значений (использование типов сбора набора - лучший выбор). Свойства типа java.util.collection или java.util.list также можно сохранить с помощью семантики «сумки». Коллекции, используемые для настойчивости, не могут сохранить семантику, прикрепленную к любым классам, которые реализуют эти интерфейсы, за исключением интерфейса сбора (например: итеративный порядок, принесенный LinkedHashset). Все постоянные коллекции фактически работают напрямую в соответствии с семантикой Hashmap, Hashset, TreeMap, Treesset и ArrayList. Чтобы выразить это более глубоко, для свойства, которое содержит коллекцию, тип Java должен быть определен как интерфейс (то есть карта, установка или список и т. Д.), И не должен быть Hashmap, Treesset или ArrayList. Причина этого ограничения заключается в том, что когда вы не знаете, Hibernate тайно заменяет вашу карту, устанавливает и перечислите экземпляры своей собственной реализацией карты, набора или списка. (Таким образом, в вашей программе используйте оператора == с осторожностью.) (Примечание. Для производительности и других причин почти все интерфейсы сбора Java реализованы в Hibernate (для реализации некоторых функций ленивой загрузки).) Все упорядоченные классы сбора (карты, списки, массивы) имеют основной ключ, состоящий из <ключа> и <didex>. В этом случае обновление класса сбора очень эффективно - первичный ключ был эффективно индексирован, поэтому, когда Hibernate пытается обновить или удалить строку, данные этой строки можно найти быстро. Основной ключ из набора (SET) состоит из < -ключа> и других полей элементов. Это неэффективно для некоторых типов элементов, особенно комбинированных элементов или большого текста или больших двоичных полей; База данных может не иметь возможности эффективно индексировать сложные первичные ключи. С другой стороны, для от 1-й-многих ассоциаций многих-ко многим, особенно синтетическим идентификаторам, наборы могут достичь такой же эффективной производительности. (Часть 1: Если вы хотите, чтобы SchemeAxport создал первичный ключ для вашего <Set>, вы должны объявить все поля как Not NULL = "true".) Карта <idbag> определяет ключ прокси, поэтому ее всегда можно обновлять эффективно. На самом деле, <idbag> имеет лучшую производительность. Сумка худшая. Поскольку сумка допускает дубликаты значений элементов и не имеет индексных полей, невозможно определить первичные ключи. Hibernate не может определить дубликаты линий. Когда такая коллекция будет изменена, Hibernate сначала полностью удалит всю коллекцию (через один удаление), а затем воссоздает всю коллекцию. Поэтому сумка очень неэффективна.