Большинство элементов аннотации @Column влияют на отображение. Если вы измените значение длины description на 2000, то значение длины целевого столбца тоже будет задано как равное 2000. Параметры updatable и insertable по умолчанию имеют значение true, которое подразумевает, что любой атрибут может быть вставлен или обновлен в базе данных, а также оказывают влияние во время выполнения. Вы сможете задать для них значение false, когда вам понадобится, чтобы поставщик постоянства позаботился о том, что он не вставит или не обновит данные в таблице в ответ на изменения в сущности. Следует отметить, что это не подразумевает, что атрибут сущности не изменится в памяти. Вы по-прежнему сможете изменить соответствующее значение, однако оно не будет синхронизировано с базой данных. Причина этого состоит в том, что сгенерированный SQL-оператор (INSERT или UPDATE) не будет включать столбцы. Другими словами, эти элементы не влияют на реляционное отображение, но влияют на динамическое поведение менеджера сущностей при доступе к реляционным данным.
Как можно было видеть в главе 3, Bean Validation определяет ограничения только в рамках пространства Java. Поэтому @NotNull обеспечивает считывание фрагмента Java-кода, который убеждается в том, что значением атрибута не является null. С другой стороны, аннотация JPA @Column(nullable = false) используется в пространстве базы данных для генерирования схемы базы данных. Аннотации JPA и Bean Validation могут сосуществовать в случае с тем или иным атрибутом.
При использовании Java вы можете задействовать java.util.Date и java.util.Calendar, чтобы сохранить данные и, кроме того, получить в свое распоряжение несколько их представлений, например, в виде даты, часа или миллисекунд. Чтобы указать это при объектно-реляционном отображении, вы можете воспользоваться аннотацией @javax.persistence.Temporal. Она принимает три возможных значения: DATE, TIME или TIMESTAMP (например, текущая дата, только время или и то и другое). В листинге 5.15 определена сущность Customer, у которой имеется атрибут dateOfBirth, а также технический атрибут, обеспечивающий сохранение значения точного времени ее создания в системе (в данной ситуации используется значение TIMESTAMP).
@Entity
public class Customer {
··@Id @GeneratedValue
··private Long id;
··private String firstName;
··private String lastName;
··private String email;
··private String phoneNumber;
··@Temporal(TemporalType.DATE)
··private Date dateOfBirth;
··@Temporal(TemporalType.TIMESTAMP)
··private Date creationDate;
··// Конструкторы, геттеры, сеттеры
}
Сущность Customer из листинга 5.15 будет отображена в таблице, определенной в листинге 5.16. Атрибут dateOfBirth будет отображен в столбце типа DATE, а creationDate — в столбце типа TIMESTAMP.
create table CUSTOMER (
··ID BIGINT not null,
··FIRSTNAME VARCHAR(255),
··LASTNAME VARCHAR(255),
··EMAIL VARCHAR(255),
··PHONENUMBER VARCHAR(255),
··DATEOFBIRTH DATE,
··CREATIONDATE TIMESTAMP,
··primary key (ID)
);
При использовании JPA, как только класс окажется снабжен аннотацией @Entity, все его атрибуты будут автоматически отображены в таблице. Если вам не нужно, чтобы атрибут отображался, вы можете воспользоваться аннотацией @javax.persistence.Transient или ключевым Java-словом transient. К примеру, возьмем упоминавшуюся выше сущность Customer и добавим атрибут age (листинг 5.17). Поскольку возраст может быть автоматически вычислен исходя из даты рождения, атрибут age не нужно отображать и, следовательно, он может быть временным.
@Entity
public class Customer {
··@Id @GeneratedValue
··private Long id;
··private String firstName;