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?
Все вопросы по теме: список
Все темы: список
Вопросы/замечания/предложения/нашли ошибку: напишите мне