На этот раз давайте поговорим об иерархическом дизайне Hibernate, который является дизайном отношений наследования между сущностями.
Может быть, это более абстрактно, давайте посмотрим на примеры напрямую.
1) Давайте сначала рассмотрим общую практику и напрямую введем код: три реальных класса следующие:
публичный класс Titem реализует serializable {// Опустить метод get/set private int id; частное производство строк; Приватное название строки; } public Class TBook расширяет Titem {// Опустить метод get/set private int pagecount; } открытый класс TDVD Extends Titem {// Опустить метод get/set }
Здесь нам нужно три файла отображения, содержимое следующее:
<class name = "titem" table = "item"> <id name = "id" column = "id" type = "java.lang.integer"> <generator/> </id> <name = "name" column = "name" type = "java.lang.string"/> <property name = "Производство" column = "typure" type = "java.lang.Lang.String. table="Book"> <id name="id" column="id" type="java.lang.Integer"> <generator /> </id> <property name="name" column="name" type="java.lang.String"/> <property name="manufacture" column="manufacture" type="java.lang.String"/> <property name="pageCount" column="pageCount" type = "java.lang.integer"/> </class> <class name = "tdvd" table = "dvd"> <id name = "id" column = "id" type = "java.lang.integer"> <generator/> </id> <name = "name" column = "name" type = "java.lang.String"/> <name = "name" name "type =" java.lang.String "/>" "Производство" = "=" Производство "=" Производство "=". type = "java.lang.string"/> <name = name = "regionCode" column = "regionCode" type = "java.lang.string"/> </class>
Очень обычные картитные файлы, без разницы в предыдущих.
Давайте напрямую напишем метод испытания:
public void testselect () {Query Query = session.createquery ("from titem"); Список списка = Query.list (); Iterator iter = list.iterator (); while (iter.hasnext ()) {System.out.println ("name:"+(((titem) iter.next ()). getName ());}} Обратите внимание, что здесь мы используем класс Titem, а не конкретный класс Word. Здесь он автоматически будет искать подклассы, унаследованные от класса Titem и найти все результаты. Это включает в себя полиморфизм. Тег класса имеет полиморфизм свойства, и его значение по умолчанию является неявным, что означает, что результат может быть запрошен без указания имени. Если это явно, это означает, что вам нужно указать конкретное имя класса, прежде чем вы сможете найти результат этого типа.
2) В предыдущем примере мы использовали три файла отображения. Когда нам нужно изменить, нам нужно изменить три файла отображения, что невозможно для крупных проектов. Кроме того, каждая таблица имеет соответствующие поля для соответствующего основного класса, который является избыточным. Итак, у нас есть следующий метод.
Класс сущности все же, как в 1). Мы меняем файл отображения с трех на один и сохраняем только файл отображения TITEM. Но нам нужно внести соответствующие модификации, а контент теперь следующим образом:
<class name = "titem" table = "item" polymorphism = "eplicit"> <id name = "id" = "id" type = "java.lang.integer"> <generator/> </id> <name = "name" column = "name" type = "java.lang.string"/> <property name = "confacture" column ". <nacked-subclass name = "tbook" table = "tbook"> <ключ Column = "id" /> <name = "pagecount" column = "pagecount" type = "java.lang.integer" /> < /kined-subclass> <соединение subclass name = "tdvd" table = "tdvd"> <ключевой Column = " /" /"" /"" /"" /"" /"" /"" /"" /"" /". COLMAN = "RegionCode" type = "java.lang.String"/> </uped-subclass> </class>
Здесь у нас есть только файл отображения, но есть тег соединенного SUBCLASS, который указывает, что этот класс наследует от текущего класса, <Key> указывает первичную ключ подтока. Здесь подтолт относится к двум таблицам, соответствующим подклассам, TBook и TDVD. Только поля в подталке указаны в собственности.
Таким образом, сгенерированная таблица после того, как мы работаем, выглядит следующим образом:
Таблица, соответствующая двум подклассам, представляет собой только поля, которые мы указываем через свойство. Это позволяет избежать нескольких полей в таблице, так что таблица слов только поддерживает свои отдельные поля. Когда класс элементов меняется, нет необходимости вносить слишком много модификаций.
3) Давайте узнаем о другом методе для реализации иерархического дизайна, который достигается путем вложения флагов в таблицу. В файле отображения Hibernate мы реализуем его через тег Descriminator.
Без лишних слов давайте посмотрим на пример:
Мы изменили файл отображения вчерашнего Titem:
<class name = "titem" table = "item" polymorphism = "eplicit"> <id name = "id" = "id" type = "java.lang.integer"> <generator/> </id> <discinator column = "Категория" type = "java.lang.string"/> <properation name = name "name" = "name" type 'java.strang. name = "Производство" Column = "Производство" type = "java.lang.string"/> </class>
Видя середину, мы добавили дискриминаторную метку, которая показывает, каким полем различится наши два подкласса.
<subclass name = "tbook" discinator-value = "1"> <name = "pagecount" column = "pagecount"/> </subclass> <subclass name = "tdvd" discinator-value = "2"> <name = "RegionCode" Column = "RegionCode"/> </subclass>
Мы видим эти два параграфа, что указывает на то, что, когда значение поля, указанного дискриминатором, составляет 1, это указывает на то, что это класс TBook, а Pagecount имеет значение; Когда значение поля, указанного в дискриминаторе, составляет 2, оно указывает, что это класс TDVD, а регион имеет значение.
Таким образом, нам нужно использовать только одну таблицу, которая указывает на отношения между ними и несколькими классами. Обратите внимание, что этот метод не подходит для слишком большого количества подклассов. Это приведет к тому, что в основном таблице будет слишком много полей и вызовет определенные неудобства дизайна.