22. Для чего нужна аннотация @Basic?

22. Для чего нужна аннотация @Basic?


В широком смысле Hibernate разделяет типы на две группы:

1. Типы значений (Value types).

2. Типы сущностей (Entity types).

 

Типы сущностей

Сущности из-за своего уникального идентификатора существуют независимо от других объектов, тогда как типы значений нет. Экземпляры сущностей соответствуют строкам в таблице базы данных и различаются между собой благодаря уникальным идентификаторам. 

Например, две сущности могут иметь абсолютно одинаковые значения полей, но имея разные идентификаторы (первичные ключи) они будут считаться разными, в отличие от POJO, которые при наличии абсолютно одинаковых значений полей будут считаться равными (equals вернет true). Из-за требования к наличию уникального идентификатора, сущности существуют независимо и определяют свой собственный жизненный цикл.

 

Типы значений

Это данные, которые не определяют свой собственный жизненный цикл. По сути, они принадлежат сущности (entity), которая определяет их жизненный цикл. С другой стороны, всё состояние объекта полностью состоит из типов значений. В свою очередь, типы значений подразделяются на три подкатегории:

1. Базовые типы (Basic types).

2. Встраиваемые типы (Embeddable types).

3. Типы коллекций (Collection types).

 

Базовый тип значений

Соответствует одному столбцу в БД. Hibernate предоставляет ряд встроенных базовых типов, которые соответствуют естественным отображениям, рекомендованным спецификациями JDBC. Аннотация @Basic может быть применена к полю любого из следующих типов:

1. Примитивы и их обертки.

2. java.lang.String

3. java.math.BigInteger

4. java.math.BigDecimal

5. java.util.Date

6. java.util.Calendar

7. java.sql.Date

8. java.sql.Time

9. java.sql.Timestamp

10. byte[] or Byte[]

11. char[] or Character[]

12. enums

13. любые другие типы, которые реализуют Serializable.

Строго говоря, базовый тип в Hibernate обозначается аннотацией javax.persistence.Basic. Вообще, аннотацию @Basic можно не ставить, как это и происходит по умолчанию. Оба следующих примера в конечном итоге одинаково верны:

@Entity(name = "Product")

public class Product {

 @Id

 @Basic

 private Integer id;

 @Basic

 private String sku;

 @Basic

 private String name;

 @Basic

 private String description;

}

@Entity(name = "Product")

public class Product {

 @Id

 private Integer id;

 private String sku;

 private String name;

 private String description;

}

Аннотация @Basic определяет 2 атрибута:

1. optional - boolean (по умолчанию true) - определяет, может ли значение поля или свойства быть null. Игнорируется для примитивных типов. Но если тип поля не примитивного типа, то при попытке сохранения сущности будет выброшено исключение.

2. fetch - FetchType (по умолчанию EAGER) - определяет, должен ли этот атрибут извлекаться незамедлительно (EAGER) или лениво (LAZY). Однако, это необязательное требование JPA, и провайдерам разрешено незамедлительно загружать данные, даже для которых установлена ленивая загрузка.

 

Без аннотации @Basic при получении сущности из БД по умолчанию её поля базового типа загружаются принудительно (EAGER) и значения этих полей могут быть null.


Предыдущий вопрос: 21. Как влияет операция detach на объекты Entity каждого статуса?

Следующий вопрос: 23. Для чего нужна аннотация @Column?

Все вопросы по теме: список

Все темы: список

Вопросы/замечания/предложения/нашли ошибку: напишите мне


Report Page