Если отображаемый класс содержит поле типа коллекции, поддерживающей порядок элементов, например, List<String> emails, то с помощью аннотации @javax.persistence.annotations.OrderBy можно указать Hibernate’у добавлять в конец запроса на выборку выражение ORDER BY COLUMN_NAME ASC. В результате данные в такую коллекцию попадут отсортированными ещё в БД.
Читать далееАрхив рубрики: Hibernate
Автоматическая сортировка отображаемых коллекций типа Set и Map методом compareTo() с помощью аннотации @SortNatural
Если отображаемый класс содержит поля типа SortedMap или SortedSet, то их можно пометить аннотацией @SortNatural. И тогда после выборки данных из БД, если они, как большинство базовых типов, имплементируют интерфейс Comparable, то они будут отсортированы методом compareTo() и будут доступны в этих полях уже в отсортированном виде.
Отметим, что при таком подходе сортировка будет проведена в java-приложении. Если нужна сортировка выборки на стороне БД, то это делается аннотациями @javax.persistence.annotations.OrderBy или @org.hibernate.annotations.OrderBy.
Читать далееАвтоматическая сортировка отображаемых коллекций типа Set и Map любым компаратором с помощью аннотации @SortComparator
Если отображаемый класс содержит поля типа SortedMap или SortedSet, то их можно пометить аннотацией @SortComparator. И тогда после выборки данных из БД они будут отсортированы с помощью заданного java-компаратора и будут доступны в этих полях уже в отсортированном виде.
Отметим, что при таком подходе сортировка будет проведена в java-приложении. Если нужна сортировка выборки на стороне БД, то это делается аннотациями @javax.persistence.annotations.OrderBy или @org.hibernate.annotations.OrderBy.
Читать далееОтображение поля типа Map в отдельную таблицу в Hibernate с помощью аннотаций @ElementCollection и @CollectionTable
Если отображаемый класс содержит поле типа Map, параметризованное базовыми типами (<String, String>, <Integer, Boolean> и т.п.), то данные этого поля не могут быть отображены просто в колонку соответствующей таблицы. Их необходимо отобразить в отдельную таблицу с внешним ключом на id основной.
Например, если класс Person содержит поле Map<String, Boolean> emails, то список адресов электронной почты конкретного человека не может храниться с ним в одной таблице PERSON, нужно завести для них отдельную таблицу EMAILS и хранить там. Hibernate позволяет решить эту задачу, не создавая отдельный класс-сущность Email, а просто разметив поле Map<String, Boolean> emails аннотациями @ElementCollection, @CollectionTable, @MapKeyColumn и @Column.
Читать далееОтображение поля типа List в отдельную таблицу с поддержкой порядка элементов в Hibernate с помощью аннотаций @ElementCollection и @CollectionTable
Если отображаемый класс содержит поле типа List, параметризованный базовым типом (<String>, <Integer>, и т.п.), то данные этого поля не могут быть отображены просто в колонку соответствующей таблицы. Их необходимо отобразить в отдельную таблицу с внешним ключом на id основной.
Например, если класс Person содержит поле List<String> emails, то список адресов электронной почты конкретного человека не может храниться с ним в одной таблице PERSON, нужно завести для них отдельную таблицу EMAILS и хранить там. Hibernate позволяет решить эту задачу, не создавая отдельный класс-сущность Email, а просто разметив поле List<String> emails аннотациями @ElementCollection и @CollectionTable.
Так как в данном случае речь идёт о поле типа List, то элементы будут считаться упорядоченными, что позволит с помощью аннотации @OrderColumn задать отдельную колонку для хранения данных о порядке элементов.
Читать далееОтображение поля типа Set в отдельную таблицу в Hibernate с помощью аннотаций @ElementCollection и @CollectionTable
Если отображаемый класс содержит поле типа коллекции базового типа, например, Set<String>, то данные этого поля не могут быть отображены просто в колонку соответствующей таблицы. Их необходимо отобразить в отдельную таблицу с внешним ключом на id основной.
Например, если класс Person содержит поле Set<String> emails, то список адресов электронной почты конкретного человека не может храниться с ним в одной таблице PERSON, нужно завести для них отдельную таблицу EMAILS и хранить там. Hibernate позволяет решить эту задачу, не создавая отдельный класс-сущность Email, а просто разметив поле Set<String> emails аннотациями @ElementCollection и @CollectionTable.
Так как в данном случае речь идёт о поле типа Set, то элементы будут считаться не упорядоченными. Если необходимо поддерживать порядок элементов, то поле должно иметь тип List.
Читать далееОтображение в БД иерархии наследования встраиваемых @Embeddable классов в Hibernate
Если классы-значения, встраиваемые в классы-сущности, организованы в виде иерархии, то при их отображении в БД необходимо учитывать разветвлённость этой иерархии. Если иерархия никак не ветвится, то есть у каждого предка в цепочке наследования есть только один потомок, то ничего особого предпринимать не нужно, достаточно делать стандартную разметку аннотацией @Embeddable.
Если у какого-то из встраиваемых классов-предков более одного потомка, то есть иерархия наследования начинает ветвиться, то может понадобиться более тонкая разметка классов аннотациями.
Читать далееОтображение в структуру БД иерархии наследования Java с совмещением нескольких стратегий одновременно
Классы сущностей Java могут иметь иерархическую структуру и существует ряд стратегий отображения этой структуры в БД. В частности используются подходы «отдельная таблица на каждый конкретный класс» и «одна таблица для всех наследников». У каждого из подходов есть свои преимущества и недостатки. Hibernate позволяет использовать эти две стратегии одновременно.
Например, если у нас есть класс Person и у него три наследника: Client, Employee и Freelancer, мы можем хранить данные двух наследников (Client и Employee) в одной таблице, а данные Freelancer в отдельной таблице, у которой будет внешний ключ на id общей таблицы.
Читать далееОтображение в структуру БД иерархии наследования Java по принципу «отдельная таблица на каждый уровень иерархии наследования» с учётом полиморфизма с помощью Hibernate
Классы сущностей Java могут иметь иерархическую структуру и существует ряд стратегий отображения этой структуры в БД. Одной из стратегий является отображение каждого класса, представляющего собой очередной уровень иерархии наследования в отдельную таблицу.
Каждая таблица, хранящая данные очередного класса-наследника, содержит колонку с внешним ключом, ссылающимся на таблицу, хранящую данные класса предка. Выборка данных, таким образом, происходит через JOIN всех таблиц, соответствующей ветви иерархии наследования.
То есть, если классы SpecialClient наследует класс Client, а от в свою очередь наследует класс Person, то для отображения данных будут созданы три таблицы (SPECIAL_CLIENT, CLIENT и PERSON), при этом в таблице SPECIAL_CLIENT будет внешний ключ, ссылающийся на CLIENT, а у той — внешний ключ, ссылающийся на PERSON.
Читать далееОтображение в структуру БД иерархии наследования Java в одну таблицу для всех наследников без использования колонки-дискриминатора
Классы сущностей Java могут иметь иерархическую структуру и существует ряд стратегий отображения этой структуры в БД. Одной из стратегий является отображение всех наследников в одну таблицу по имени предка. Подробно сам способ, а также его преимущества и недостатки описаны здесь.
Особенностью единой таблицы для хранения данных всех потомков является наличие колонки-дискриминатора, по которой определяется, какая строка в какой именно класс потомок должна быть отображена.
Если по каким-то причинам нет возможности иметь такую колонку, то можно обойтись без неё. Тогда придётся указать Hibernate’у фрагмент SQL, который он будет добавлять в запрос для того, чтобы различать, на какой класс отображать данные той или иной строки таблицы.
Читать далее