Перейти к основному содержимому

Spring JPA @Embedded и @EmbeddedId

· 3 мин. чтения

1. Обзор

В этом руководстве мы рассмотрим использование аннотации @EmbeddedId и метода « findBy » для запроса объекта JPA на основе составного ключа.

Следовательно , мы будем использовать аннотации @EmbeddeId и @Embeddable для представления составных ключей в объектах JPA . Нам также нужно использовать Spring JpaRepository для достижения нашей цели.

Мы сосредоточимся на запросе объектов по частичному первичному ключу.

2. Необходимость в @Embeddable и @EmbeddedId

В программном обеспечении мы сталкиваемся со многими случаями использования, когда нам нужен составной первичный ключ для определения записи в таблице. Составные первичные ключи — это ключи, которые используют более одного столбца для уникальной идентификации строки в таблице .

Мы представляем составной первичный ключ в Spring Data, используя аннотацию @Embeddable для класса. Затем этот ключ встраивается в соответствующий класс сущностей таблицы в качестве составного первичного ключа с помощью аннотации @EmbeddedId в поле типа @Embeddable .

3. Пример

Рассмотрим таблицу книг , где запись книги имеет составной первичный ключ, состоящий из автора и имени . Иногда нам может понадобиться найти книги по части первичного ключа. Например, пользователь может захотеть найти книги только определенного автора . Мы узнаем, как это сделать с помощью JPA.

Наше основное приложение будет состоять из @Embeddable BookId и @Entity Book с @EmbeddedId BookId.

3.1. @Встраиваемый

Давайте определим наш класс BookId в этом разделе. Автор и имя будут указывать уникальный BookId — класс Serializable и реализует методы equals и hashCode : ``

@Embeddable
public class BookId implements Serializable {

private String author;
private String name;

// standard getters and setters
}

3.2. @Entity и @EmbeddedId

Наша сущность Book имеет @EmbeddedId BookId и другие поля, связанные с книгой . BookId сообщает JPA, что сущность Book имеет составной ключ:

@Entity
public class Book {

@EmbeddedId
private BookId id;
private String genre;
private Integer price;

//standard getters and setters
}

3.3. Репозиторий JPA и именование методов

Давайте быстро определим наш интерфейс репозитория JPA, расширив JpaRepository сущностью Book , а также BookId :

@Repository
public interface BookRepository extends JpaRepository<Book, BookId> {

List<Book> findByIdName(String name);

List<Book> findByIdAuthor(String author);
}

Мы используем часть имен полей переменной id для получения наших методов запроса Spring Data. Следовательно, JPA интерпретирует частичный запрос первичного ключа как:

findByIdName -> directive "findBy" field "id.name"
findByIdAuthor -> directive "findBy" field "id.author"

4. Вывод

JPA можно использовать для эффективного сопоставления составных ключей и запроса их с помощью производных запросов.

В этой статье мы увидели небольшой пример запуска частичного поиска по полю id. Мы рассмотрели аннотацию @Embeddable для представления составного первичного ключа и аннотацию @EmbeddedId для вставки составного ключа в сущность.

Наконец, мы увидели, как использовать `` производные методы JpaRepository findBy для поиска с частичными полями идентификатора. ****

Как всегда, пример кода для этого руководства доступен на GitHub .