Автор оригинала: Vivek Balasubramaniam.
1. введение
В этом уроке мы познакомимся с основами сущностей, а также с различными аннотациями, которые определяют и настраивают сущность в JPA.
2. Сущность
Сущности в JPA-это не что иное, как POJOS, представляющие данные, которые могут быть сохранены в базе данных. Сущность представляет собой таблицу, хранящуюся в базе данных. Каждый экземпляр сущности представляет собой строку в таблице.
2.1. Аннотация Сущности
Допустим, у нас есть POJO под названием Student , который представляет данные студента, и мы хотели бы сохранить его в базе данных.
public class Student { // fields, getters and setters }
Чтобы сделать это, мы должны определить сущность так, чтобы JPA знала о ней.
Итак, давайте определим его, используя аннотацию @Entity . Мы должны указать эту аннотацию на уровне класса. Мы также должны убедиться, что сущность имеет конструктор no-arg и первичный ключ:
@Entity public class Student { // fields, getters and setters }
Имя сущности по умолчанию соответствует имени класса. Мы можем изменить его имя, используя элемент name .
@Entity(name="student") public class Student { // fields, getters and setters }
Поскольку различные реализации JPA будут пытаться подклассировать нашу сущность, чтобы обеспечить ее функциональность, классы сущностей не должны быть объявлены final .
2.2. Идентификационная Аннотация
Каждая сущность JPA должна иметь первичный ключ, который однозначно идентифицирует ее. Аннотация @Id определяет первичный ключ. Мы можем генерировать идентификаторы различными способами, которые задаются аннотацией @GeneratedValue .
Мы можем выбрать одну из четырех стратегий генерации идентификаторов с элементом strategy . Значение может быть AUTO, TABLE, SEQUENCE, или IDENTITY.
@Entity public class Student { @Id @GeneratedValue(strategy=GenerationType.AUTO) private Long id; private String name; // getters and setters }
Если мы зададим GenerationType . AUTO , поставщик JPA будет использовать любую стратегию, которую он хочет сгенерировать идентификаторы.
Если мы аннотируем поля сущности, поставщик JPA будет использовать эти поля для получения и установки состояния сущности. В дополнение к доступу к полю мы также можем сделать Доступ к свойствам или Смешанный доступ, что позволяет нам использовать как доступ к полю, так и доступ к свойствам в одной и той же сущности .
2.3. Аннотация Таблицы
В большинстве случаев имя таблицы в базе данных и имя сущности не будут совпадать.
В этих случаях мы можем указать имя таблицы с помощью аннотации @Table :
@Entity @Table(name="STUDENT") public class Student { // fields, getters and setters }
Мы также можем упомянуть схему, используя элемент schema :
@Entity @Table(name="STUDENT", schema="SCHOOL") public class Student { // fields, getters and setters }
Имя схемы помогает отличить один набор таблиц от другого,
Если мы не используем аннотацию @Table , то имя сущности будет считаться именем таблицы.
2.4. Аннотация Колонки
Как и в аннотации @Table , мы можем использовать аннотацию @Column для упоминания деталей столбца в таблице.
Аннотация @Column содержит множество элементов, таких как name, length, nullable и unique .
@Entity @Table(name="STUDENT") public class Student { @Id @GeneratedValue(strategy=GenerationType.AUTO) private Long id; @Column(name="STUDENT_NAME", length=50, nullable=false, unique=false) private String name; // other fields, getters and setters }
Элемент name указывает имя столбца в таблице. Элемент length определяет его длину. Элемент nullable указывает, является ли столбец nullable или нет, а элемент unique указывает, является ли столбец уникальным.
Если мы не зададим эту аннотацию, то имя поля будет считаться именем столбца в таблице.
2.5. Переходная аннотация
Иногда мы можем захотеть сделать поле непостоянным. Для этого мы можем использовать аннотацию @Transient . Он указывает, что поле не будет сохраняться.
Например, мы можем вычислить возраст студента по дате его рождения.
Итак, давайте аннотируем поле age аннотацией @Transient :
@Entity @Table(name="STUDENT") public class Student { @Id @GeneratedValue(strategy=GenerationType.AUTO) private Long id; @Column(name="STUDENT_NAME", length=50, nullable=false) private String name; @Transient private Integer age; // other fields, getters and setters }
В результате поле age не будет сохранено в таблице.
2.6. Временная Аннотация
В некоторых случаях нам, возможно, придется сохранить временные значения в нашей таблице.
Для этого у нас есть аннотация @Temporal:
@Entity @Table(name="STUDENT") public class Student { @Id @GeneratedValue(strategy=GenerationType.AUTO) private Long id; @Column(name="STUDENT_NAME", length=50, nullable=false, unique=false) private String name; @Transient private Integer age; @Temporal(TemporalType.DATE) private Date birthDate; // other fields, getters and setters }
Однако с JPA 2.2 у нас также есть поддержка java.time.LocalDate, java.time.Местное время, java.time.LocalDateTime, java.time.OffsetTime и java.time.OffsetDateTime.
2.7. Перечисленная Аннотация
Иногда мы можем захотеть сохранить тип Java enum .
Мы можем использовать аннотацию @Enumerated , чтобы указать, следует ли сохранять enum по имени или порядковому номеру (по умолчанию).
public enum Gender { MALE, FEMALE }
@Entity @Table(name="STUDENT") public class Student { @Id @GeneratedValue(strategy=GenerationType.AUTO) private Long id; @Column(name="STUDENT_NAME", length=50, nullable=false, unique=false) private String name; @Transient private Integer age; @Temporal(TemporalType.DATE) private Date birthDate; @Enumerated(EnumType.STRING) private Gender gender; // other fields, getters and setters }
На самом деле, нам вообще не нужно указывать аннотацию @Enumerated , если мы собираемся сохранить Gender порядковым номером enum .
Однако, чтобы сохранить Gender by enum name, мы настроили аннотацию с помощью EnumType.СТРОКА.
3. Заключение
В этой статье мы узнали, что такое сущности JPA и как их создавать. Мы также узнали о различных аннотациях, которые могут быть использованы для дальнейшей настройки сущности.
Полный код этой статьи можно найти на Github .