Рубрики
Без рубрики

Определение сущностей JPA

Узнайте, как определять сущности и настраивать их с помощью Java Persistence API.

Автор оригинала: 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 .