1. Обзор
В этом уроке мы рассмотрим использование аннотации @EmbeddedId и метода ” findBy ” для запроса объекта JPA на основе составного ключа.
Следовательно, мы будем использовать @Embedded и @ |/Embeddable аннотации для представления составных ключей в сущностях JPA . Нам также необходимо использовать Spring JpaRepository для достижения нашей цели.
Мы сосредоточимся на запросе объектов по частичному первичному ключу.
2. Потребность в @Embeddable и @Embedded
В программном обеспечении мы сталкиваемся со многими случаями использования, когда нам нужен составной первичный ключ для определения записи в таблице. Составные первичные ключи-это ключи, которые используют более одного столбца для уникальной идентификации строки в таблице .
Мы представляем составной первичный ключ в данных Spring с помощью аннотации @Embeddable для класса. Этот ключ затем внедряется в соответствующий класс сущностей таблицы в качестве составного первичного ключа с помощью аннотации @EmbeddedId в поле типа @Embeddable .
3. Пример
Рассмотрим таблицу book , где запись book имеет составной первичный ключ, состоящий из author и name . Иногда мы можем захотеть найти книги по части первичного ключа. Например, пользователь может захотеть искать книги только по определенному автору . Мы узнаем, как это сделать с JPA.
Наше основное приложение будет состоять из @Embeddable BookID и @Entity Book с @EmbeddedId BookID.
3.1. @Встраиваемый
Давайте определим наш класс BookID в этом разделе. В author и name будет указан уникальный BookID — класс Сериализуемый и реализует оба равных и хэш-кода методов:
@Embeddable public class BookId implements Serializable { private String author; private String name; // standard getters and setters }
3.2. @Entity и @EmbeddedId
Наша Книга сущность имеет @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{ List findByIdName(String name); List findByIdAuthor(String author); }
Мы используем часть имен полей переменной id для получения наших методов запроса данных Spring. Следовательно, JPA интерпретирует запрос частичного первичного ключа как:
findByIdName -> directive "findBy" field "id.name" findByIdAuthor -> directive "findBy" field "id.author"
4. Заключение
JPA можно использовать для эффективного сопоставления составных ключей и запроса их с помощью производных запросов.
В этой статье мы увидели небольшой пример выполнения частичного поиска по полю идентификатора. Мы рассмотрели аннотацию @Embeddable для представления составного первичного ключа и аннотацию @EmbeddedId для вставки составного ключа в сущность.
Наконец, мы увидели, как использовать JpaRepository |/findBy производные методы для поиска с частичными полями идентификаторов.
Как всегда, пример кода для этого урока доступен на GitHub .