Изучаем Java EE 7 - [67]
>@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.
>@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) поставщик постоянства отображает атрибуты.
>@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, являются постоянными.
>@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.
Разработчику часто требуется много сторонних инструментов, чтобы создавать и поддерживать проект. Система Git — один из таких инструментов и используется для контроля промежуточных версий вашего приложения, позволяя вам исправлять ошибки, откатывать к старой версии, разрабатывать проект в команде и сливать его потом. В книге вы узнаете об основах работы с Git: установка, ключевые команды, gitHub и многое другое.В книге рассматриваются следующие темы:основы Git;ветвление в Git;Git на сервере;распределённый Git;GitHub;инструменты Git;настройка Git;Git и другие системы контроля версий.
Рассмотрено все необходимое для разработки, компиляции, отладки и запуска приложений Java. Изложены практические приемы использования как традиционных, так и новейших конструкций объектно-ориентированного языка Java, графической библиотеки классов Swing, расширенной библиотеки Java 2D, работа со звуком, печать, способы русификации программ. Приведено полное описание нововведений Java SE 7: двоичная запись чисел, строковые варианты разветвлений, "ромбовидный оператор", NIO2, новые средства многопоточности и др.
В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.
В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.
В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.
Python - объектно-ориентированный язык сверхвысокого уровня. Python, в отличии от Java, не требует исключительно объектной ориентированности, но классы в Python так просто изучить и так удобно использовать, что даже новые и неискушенные пользователи быстро переходят на ОО-подход.