Архив автора: admin

Объектно-реляционное отображение enum’ов Java в колонки БД и обратное отображение данных БД в enum пока классов предметной области с помощью аннотации @Enumerated в Hibernate

Классы предметной области в Java могут содержать поля перечисляемых типов (enum’ы) и данные этих полей, разумеется должны сохранятся в БД и восстанавливаться из БД. В силу естественных ограничений в БД может быть сохранено либо числовое значение enum’а, соответствующее его порядку, либо его строковое значение. Отвечает за это аннотация @Enumerated.

Читать далее

Использование аннотации @Temporal для уточнения типа колонки, создаваемой Hibernate’ом для полей типа java.util.Date и java.util.Calendar

При автоматическом создании схемы базы данных на основании аннотированных классов предметной области мы можем уточнить тип данных в колонке, которая соответствует полям типа java.util.Date и java.util.Calendar. Поля типа Date хранят информацию о количестве миллисекунд с т.н. начала эпохи. Но такой формат может быть избыточным. Возможно в реальности нас интересует только дата или только время, возможно и то и другое. Соответственно в БД мы хотели бы видеть колонку либо типа DATE, либо типа TIME, либо TIMESTAMP. Аннотация @Temporal позволяет уточнить, какого именно типа создавать колонку для конкретного поля типа Date.

Отметим, что тип java.util.Date (Calendar) является устаревшим. Он хранит время с точностью до миллисекунды (три знака после запятой). Современные типы данных, например, java.time.LocalDateTime хранят время с точностью до микросекунды (шесть знаков после запятой).

Читать далее

Использование в Hibernate аннотации @ColumnDefault, чтобы задать значение по умолчанию колонок БД.

Аннотация @ColumnDefault надо полем класса предметной области заставит Hibernate создать для этого поля колонку в БД со значением по умолчанию, которое передаёт параметром в эту аннотацию. Кроме того, с помощью параметра GenerationTime.INSERT аннотации @Generated можно определить, возможно ли будет переопределять значение по умолчанию при вставке или оно всегда будет одним и тем же, когда создаётся новая запись в таблице.

Читать далее

Конвертация значений между базой данных и объектами предметной области в Hibernate с помощью аннотации @ColumnTransformer

Данные, хранимые в колонках БД бывает необходимо как-то преобразовывать при отображении в объекты классов предметной области. И, наоборот, при сохранении данных из объектов в БД также необходимо делать обратное преобразование. Например, температура в объекта может храниться в градусах Цельсия, а в БД в фаренгейтах. Выполнить такое преобразование можно с помощью аннотации @ColumnTransformer.

Читать далее

Создание производных полей в классах предметной области с помощью аннотации @Formula в Hibernate

Зачастую выборка из таблицы должна содержать не только колонки с данными, но и колонки с вычисляемыми (обычно с помощью функций и подзапросов) значениями. Это могут быть, например, средние, минимальные и максимальные величины. Если для таких случаев по тем или иным причинам в БД не созданы представления (view), то мы можем указать Hibernate’у усложнить запрос и выбрать дополнительные данные в выборку с помощью аннотации @Formula.

Читать далее

Изменение способа доступа к отдельному полю класса предметной области с поля на геттер и обратно в Hibernate с помощью аннотации @Access

По умолчанию при выборе способа доступа к полю Hibernate ориентируется на положение обязательной аннотации @Id. Если @Id стоит над полем, то доступ (установка и чтение значений) ко всем полям будет осуществляться через механизмы рефлексии непосредственно на поле. Если аннотация над геттером, то значения полей будут устанавливаться и считываться Hibernate’ом через геттеры и сеттеры (при этом аннотация над сеттером никогда не ставится).

Изменить способ доступа к отдельному полю можно с помощью аннотации @Access.

Читать далее

Создание NOT NULL ограничений на колонки БД с помощью аннотаций @Basic и @Column в Hibernate.

Если Spring приложение запускается, например, с параметром spring.jpa.hibernate.ddl-auto=update, то Hibernate сам берёт на себя задачу по созданию и модификации схемы БД в соответствии с описаниями классов предметной области в приложении. С помощью аннотаций можно уточнять некоторые настройки схемы, в том числе ограничения колонок на допустимость/недопустимость значений NULL.

Читать далее

Исключение поля класса из отображения в колонку БД в Hibernate с помощью аннотации @Transient или ключевого слова transient

Не всегда нужно, чтобы все поля класса отображались в соответствующие колонки в базе данных. Но Hibernate по умолчанию пытается отобразить именно все поля класса в колонку или колонки БД следуя определённым правилам. Чтобы исключить то или иное поле класса из отображения используется либо аннотация @Transient, либо ключевое слово transient.

Читать далее

Создание суррогатов представлений (view) базы данных на уровне приложения с помощью Hibernate

Если по тем или иным причинам нет возможности создать полноценное представление прямо в БД, то Hibernate позволяет создать суррогат такого представления с помощью аннотации @org.hibernate.annotations.Subselect прямо в приложении.

Читать далее

Создание неизменяемых сущностей с помощью аннотации @Immutable в Hibernate

Если в Hibernate пометить сущность аннотацией @org.hibernate.annotations.Immutable, то Hibernate учтёт этот момент и осуществит ряд оптимизаций при работе с данной сущностью.

Читать далее