Изучаем Java EE 7 - [67]

Шрифт
Интервал


Листинг 5.19. Отображение перечислимого типа с порядковыми номерами

>@Entity

>@Table(name = "credit_card")

>public class CreditCard {

>··@Id

>··private String number;

>··private String expiryDate;

>··private Integer controlNumber;

>··private CreditCardType creditCardType;

>··// Конструкторы, геттеры, сеттеры

>}

Поскольку применяются правила по умолчанию, перечисление отобразится в целочисленном столбце, и все будет отлично. Но представим, что в верхушку перечисления добавлена новая константа. Поскольку присваивание порядковых номеров осуществляется согласно последовательности, в которой значения объявляются, значения, уже хранящиеся в базе данных, больше не будут соответствовать перечислению. Лучшим решением стало бы сохранение имени значения как строки вместо сохранения порядкового номера. Это можно сделать, добавив аннотацию @Enumerated к атрибуту и указав значение STRING (значением по умолчанию является ORDINAL), как показано в листинге 5.20.


Листинг 5.20. Отображение перечислимого типа с использованием STRING

>@Entity

>@Table(name = "credit_card")

>public class CreditCard {

>··@Id

>··private String number;

>··private String expiryDate;

>··private Integer controlNumber;

>··@Enumerated(EnumType.STRING)

>··private CreditCardType creditCardType;

>··// Конструкторы, геттеры, сеттеры

>}

Теперь столбец базы CreditCardType данных будет иметь тип VARCHAR, а информация о карточке Visa будет сохранена в строке "VISA".

Тип доступа

До сих пор я показывал вам аннотированные классы (@Entity или @Table) и атрибуты (@Basic, @Column, @Temporal и т. д.), однако аннотации, применяемые к атрибуту (или доступ к полям), также могут быть применены к соответствующему методу-геттеру (или доступ к свойствам). Например, аннотация @Id может быть применена к атрибуту id или методу getId(). Поскольку это в основном вопрос личных предпочтений, я склонен использовать доступ к свойствам (аннотировать геттеры), так как, по моему мнению, код при этом получается более удобочитаемым. Это позволяет быстро изучить атрибуты сущности, не утопая в аннотациях. Чтобы код в этой книге было легко разобрать, я решил аннотировать атрибуты. Однако в некоторых случаях (например, когда речь идет о наследовании) это не просто дело личного вкуса, поскольку оно может повлиять на ваше отображение.


Примечание

В Java поле определяется как атрибут экземпляра. Свойство — это любое поле с методами (геттерами или сеттерами) доступа, которые придерживаются шаблона JavaBean (в начале идет getXXX, setXXX или isXXX в случае с Boolean).


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


Листинг 5.21. Сущность Customer с аннотированными полями

>@Entity

>public class Customer {

>··@Id @GeneratedValue

>··private Long id;

>··@Column(name = "first_name", nullable = false, length = 50)

>··private String firstName;

>··@Column(name = "last_name", nullable = false, length = 50)

>··private String lastName;

>··private String email;

>··@Column(name = "phone_number", length = 15)

>··private String phoneNumber;

>··// Конструкторы, геттеры, сеттеры

>}

При использовании доступа к свойствам, как показано в листинге 5.22, отображение базируется на геттерах, а не на атрибутах. Все геттеры, не снабженные аннотацией @Transient, являются постоянными.


Листинг 5.22. Сущность Customer с аннотированными свойствами

>@Entity

>public class Customer {

>··private Long id;

>··private String firstName;

>··private String lastName;

>··private String email;

>··private String phoneNumber;

>··// Конструкторы

>··@Id @GeneratedValue

>··public Long getId() {

>····return id;

>··}

>··public void setId(Long id) {

>····this.id = id;

>··}

>··@Column(name = "first_name", nullable = false, length = 50)

>··public String getFirstName() {

>····return firstName;

>··}

>··public void setFirstName(String firstName) {

>····this.firstName = firstName;

>··}

>··@Column(name = "last_name", nullable = false, length = 50)

>··public String getLastName() {

>····return lastName;

>··}

>··public void setLastName(String lastName) {

>····this.lastName = lastName;

>··}

>··public String getEmail() {

>····return email;

>··}

>··public void setEmail(String email) {

>····this.email = email;

>··}

>··@Column(name = "phone_number", length = 15)

>··public String getPhoneNumber() {

>····return phoneNumber;

>··}

>··public void setPhoneNumber(String phoneNumber) {

>····this.phoneNumber = phoneNumber;

>··}

>}

В плане отображения две сущности из листингов 5.21 и 5.22 полностью идентичны, поскольку имена атрибутов в данном случае совпадают с именами геттеров. Однако вместо использования типа доступа по умолчанию вы можете явным образом указать тип с помощью аннотации @javax.persistence.Access.


Рекомендуем почитать
Геймдизайн. Рецепты успеха лучших компьютерных игр от Super Mario и Doom до Assassin’s Creed и дальше

Что такое ГЕЙМДИЗАЙН? Это не код, графика или звук. Это не создание персонажей или раскрашивание игрового поля. Геймдизайн – это симулятор мечты, набор правил, благодаря которым игра оживает. Как создать игру, которую полюбят, от которой не смогут оторваться? Знаменитый геймдизайнер Тайнан Сильвестр на примере кейсов из самых популярных игр рассказывает как объединить эмоции и впечатления, игровую механику и мотивацию игроков. Познакомитесь с принципами дизайна, которыми пользуются ведущие студии мира! Создайте игровую механику, вызывающую эмоции и обеспечивающую разнообразие.


Обработка событий в С++

В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.


Обработка баз данных на Visual Basic.NET

Это практическое руководство разработчика программного обеспечения на Visual Basic .NET и ADO.NET, предназначенное для создания приложений баз данных на основе WinForms, Web-форм и Web-служб. В книге описываются практические способы решения задач доступа к данным, с которыми сталкиваются разработчики на Visual Basic .NET в своей повседневной деятельности. Книга начинается с основных сведений о создании баз данных, использовании языка структурированных запросов SQL и системы управления базами данных Microsoft SQL Server 2000.


MFC и OpenGL

В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.


Симуляция частичной специализации

В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.


Питон — модули, пакеты, классы, экземпляры

Python - объектно-ориентированный язык сверхвысокого уровня. Python, в отличии от Java, не требует исключительно объектной ориентированности, но классы в Python так просто изучить и так удобно использовать, что даже новые и неискушенные пользователи быстро переходят на ОО-подход.