Изучаем Java EE 7 - [63]
Простой (то есть не являющийся составным) первичный ключ должен соответствовать одному атрибуту класса-сущности. Аннотация @Id, которую вы видели ранее, используется для обозначения простого первичного ключа. @javax.persistence.Id аннотирует атрибут как уникальный идентификатор. Он может относиться к одному из таких типов, как:
• примитивные Java-типы: byte, int, short, long, char;
• классы-обертки примитивных Java-типов: Byte, Integer, Short, Long, Character;
• массивы примитивных типов или классов-адаптеров: int[], Integer[] и т. д.;
• строки, числа и даты: java.lang.String, java.math.BigInteger, java.util.Date, java.sql.Date.
При создании сущности значение этого идентификатора может быть сгенерировано либо вручную с помощью приложения, либо автоматически поставщиком постоянства с использованием аннотации @GeneratedValue. Эта аннотация способна иметь четыре возможных значения:
• SEQUENCE и IDENTITY определяют использование SQL-последовательности базы данных или столбца идентификаторов соответственно;
• TABLE дает указание поставщику постоянства сохранить имя последовательности и ее текущее значение в таблице, увеличивая это значение каждый раз, когда будет обеспечиваться постоянство нового экземпляра сущности. Например, EclipseLink создаст таблицу SEQUENCE с двумя столбцами: в одном будет имя последовательности (произвольное), а в другом — значение последовательности (целое число, автоматически инкрементируемое Derby);
• генерирование ключа выполняется автоматически (AUTO) основным поставщиком постоянства, который выберет подходящую стратегию для определенной базы данных (EclipseLink будет использовать стратегию TABLE). AUTO является значением по умолчанию аннотации @GeneratedValue.
Если аннотация @GeneratedValue не будет определена, приложению придется создать собственный идентификатор, применив любой алгоритм, который возвратит уникальное значение. В коде, приведенном в листинге 5.4, показано, как получить автоматически генерируемый идентификатор. Будучи значением по умолчанию, GenerationType.AUTO позволило бы мне не включать в этот код элемент strategy. Обратите внимание, что атрибут id аннотирован дважды: один раз с использованием @Id и еще один раз — посредством @GeneratedValue.
>@Entity
>public class Book {
>··@Id
>··@GeneratedValue(strategy = GenerationType.AUTO)
>··private Long id;
>··private String title;
>··private Float price;
>··private String description;
>··private String isbn;
>··private Integer nbOfPage;
>··private Boolean illustrations;
>··// Конструкторы, геттеры, сеттеры
>}
При отображении сущностей правильным подходом будет обозначить один специально отведенный для этого столбец как первичный ключ. Однако бывают ситуации, когда требуется составной первичный ключ (скажем, если приходится выполнять отображение в унаследованную базу данных или первичные ключи должны придерживаться определенных бизнес-правил — например, необходимо включить значение или код страны и отметку времени). Для этого должен быть определен класс первичного ключа, который будет представлять составной ключ. Кроме того, у нас есть две доступные аннотации для определения этого класса в зависимости от того, как мы хотим структурировать сущность: @EmbeddedId и @IdClass. Как вы еще увидите, конечный результат будет одинаковым и в итоге у вас окажется одна и та же схема базы данных, однако способы выполнения запросов к сущности будут немного различаться.
Например, приложению CD-BookStore необходимо часто выкладывать информацию на главной странице, где вы сможете читать ежедневные новости о книгах, музыке или артистах. У новостей будет иметься содержимое, название и, поскольку они могут быть написаны на нескольких языках, код языка (EN для английского, PT — для португальского и т. д.). Первичным ключом для новостей тогда сможет быть название и код языка, поскольку статья может быть переведена на разные языки, но с сохранением ее оригинального названия. Таким образом, класс первичного ключа NewsId будет включать два атрибута, имеющие тип String: title и language. Классы первичных ключей должны включать определения методов для equals() и hashCode() для управления запросами и внутренними коллекциями (равенство в случае с этими методами должно быть таким же, как и равенство, которое имеет место в случае с базой данных), а их атрибуты должны быть допустимых типов, входящих в приведенный ранее набор. Они также должны быть открытыми, реализовывать интерфейс Serializable, если им потребуется пересекать архитектурные уровни (например, управление ими будет осуществляться на постоянном уровне, а использование — на уровне представления), и располагать конструктором без аргументов.
@EmbeddedId. Как вы еще увидите позднее в этой главе, JPA использует встроенные объекты разных типов. Резюмируя, отмечу, что у встроенного объекта нет какого-либо идентификатора (собственного первичного ключа), а его атрибуты в итоге окажутся столбцами таблицы содержащей их сущности.
Разработчику часто требуется много сторонних инструментов, чтобы создавать и поддерживать проект. Система Git — один из таких инструментов и используется для контроля промежуточных версий вашего приложения, позволяя вам исправлять ошибки, откатывать к старой версии, разрабатывать проект в команде и сливать его потом. В книге вы узнаете об основах работы с Git: установка, ключевые команды, gitHub и многое другое.В книге рассматриваются следующие темы:основы Git;ветвление в Git;Git на сервере;распределённый Git;GitHub;инструменты Git;настройка Git;Git и другие системы контроля версий.
Рассмотрено все необходимое для разработки, компиляции, отладки и запуска приложений Java. Изложены практические приемы использования как традиционных, так и новейших конструкций объектно-ориентированного языка Java, графической библиотеки классов Swing, расширенной библиотеки Java 2D, работа со звуком, печать, способы русификации программ. Приведено полное описание нововведений Java SE 7: двоичная запись чисел, строковые варианты разветвлений, "ромбовидный оператор", NIO2, новые средства многопоточности и др.
В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.
В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.
В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.
Python - объектно-ориентированный язык сверхвысокого уровня. Python, в отличии от Java, не требует исключительно объектной ориентированности, но классы в Python так просто изучить и так удобно использовать, что даже новые и неискушенные пользователи быстро переходят на ОО-подход.