public class Track {
··@Id @GeneratedValue(strategy = GenerationType.AUTO)
··private Long id;
··private String title;
··private Float duration;
··@Basic(fetch = FetchType.LAZY)
··@Lob
··private byte[] wav;
··private String description;
··// Конструкторы, геттеры, сеттеры
}
Обратите внимание, что атрибут wav типа byte[] также аннотирован с помощью @Lob для сохранения значения как большого объекта (Large Object — LOB). Столбцы базы данных, в которых могут храниться большие объекты такого типа, требуют специальных JDBC-вызовов для доступа к ним из Java-кода. Для информирования поставщика в случае с базовым отображением должна быть добавлена опциональная аннотация @Lob.
Аннотация @javax.persistence.Column, показанная в листинге 5.12, определяет свойства столбца. Вы можете изменить имя столбца (которое по умолчанию отображается в совпадающее с ним имя атрибута), а также указать размер и разрешить (или запретить) столбцу иметь значение null, быть уникальным или позволить его значению быть обновляемым или вставляемым. В листинге 5.12 приведен API-интерфейс аннотации @Column с элементами и их значениями по умолчанию.
@Target({METHOD, FIELD}) @Retention(RUNTIME)
public @interface Column {
··String name() default "";
··boolean unique() default false;
··boolean nullable() default true;
··boolean insertable() default true;
··boolean updatable() default true;
··String columnDefinition() default "";
··String table() default "";
··int length() default 255;
··int precision() default 0; // десятичная точность
··int scale() default 0;·····// десятичная система счисления
}
Для переопределения отображения по умолчанию оригинальной сущности Book (см. листинг 5.1) вы можете использовать аннотацию @Column разными способами (листинг 5.13). Например, вы можете изменить имя столбца title и nbOfPage либо длину description и не разрешить значения null. Следует отметить, что допустимы не все комбинации атрибутов для типов данных (например, length применим только к столбцу со строковым значением, а scale и precision — только к десятичному столбцу).
@Entity
public class Book {
··@Id @GeneratedValue(strategy = GenerationType.AUTO)
··private Long id;
··@Column(name = "book_title", nullable = false, updatable = false)
··private String title;
··private Float price;
··@Column(length = 2000)
··private String description;
··private String isbn;
··@Column(name = "nb_of_page", nullable = false)
··private Integer nbOfPage;
··private Boolean illustrations;
··// Конструкторы, геттеры, сеттеры
}
Сущность Book из листинга 5.13 будет отображена в определение таблицы, показанное в листинге 5.14.
create table BOOK (
··ID BIGINT not null,
··BOOK_TITLE VARCHAR(255) not null,
··PRICE DOUBLE(52, 0),
··DESCRIPTION VARCHAR(2000),
··ISBN VARCHAR(255),
··NB_OF_PAGE INTEGER not null,
··ILLUSTRATIONS SMALLINT,
··primary key (ID)
);